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 8a1db88..0000000
--- a/core/org.eclipse.ptp.core.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +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,
- org.eclipse.ptp.utils.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 3a46d05..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.remote.core.tests;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Vendor: %pluginProvider
-Require-Bundle: org.eclipse.core.runtime,
- org.junit,
- org.eclipse.ptp.remote.core;bundle-version="3.0.0",
- org.eclipse.ptp.remote.ui;bundle-version="3.0.0",
- com.jcraft.jsch;bundle-version="0.1.41",
- org.eclipse.core.filesystem;bundle-version="1.2.0",
- org.eclipse.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",
- org.eclipse.ptp.remotetools.environment.generichost;bundle-version="1.4.0"
-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 10fbdf6..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/FileStoreTests.java
+++ /dev/null
@@ -1,141 +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 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);
-
-		try {
-			fRemoteConnection = connMgr.newConnection(CONNECTION_NAME);
-		} catch (RemoteConnectionException e) {
-			fail(e.getLocalizedMessage());
-		}
-		assertNotNull(fRemoteConnection);
-		fRemoteConnection.setAddress(HOST);
-		fRemoteConnection.setUsername(USERNAME);
-		fRemoteConnection.setPassword(PASSWORD);
-
-		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 fbc530b..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/RemoteConnectionTests.java
+++ /dev/null
@@ -1,161 +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 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 = "greg"; //$NON-NLS-1$
-	private static final String 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);
-
-		try {
-			fRemoteConnection = connMgr.newConnection("test_connection"); //$NON-NLS-1$
-		} catch (RemoteConnectionException e) {
-			fail(e.getLocalizedMessage());
-		}
-		assertNotNull(fRemoteConnection);
-		fRemoteConnection.setAddress(HOST);
-		fRemoteConnection.setUsername(USERNAME);
-		fRemoteConnection.setPassword(PASSWORD);
-
-		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 24db69a..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/RemoteToolsTests.java
+++ /dev/null
@@ -1,219 +0,0 @@
-package org.eclipse.ptp.core.tests;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ptp.remote.remotetools.core.RemoteToolsServices;
-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.control.ITargetConfig;
-import org.eclipse.ptp.remotetools.environment.control.ITargetControl;
-import org.eclipse.ptp.remotetools.environment.core.TargetElement;
-import org.eclipse.ptp.remotetools.environment.core.TargetTypeElement;
-import org.eclipse.ptp.remotetools.environment.generichost.core.ConfigFactory;
-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 = "greg"; //$NON-NLS-1$
-	private static final String HOST = "localhost"; //$NON-NLS-1$
-
-	private ITargetControl fTargetControl;
-	private IRemoteExecutionManager fExecutionManager;
-	private IRemoteExecutionTools fExecutionTools;
-	private TargetTypeElement fTarget;
-	private TargetElement fElement;
-
-	public void testScriptExecute() {
-		for (int i = 0; i < 10; 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) {
-			}
-		}
-	}
-
-	public void testScriptIO() {
-
-		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;
-			int count = 0;
-			while ((line = br.readLine()) != null) {
-				System.out.println("read \"" + line + "\"");
-				count++;
-			}
-			assertTrue(count == 4);
-		} catch (IOException e) {
-			fail();
-		}
-		try {
-			p.waitFor();
-		} catch (InterruptedException e) {
-		}
-
-	}
-
-	public void testScriptCancel() {
-
-		IRemoteScript script = fExecutionTools.createScript();
-		script.setScript("while true; do sleep 1; done");
-		RemoteProcess p = null;
-		try {
-			p = fExecutionTools.executeProcess(script);
-		} catch (RemoteExecutionException e) {
-			fail(e.getLocalizedMessage());
-		} catch (RemoteConnectionException e) {
-			fail(e.getLocalizedMessage());
-		} catch (CancelException e) {
-			fail(e.getLocalizedMessage());
-		}
-		assertNotNull(p);
-		/*
-		 * Give script time to start
-		 */
-		try {
-			Thread.sleep(2000);
-		} catch (InterruptedException e1) {
-		}
-		p.destroy();
-		try {
-			p.waitFor();
-		} catch (InterruptedException e) {
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	@Override
-	protected void setUp() throws Exception {
-		ConfigFactory factory = new ConfigFactory();
-		ITargetConfig config = factory.createTargetConfig();
-		config.setConnectionAddress(HOST);
-		config.setLoginUsername(USERNAME);
-		config.setPasswordAuth(true);
-
-		fTarget = RemoteToolsServices.getTargetTypeElement();
-		String id = EnvironmentPlugin.getDefault().getEnvironmentUniqueID();
-		TargetElement element = new TargetElement(fTarget, HOST, factory.getAttributes(), id);
-		fTarget.addElement(element);
-		fTargetControl = 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.sync.rsync.core/.classpath b/rdt/org.eclipse.ptp.rdt.sync.rsync.core/.classpath
deleted file mode 100644
index 5e4c1fe..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/.project b/rdt/org.eclipse.ptp.rdt.sync.rsync.core/.project
deleted file mode 100644
index 86c8246..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rdt.sync.rsync.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/META-INF/MANIFEST.MF b/rdt/org.eclipse.ptp.rdt.sync.rsync.core/META-INF/MANIFEST.MF
deleted file mode 100644
index 1f9eca2..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.ptp.rdt.sync.rsync.core;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.ptp.rdt.sync.rsync.core.Activator
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.ptp.rdt.sync.core;bundle-version="1.0.0",
- org.eclipse.ptp.rdt.sync.ui;bundle-version="1.0.0",
- org.eclipse.ptp.remote.core,
- org.eclipse.ptp.remote.ui,
- org.eclipse.ptp.services.core
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.ptp.rdt.sync.rsync.core
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Import-Package: org.eclipse.ptp.rdt.core.serviceproviders
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/build.properties b/rdt/org.eclipse.ptp.rdt.sync.rsync.core/build.properties
deleted file mode 100644
index e9863e2..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/plugin.properties b/rdt/org.eclipse.ptp.rdt.sync.rsync.core/plugin.properties
deleted file mode 100644
index 4ea0c9e..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/plugin.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2011 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
-###############################################################################
-plugin.name = RDT RSync Core
-plugin.provider = Eclipse.org
-
-RSyncServiceProvider.name = RSync Synchronization Service
-
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/plugin.xml b/rdt/org.eclipse.ptp.rdt.sync.rsync.core/plugin.xml
deleted file mode 100644
index f3b886f..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/plugin.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.ptp.services.core.providers">
-      <provider
-            class="org.eclipse.ptp.rdt.sync.rsync.core.RSyncServiceProvider"
-            id="org.eclipse.ptp.rdt.sync.rsync.core.RSyncServiceProvider"
-            name="%RSyncServiceProvider.name"
-            serviceId="org.eclipse.ptp.rdt.sync.core.SyncService">
-      </provider>
-   </extension>
-
-</plugin>
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/src/org/eclipse/ptp/rdt/sync/rsync/core/Activator.java b/rdt/org.eclipse.ptp.rdt.sync.rsync.core/src/org/eclipse/ptp/rdt/sync/rsync/core/Activator.java
deleted file mode 100644
index a0b3ca8..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/src/org/eclipse/ptp/rdt/sync/rsync/core/Activator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.eclipse.ptp.rdt.sync.rsync.core;
-
-import org.eclipse.core.runtime.Plugin;
-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.sync.rsync.core"; //$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/rdt/org.eclipse.ptp.rdt.sync.rsync.core/src/org/eclipse/ptp/rdt/sync/rsync/core/RSyncServiceProvider.java b/rdt/org.eclipse.ptp.rdt.sync.rsync.core/src/org/eclipse/ptp/rdt/sync/rsync/core/RSyncServiceProvider.java
deleted file mode 100644
index 16c46e0..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/src/org/eclipse/ptp/rdt/sync/rsync/core/RSyncServiceProvider.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 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.sync.rsync.core;
-
-import java.util.EnumSet;
-
-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.IResourceDelta;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ptp.rdt.sync.core.SyncFlag;
-import org.eclipse.ptp.rdt.sync.core.serviceproviders.ISyncServiceProvider;
-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.ServiceProvider;
-
-public class RSyncServiceProvider extends ServiceProvider implements ISyncServiceProvider {
-	public static final String ID = "org.eclipse.ptp.rdt.sync.rsync.core.RSyncServiceProvider"; //$NON-NLS-1$
-
-	private static final String RSYNC_LOCATION = "location"; //$NON-NLS-1$
-
-	private static final String RSYNC_CONNECTION_NAME = "connectionName"; //$NON-NLS-1$
-	private static final String RSYNC_SERVICES_ID = "servicesId"; //$NON-NLS-1$
-	private static final String RSYNC_PROJECT_NAME = "projectName"; //$NON-NLS-1$
-	private IProject fProject = null;
-
-	private String fLocation = null;
-	private IRemoteConnection fConnection = null;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.sync.core.serviceproviders.ISyncServiceProvider#
-	 * synchronize(org.eclipse.core.resources.IResourceDelta,
-	 * org.eclipse.core.runtime.IProgressMonitor, boolean)
-	 */
-	public void synchronize(IResourceDelta delta, IProgressMonitor monitor, EnumSet<SyncFlag> syncFlags) throws CoreException {
-		switch (delta.getKind()) {
-		case IResourceDelta.ADDED:
-			System.out.println("ensureSync kind=ADDED");
-			break;
-		case IResourceDelta.REMOVED:
-			System.out.println("ensureSync kind=REMOVED");
-			break;
-		case IResourceDelta.CHANGED:
-			System.out.println("ensureSync kind=CHANGED");
-			break;
-		default:
-			System.out.println("ensureSync kind=OTHER");
-		}
-		for (IResourceDelta child : delta.getAffectedChildren()) {
-			IResource resource = child.getResource();
-			if (resource instanceof IProject) {
-				System.out.println("ensureSync project=" + child.getResource().getName());
-				synchronize(child, monitor, syncFlags);
-			} else if (resource instanceof IFolder) {
-				System.out.println("ensureSync folder=" + child.getResource().getName());
-				synchronize(child, monitor, syncFlags);
-			} else if (resource instanceof IFile) {
-				System.out.println("ensureSync file=" + child.getResource().getName());
-			}
-		}
-	}
-
-	/**
-	 * Get the remote directory that will be used for synchronization
-	 * 
-	 * @return path
-	 */
-	public String getLocation() {
-		if (fLocation == null) {
-			fLocation = getString(RSYNC_LOCATION, null);
-		}
-		return fLocation;
-	}
-
-	/**
-	 * Get the project to be synchronized
-	 * 
-	 * @return project
-	 */
-	public IProject getProject() {
-		if (fProject == null) {
-			String name = getString(RSYNC_PROJECT_NAME, null);
-			if (name != null) {
-				fProject = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
-			}
-		}
-		return fProject;
-	}
-
-	/**
-	 * Get the remote connection used for synchronization
-	 * 
-	 * @return remote connection
-	 */
-	public IRemoteConnection getRemoteConnection() {
-		if (fConnection == null) {
-			String name = getString(RSYNC_CONNECTION_NAME, null);
-			if (name != null) {
-				IRemoteServices services = getRemoteServices();
-				if (services != null) {
-					fConnection = services.getConnectionManager().getConnection(name);
-				}
-			}
-		}
-		return fConnection;
-	}
-
-	/**
-	 * Get the remote services used for the connection
-	 * 
-	 * @return remote services
-	 */
-	public IRemoteServices getRemoteServices() {
-		String id = getString(RSYNC_SERVICES_ID, null);
-		if (id != null) {
-			return PTPRemoteCorePlugin.getDefault().getRemoteServices(id);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.services.core.IServiceProvider#isConfigured()
-	 */
-	public boolean isConfigured() {
-		return getLocation() != null && getRemoteConnection() != null && getProject() != null;
-	}
-
-	/**
-	 * Set the remote directory that will be used for synchronization
-	 * 
-	 * @param location
-	 *            directory path
-	 */
-	public void setLocation(String location) {
-		fLocation = location;
-		putString(RSYNC_LOCATION, location);
-	}
-
-	/**
-	 * Set the project that will be synchronized
-	 * 
-	 * @param project
-	 *            project to synchronize
-	 */
-	public void setProject(IProject project) {
-		fProject = project;
-		putString(RSYNC_PROJECT_NAME, project.getName());
-	}
-
-	/**
-	 * set the remote connection used for synchronization
-	 * 
-	 * @param conn
-	 *            remote connection
-	 */
-	public void setRemoteConnection(IRemoteConnection conn) {
-		fConnection = conn;
-		putString(RSYNC_CONNECTION_NAME, conn.getName());
-	}
-
-	/**
-	 * Set the remote services used for the connection
-	 * 
-	 * @param services
-	 *            remote services
-	 */
-	public void setRemoteServices(IRemoteServices services) {
-		putString(RSYNC_SERVICES_ID, services.getId());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IRemoteExecutionServiceProvider#getConnection()
-	 */
-	public IRemoteConnection getConnection() {
-		return fConnection;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IRemoteExecutionServiceProvider#getConfigLocation()
-	 */
-	public String getConfigLocation() {
-		return fLocation;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IRemoteExecutionServiceProvider#setRemoteToolsConnection()
-	 */
-	public void setRemoteToolsConnection(IRemoteConnection connection) {
-		fConnection = connection;
-		putString(RSYNC_CONNECTION_NAME, connection.getName());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IRemoteExecutionServiceProvider#setConfigLocation()
-	 */
-	public void setConfigLocation(String configLocation) {
-		fLocation = configLocation;
-		putString(RSYNC_LOCATION, configLocation);
-	}
-}
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/.classpath b/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/.classpath
deleted file mode 100644
index 5e4c1fe..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/.project b/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/.project
deleted file mode 100644
index 63e5f21..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rdt.sync.rsync.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/META-INF/MANIFEST.MF b/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 05d7476..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,21 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.ptp.rdt.sync.rsync.ui;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.ptp.rdt.sync.rsync.ui.Activator
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.ptp.rdt.sync.core;bundle-version="1.0.0",
- org.eclipse.ptp.rdt.sync.ui;bundle-version="1.0.0",
- org.eclipse.ptp.remote.core,
- org.eclipse.ptp.remote.ui,
- org.eclipse.ptp.rdt.sync.rsync.core,
- org.eclipse.ptp.services.core,
- org.eclipse.cdt.ui;bundle-version="5.3.0"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Import-Package: org.eclipse.ptp.rdt.core.serviceproviders
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/build.properties b/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/build.properties
deleted file mode 100644
index e9863e2..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/plugin.properties b/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/plugin.properties
deleted file mode 100644
index b2409a7..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2011 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
-###############################################################################
-plugin.name = RDT RSync UI
-plugin.provider = Eclipse.org
-
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/plugin.xml b/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/plugin.xml
deleted file mode 100644
index c036cdb..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/plugin.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-<!-- the rsync provider is currently not functional - thus we don't register the participant
-   <extension
-         point="org.eclipse.ptp.rdt.sync.ui.synchronizeParticipants">
-      <synchronizeParticipant
-            class="org.eclipse.ptp.rdt.sync.rsync.ui.RSyncParticipant"
-            id="org.eclipse.ptp.rdt.sync.rsync.ui.rsyncParticipant"
-            name="Rsync">
-      </synchronizeParticipant>
-   </extension>
--->
-</plugin>
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/src/org/eclipse/ptp/rdt/sync/rsync/ui/Activator.java b/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/src/org/eclipse/ptp/rdt/sync/rsync/ui/Activator.java
deleted file mode 100644
index 3d9a824..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/src/org/eclipse/ptp/rdt/sync/rsync/ui/Activator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.eclipse.ptp.rdt.sync.rsync.ui;
-
-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.rdt.sync.rsync.ui"; //$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/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/src/org/eclipse/ptp/rdt/sync/rsync/ui/RSyncParticipant.java b/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/src/org/eclipse/ptp/rdt/sync/rsync/ui/RSyncParticipant.java
deleted file mode 100644
index d523e01..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/src/org/eclipse/ptp/rdt/sync/rsync/ui/RSyncParticipant.java
+++ /dev/null
@@ -1,645 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 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.sync.rsync.ui;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.cdt.internal.ui.CPluginImages;
-import org.eclipse.cdt.ui.newui.CDTPrefUtil;
-import org.eclipse.cdt.ui.newui.PageLayout;
-import org.eclipse.cdt.ui.newui.UIMessages;
-import org.eclipse.cdt.ui.wizards.CNewWizard;
-import org.eclipse.cdt.ui.wizards.CWizardHandler;
-import org.eclipse.cdt.ui.wizards.EntryDescriptor;
-import org.eclipse.cdt.ui.wizards.IWizardItemsListListener;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.osgi.util.TextProcessor;
-import org.eclipse.ptp.rdt.sync.core.serviceproviders.ISyncServiceProvider;
-import org.eclipse.ptp.rdt.sync.core.services.IRemoteSyncServiceConstants;
-import org.eclipse.ptp.rdt.sync.rsync.core.RSyncServiceProvider;
-import org.eclipse.ptp.rdt.sync.rsync.ui.messages.Messages;
-import org.eclipse.ptp.rdt.sync.ui.ISynchronizeParticipant;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.IRemoteFileManager;
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.ui.IRemoteUIConnectionManager;
-import org.eclipse.ptp.remote.ui.IRemoteUIConstants;
-import org.eclipse.ptp.remote.ui.IRemoteUIFileManager;
-import org.eclipse.ptp.remote.ui.IRemoteUIServices;
-import org.eclipse.ptp.remote.ui.PTPRemoteUIPlugin;
-import org.eclipse.ptp.services.core.IService;
-import org.eclipse.ptp.services.core.ServiceModelManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-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.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * Launches a dialog that configures a remote sync target with OK and Cancel
- * buttons. Also has a text field to allow the name of the configuration to be
- * changed.
- */
-public class RSyncParticipant implements ISynchronizeParticipant {
-	private static final String FILE_SCHEME = "file"; //$NON-NLS-1$
-
-	// private IServiceConfiguration fConfig;
-	private IRemoteConnection fSelectedConnection;
-	private IRemoteServices fSelectedProvider;
-	// private final IRunnableContext fContext;
-	private final String fProjectName = ""; //$NON-NLS-1$
-
-	private final Map<Integer, IRemoteServices> fComboIndexToRemoteServicesProviderMap = new HashMap<Integer, IRemoteServices>();
-	private final Map<Integer, IRemoteConnection> fComboIndexToRemoteConnectionMap = new HashMap<Integer, IRemoteConnection>();
-
-	private Control fDialogControl;
-	private Point fDialogSize;
-	private Text fNameText;
-	private Button fBrowseButton;
-	private Button fNewConnectionButton;
-	private Combo fProviderCombo;
-	private Combo fConnectionCombo;
-	private Text fLocationText;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rdt.sync.ui.ISynchronizeParticipant#createConfigurationArea
-	 * (org.eclipse.swt.widgets.Composite,
-	 * org.eclipse.jface.operation.IRunnableContext)
-	 */
-	public void createConfigurationArea(Composite parent, IRunnableContext context) {
-		final Composite configArea = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 3;
-		configArea.setLayout(layout);
-		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-		configArea.setLayoutData(gd);
-
-		// Label for "Provider:"
-		Label providerLabel = new Label(configArea, SWT.LEFT);
-		providerLabel.setText(Messages.RSyncParticipant_remoteProvider);
-
-		// combo for providers
-		fProviderCombo = new Combo(configArea, SWT.DROP_DOWN | SWT.READ_ONLY);
-		gd = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
-		gd.horizontalSpan = 2;
-		fProviderCombo.setLayoutData(gd);
-		fProviderCombo.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				handleServicesSelected();
-			}
-		});
-
-		// attempt to restore settings from saved state
-		// IRemoteServices providerSelected = fProvider.getRemoteServices();
-
-		// populate the combo with a list of providers
-		IRemoteServices[] providers = PTPRemoteUIPlugin.getDefault().getRemoteServices(context);
-		int toSelect = 0;
-
-		for (int k = 0; k < providers.length; k++) {
-			fProviderCombo.add(providers[k].getName(), k);
-			fComboIndexToRemoteServicesProviderMap.put(k, providers[k]);
-		}
-
-		// set selected host to be the first one if we're not restoring from
-		// settings
-		fProviderCombo.select(toSelect);
-		fSelectedProvider = fComboIndexToRemoteServicesProviderMap.get(toSelect);
-
-		// connection combo
-		// Label for "Connection:"
-		Label connectionLabel = new Label(configArea, SWT.LEFT);
-		connectionLabel.setText(Messages.RSyncParticipant_connection);
-
-		// combo for providers
-		fConnectionCombo = new Combo(configArea, SWT.DROP_DOWN | SWT.READ_ONLY);
-		// set layout to grab horizontal space
-		fConnectionCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-		fConnectionCombo.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				handleConnectionSelected();
-			}
-		});
-
-		// populate the combo with a list of providers
-		populateConnectionCombo(fConnectionCombo);
-
-		// new connection button
-		fNewConnectionButton = new Button(configArea, SWT.PUSH);
-		fNewConnectionButton.setText(Messages.RSyncParticipant_new);
-		updateNewConnectionButtonEnabled(fNewConnectionButton);
-		fNewConnectionButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				IRemoteUIConnectionManager connectionManager = getUIConnectionManager();
-				if (connectionManager != null) {
-					connectionManager.newConnection(fNewConnectionButton.getShell());
-				}
-				// refresh list of connections
-				populateConnectionCombo(fConnectionCombo);
-			}
-		});
-
-		Label locationLabel = new Label(configArea, SWT.LEFT);
-		locationLabel.setText(Messages.RSyncParticipant_location);
-
-		fLocationText = new Text(configArea, SWT.SINGLE | SWT.BORDER);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		gd.grabExcessHorizontalSpace = true;
-		gd.widthHint = 250;
-		fLocationText.setLayoutData(gd);
-		fLocationText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				// MBSCustomPageManager.addPageProperty(REMOTE_SYNC_WIZARD_PAGE_ID,
-				// PATH_PROPERTY, fLocationText.getText());
-			}
-		});
-
-		// new connection button
-		fBrowseButton = new Button(configArea, SWT.PUSH);
-		fBrowseButton.setText(Messages.RSyncParticipant_browse);
-		fBrowseButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				if (fSelectedConnection != null) {
-					checkConnection();
-					if (fSelectedConnection.isOpen()) {
-						IRemoteUIServices remoteUIServices = PTPRemoteUIPlugin.getDefault().getRemoteUIServices(fSelectedProvider);
-						if (remoteUIServices != null) {
-							IRemoteUIFileManager fileMgr = remoteUIServices.getUIFileManager();
-							if (fileMgr != null) {
-								fileMgr.setConnection(fSelectedConnection);
-								String correctPath = fLocationText.getText();
-								String selectedPath = fileMgr.browseDirectory(
-										fLocationText.getShell(),
-										"Project Location (" + fSelectedConnection.getName() + ")", correctPath, IRemoteUIConstants.NONE); //$NON-NLS-1$ //$NON-NLS-2$
-								if (selectedPath != null) {
-									fLocationText.setText(selectedPath);
-								}
-							}
-						}
-					}
-				}
-			}
-		});
-
-		createDynamicGroup(configArea);
-		// switchTo(updateData(tree, right, show_sup, RemoteMainWizardPage.this,
-		// getWizard()), getDescriptor(tree));
-	}
-
-	private Tree tree;
-	private Composite right;
-	private Button show_sup;
-	private Label right_label;
-	public CWizardHandler h_selected = null;
-	private Label categorySelectedLabel;
-	public static final String DESC = "EntryDescriptor"; //$NON-NLS-1$ 
-	private static final Image IMG_CATEGORY = CPluginImages.get(CPluginImages.IMG_OBJS_SEARCHFOLDER);
-	private static final Image IMG_ITEM = CPluginImages.get(CPluginImages.IMG_OBJS_VARIABLE);
-	private static final String EXTENSION_POINT_ID = "org.eclipse.cdt.ui.CDTWizard"; //$NON-NLS-1$
-	private static final String ELEMENT_NAME = "wizard"; //$NON-NLS-1$
-	private static final String CLASS_NAME = "class"; //$NON-NLS-1$
-
-	private void createDynamicGroup(Composite parent) {
-		Composite c = new Composite(parent, SWT.NONE);
-		c.setLayoutData(new GridData(GridData.FILL_BOTH));
-		c.setLayout(new GridLayout(2, true));
-
-		Label l1 = new Label(c, SWT.NONE);
-		l1.setText("Project type:");
-		l1.setFont(parent.getFont());
-		l1.setLayoutData(new GridData(GridData.BEGINNING));
-
-		right_label = new Label(c, SWT.NONE);
-		right_label.setFont(parent.getFont());
-		right_label.setLayoutData(new GridData(GridData.BEGINNING));
-
-		tree = new Tree(c, SWT.SINGLE | SWT.BORDER);
-		tree.setLayoutData(new GridData(GridData.FILL_BOTH));
-		tree.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				TreeItem[] tis = tree.getSelection();
-				if (tis == null || tis.length == 0) {
-					return;
-				}
-				switchTo((CWizardHandler) tis[0].getData(), (EntryDescriptor) tis[0].getData(DESC));
-				// setPageComplete(validatePage());
-			}
-		});
-		tree.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-			@Override
-			public void getName(AccessibleEvent e) {
-				for (int i = 0; i < tree.getItemCount(); i++) {
-					if (tree.getItem(i).getText().compareTo(e.result) == 0) {
-						return;
-					}
-				}
-				e.result = "Project type:";
-			}
-		});
-		right = new Composite(c, SWT.NONE);
-		right.setLayoutData(new GridData(GridData.FILL_BOTH));
-		right.setLayout(new PageLayout());
-
-		show_sup = new Button(c, SWT.CHECK);
-		show_sup.setText(UIMessages.getString("CMainWizardPage.1")); //$NON-NLS-1$
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		show_sup.setLayoutData(gd);
-		show_sup.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				if (h_selected != null) {
-					h_selected.setSupportedOnly(show_sup.getSelection());
-				}
-				// switchTo(updateData(tree, right, show_sup,
-				// RemoteMainWizardPage.this, getWizard()),
-				// getDescriptor(tree));
-			}
-		});
-
-		// restore settings from preferences
-		show_sup.setSelection(!CDTPrefUtil.getBool(CDTPrefUtil.KEY_NOSUPP));
-	}
-
-	private void switchTo(CWizardHandler h, EntryDescriptor ed) {
-		if (h == null) {
-			h = ed.getHandler();
-		}
-		if (ed.isCategory()) {
-			h = null;
-		}
-		try {
-			if (h != null) {
-				h.initialize(ed);
-			}
-		} catch (CoreException e) {
-			h = null;
-		}
-		if (h_selected != null) {
-			h_selected.handleUnSelection();
-		}
-		h_selected = h;
-		if (h == null) {
-			if (ed.isCategory()) {
-				if (categorySelectedLabel == null) {
-					categorySelectedLabel = new Label(right, SWT.WRAP);
-					categorySelectedLabel
-							.setText("Project category is selected. Expand the category and select a concrete project type.");
-					right.layout();
-				}
-				categorySelectedLabel.setVisible(true);
-			}
-			return;
-		}
-		right_label.setText(h_selected.getHeader());
-		if (categorySelectedLabel != null) {
-			categorySelectedLabel.setVisible(false);
-		}
-		h_selected.handleSelection();
-		h_selected.setSupportedOnly(show_sup.getSelection());
-	}
-
-	public static CWizardHandler updateData(Tree tree, Composite right, Button show_sup, IWizardItemsListListener ls, IWizard wizard) {
-		// remember selected item
-		TreeItem[] sel = tree.getSelection();
-		String savedStr = (sel.length > 0) ? sel[0].getText() : null;
-
-		tree.removeAll();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(EXTENSION_POINT_ID);
-		if (extensionPoint == null) {
-			return null;
-		}
-		IExtension[] extensions = extensionPoint.getExtensions();
-		if (extensions == null) {
-			return null;
-		}
-
-		List<EntryDescriptor> items = new ArrayList<EntryDescriptor>();
-		for (int i = 0; i < extensions.length; ++i) {
-			IConfigurationElement[] elements = extensions[i].getConfigurationElements();
-			for (IConfigurationElement element : elements) {
-				if (element.getName().equals(ELEMENT_NAME)) {
-					CNewWizard w = null;
-					try {
-						w = (CNewWizard) element.createExecutableExtension(CLASS_NAME);
-					} catch (CoreException e) {
-						System.out.println(UIMessages.getString("CMainWizardPage.5") + e.getLocalizedMessage()); //$NON-NLS-1$
-						return null;
-					}
-					if (w == null) {
-						return null;
-					}
-					w.setDependentControl(right, ls);
-					for (EntryDescriptor ed : w.createItems(show_sup.getSelection(), wizard)) {
-						items.add(ed);
-					}
-				}
-			}
-		}
-		// If there is a EntryDescriptor which is default for category, make
-		// sure it
-		// is in the front of the list.
-		for (int i = 0; i < items.size(); ++i) {
-			EntryDescriptor ed = items.get(i);
-			if (ed.isDefaultForCategory()) {
-				items.remove(i);
-				items.add(0, ed);
-				break;
-			}
-		}
-
-		// bug # 211935 : allow items filtering.
-		if (ls != null) {
-			items = ls.filterItems(items);
-		}
-		addItemsToTree(tree, items);
-
-		if (tree.getItemCount() > 0) {
-			TreeItem target = null;
-			// try to search item which was selected before
-			if (savedStr != null) {
-				TreeItem[] all = tree.getItems();
-				for (TreeItem element : all) {
-					if (savedStr.equals(element.getText())) {
-						target = element;
-						break;
-					}
-				}
-			}
-			if (target == null) {
-				target = tree.getItem(0);
-				if (target.getItemCount() != 0) {
-					target = target.getItem(0);
-				}
-			}
-			tree.setSelection(target);
-			return (CWizardHandler) target.getData();
-		}
-		return null;
-	}
-
-	private static void addItemsToTree(Tree tree, List<EntryDescriptor> items) {
-		// Sorting is disabled because of users requests
-		// Collections.sort(items, CDTListComparator.getInstance());
-
-		ArrayList<TreeItem> placedTreeItemsList = new ArrayList<TreeItem>(items.size());
-		ArrayList<EntryDescriptor> placedEntryDescriptorsList = new ArrayList<EntryDescriptor>(items.size());
-		for (EntryDescriptor wd : items) {
-			if (wd.getParentId() == null) {
-				wd.setPath(wd.getId());
-				TreeItem ti = new TreeItem(tree, SWT.NONE);
-				ti.setText(TextProcessor.process(wd.getName()));
-				ti.setData(wd.getHandler());
-				ti.setData(DESC, wd);
-				ti.setImage(calcImage(wd));
-				placedTreeItemsList.add(ti);
-				placedEntryDescriptorsList.add(wd);
-			}
-		}
-		while (true) {
-			boolean found = false;
-			Iterator<EntryDescriptor> it2 = items.iterator();
-			while (it2.hasNext()) {
-				EntryDescriptor wd1 = it2.next();
-				if (wd1.getParentId() == null) {
-					continue;
-				}
-				for (int i = 0; i < placedEntryDescriptorsList.size(); i++) {
-					EntryDescriptor wd2 = placedEntryDescriptorsList.get(i);
-					if (wd2.getId().equals(wd1.getParentId())) {
-						found = true;
-						wd1.setParentId(null);
-						CWizardHandler h = wd2.getHandler();
-						/*
-						 * If neither wd1 itself, nor its parent (wd2) have a
-						 * handler associated with them, and the item is not a
-						 * category, then skip it. If it's category, then it's
-						 * possible that children will have a handler associated
-						 * with them.
-						 */
-						if (h == null && wd1.getHandler() == null && !wd1.isCategory()) {
-							break;
-						}
-
-						wd1.setPath(wd2.getPath() + "/" + wd1.getId()); //$NON-NLS-1$
-						wd1.setParent(wd2);
-						if (h != null) {
-							if (wd1.getHandler() == null && !wd1.isCategory()) {
-								wd1.setHandler((CWizardHandler) h.clone());
-							}
-							if (!h.isApplicable(wd1)) {
-								break;
-							}
-						}
-
-						TreeItem p = placedTreeItemsList.get(i);
-						TreeItem ti = new TreeItem(p, SWT.NONE);
-						ti.setText(wd1.getName());
-						ti.setData(wd1.getHandler());
-						ti.setData(DESC, wd1);
-						ti.setImage(calcImage(wd1));
-						placedTreeItemsList.add(ti);
-						placedEntryDescriptorsList.add(wd1);
-						break;
-					}
-				}
-			}
-			// repeat iterations until all items are placed.
-			if (!found) {
-				break;
-			}
-		}
-		// orphan elements (with not-existing parentId) are ignored
-	}
-
-	private static Image calcImage(EntryDescriptor ed) {
-		if (ed.getImage() != null) {
-			return ed.getImage();
-		}
-		if (ed.isCategory()) {
-			return IMG_CATEGORY;
-		}
-		return IMG_ITEM;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rdt.sync.ui.ISynchronizeParticipant#getProvider(org.eclipse
-	 * .core.resources.IProject)
-	 */
-	public ISyncServiceProvider getProvider(IProject project) {
-		ServiceModelManager smm = ServiceModelManager.getInstance();
-		IService syncService = smm.getService(IRemoteSyncServiceConstants.SERVICE_SYNC);
-		RSyncServiceProvider provider = (RSyncServiceProvider) smm.getServiceProvider(syncService
-				.getProviderDescriptor(RSyncServiceProvider.ID));
-		provider.setLocation(fLocationText.getText());
-		provider.setRemoteConnection(fSelectedConnection);
-		provider.setRemoteServices(fSelectedProvider);
-		provider.setProject(project);
-		return provider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rdt.sync.ui.ISynchronizeParticipant#isConfigComplete()
-	 */
-	public boolean isConfigComplete() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/**
-	 * Attempt to open a connection.
-	 */
-	private void checkConnection() {
-		IRemoteUIConnectionManager mgr = getUIConnectionManager();
-		if (mgr != null) {
-			mgr.openConnectionWithProgress(fConnectionCombo.getShell(), null, fSelectedConnection);
-		}
-	}
-
-	/**
-	 * Return the path we are going to display. If it is a file URI then remove
-	 * the file prefix.
-	 * 
-	 * Only do this if the connection is open. Otherwise we will attempt to
-	 * connect to the first machine in the list, which is annoying.
-	 * 
-	 * @return String
-	 */
-	private String getDefaultPathDisplayString() {
-		String projectName = ""; //$NON-NLS-1$
-		// IWizardPage page = getWizard().getStartingPage();
-		// if (page instanceof CDTMainWizardPage) {
-		// projectName = ((CDTMainWizardPage) page).getProjectName();
-		// }
-		if (fSelectedConnection != null && fSelectedConnection.isOpen()) {
-			IRemoteFileManager fileMgr = fSelectedProvider.getFileManager(fSelectedConnection);
-			URI defaultURI = fileMgr.toURI(fSelectedConnection.getWorkingDirectory());
-
-			// Handle files specially. Assume a file if there is no project to
-			// query
-			if (defaultURI != null && defaultURI.getScheme().equals(FILE_SCHEME)) {
-				return Platform.getLocation().append(fProjectName).toOSString();
-			}
-			if (defaultURI == null) {
-				return ""; //$NON-NLS-1$
-			}
-			return new Path(defaultURI.getPath()).append(fProjectName).toOSString();
-		}
-		return ""; //$NON-NLS-1$
-	}
-	
-	/** 
-	 * @see ISynchronizeParticipant#getErrorMessage()
-	 */
-	public String getErrorMessage() {
-		return null;
-	}
-
-	/**
-	 * @return
-	 */
-	private IRemoteUIConnectionManager getUIConnectionManager() {
-		IRemoteUIConnectionManager connectionManager = PTPRemoteUIPlugin.getDefault().getRemoteUIServices(fSelectedProvider)
-				.getUIConnectionManager();
-		return connectionManager;
-	}
-
-	/**
-	 * Handle new connection selected
-	 */
-	private void handleConnectionSelected() {
-		int selectionIndex = fConnectionCombo.getSelectionIndex();
-		fSelectedConnection = fComboIndexToRemoteConnectionMap.get(selectionIndex);
-		updateNewConnectionButtonEnabled(fNewConnectionButton);
-		fLocationText.setText(getDefaultPathDisplayString());
-	}
-
-	/**
-	 * Handle new remote services selected
-	 */
-	private void handleServicesSelected() {
-		int selectionIndex = fProviderCombo.getSelectionIndex();
-		fSelectedProvider = fComboIndexToRemoteServicesProviderMap.get(selectionIndex);
-		populateConnectionCombo(fConnectionCombo);
-		updateNewConnectionButtonEnabled(fNewConnectionButton);
-		handleConnectionSelected();
-	}
-
-	/**
-	 * @param connectionCombo
-	 */
-	private void populateConnectionCombo(final Combo connectionCombo) {
-		connectionCombo.removeAll();
-
-		IRemoteConnection[] connections = fSelectedProvider.getConnectionManager().getConnections();
-
-		for (int k = 0; k < connections.length; k++) {
-			connectionCombo.add(connections[k].getName(), k);
-			fComboIndexToRemoteConnectionMap.put(k, connections[k]);
-		}
-
-		connectionCombo.select(0);
-		fSelectedConnection = fComboIndexToRemoteConnectionMap.get(0);
-	}
-
-	/**
-	 * @param button
-	 */
-	private void updateNewConnectionButtonEnabled(Button button) {
-		IRemoteUIConnectionManager connectionManager = getUIConnectionManager();
-		button.setEnabled(connectionManager != null);
-	}
-
-
-
-}
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/src/org/eclipse/ptp/rdt/sync/rsync/ui/messages/Messages.java b/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/src/org/eclipse/ptp/rdt/sync/rsync/ui/messages/Messages.java
deleted file mode 100644
index f0a3467..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/src/org/eclipse/ptp/rdt/sync/rsync/ui/messages/Messages.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 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.sync.rsync.ui.messages;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rdt.sync.rsync.ui.messages.messages"; //$NON-NLS-1$
-	public static String RSyncParticipant_browse;
-	public static String RSyncParticipant_connection;
-	public static String RSyncParticipant_location;
-	public static String RSyncParticipant_new;
-	public static String RSyncParticipant_remoteProvider;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/src/org/eclipse/ptp/rdt/sync/rsync/ui/messages/messages.properties b/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/src/org/eclipse/ptp/rdt/sync/rsync/ui/messages/messages.properties
deleted file mode 100644
index 219e52a..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/src/org/eclipse/ptp/rdt/sync/rsync/ui/messages/messages.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-RSyncParticipant_browse=Browse...
-RSyncParticipant_connection=Connection:
-RSyncParticipant_location=Location:
-RSyncParticipant_new=New...
-RSyncParticipant_remoteProvider=Remote Provider:
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.license-feature/.project b/releng/org.eclipse.ptp.license-feature/.project
deleted file mode 100644
index eb2a0a4..0000000
--- a/releng/org.eclipse.ptp.license-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.license-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.license-feature/build.properties b/releng/org.eclipse.ptp.license-feature/build.properties
deleted file mode 100644
index a3746ff..0000000
--- a/releng/org.eclipse.ptp.license-feature/build.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-#  Copyright (c) 2011 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,license.html,epl-v10.html,feature.properties,eclipse_update_120.jpg
\ No newline at end of file
diff --git a/releng/org.eclipse.ptp.license-feature/eclipse_update_120.jpg b/releng/org.eclipse.ptp.license-feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/releng/org.eclipse.ptp.license-feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/releng/org.eclipse.ptp.license-feature/epl-v10.html b/releng/org.eclipse.ptp.license-feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/releng/org.eclipse.ptp.license-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.license-feature/feature.properties b/releng/org.eclipse.ptp.license-feature/feature.properties
deleted file mode 100644
index 1892cee..0000000
--- a/releng/org.eclipse.ptp.license-feature/feature.properties
+++ /dev/null
@@ -1,141 +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
-###############################################################################
-
-# "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\
-February 1, 2011\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\
-       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\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
diff --git a/releng/org.eclipse.ptp.license-feature/feature.xml b/releng/org.eclipse.ptp.license-feature/feature.xml
deleted file mode 100644
index 529053e..0000000
--- a/releng/org.eclipse.ptp.license-feature/feature.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.ptp.license"
-      version="1.0.0.qualifier"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-</feature>
diff --git a/releng/org.eclipse.ptp.license-feature/license.html b/releng/org.eclipse.ptp.license-feature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/releng/org.eclipse.ptp.license-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 8381dc1..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/ptp' />
-		</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 40ec39e..0000000
--- a/releng/org.eclipse.ptp.releng/build.sh
+++ /dev/null
@@ -1,35 +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
-JVM_1_5=/shared/common/jdk-1.5.0_16
-export PATH=$JVM_1_5/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 /cvsroot/eclipse checkout -r v20110223 org.eclipse.releng.basebuilder
-cd ..
-
-# Let's go!
-java -jar tools/org.eclipse.releng.basebuilder/plugins/org.eclipse.equinox.launcher.jar \
-	-Djvm1.5=$JVM_1_5/bin/java \
-	-ws gtk -arch x86_64 -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 f80163f..0000000
--- a/releng/org.eclipse.ptp.releng/build.xml
+++ /dev/null
@@ -1,1127 +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,update,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="indigo"/>
-		<!-- Update for new PTP branch -->
-		<property name="ptpBranchVersion" value="5.0.0"/>
-		<property name="photranBranchVersion" value="7.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/S-3.7RC2-201105191138/eclipse-SDK-3.7RC2-linux-gtk.tar.gz"/>
-		<!-- Update for new CDT version -->
-		<property name="cdtDist" value="/home/data/httpd/download.eclipse.org/tools/cdt/builds/8.0.0/I.I201105201622/cdt-master-8.0.0-I201105201622.zip"/>
-		<!-- Update for new RSE version -->
-		<property name="rseDist" value="/home/data/httpd/download.eclipse.org/dsdp/tm/downloads/drops/S-3.3M4-201012140730/RSE-SDK-3.3M4.zip"/>
-		<!-- Update for new Mylyn version -->
-		<property name="mylynDist" value="/home/data/httpd/download.eclipse.org/tools/mylyn/update/mylyn-3.4.3-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/data/httpd/download.eclipse.org/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="proxyFile" value="ptp-proxy-${ptpBranchVersion}-${buildId}.zip"/>
-		<property name="eclipseTest" value="org.eclipse.test_3.2.0"/>
-		<property name="mailto" value="g.watson@computer.org"/>
-		<property name="eclipseRoot" value=":pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse"/>
-		<property name="baseos" value="${osgi.os}"/>
-		<property name="basews" value="${osgi.ws}"/>
-		<property name="basearch" value="${osgi.arch}"/>
-		<property name="ptpTagBranch" value=""/>
-		<property name="photranTagBranch" value=""/>
-		<property name="tagname" value="v${timestamp}"/>
-		<property name="testReports" value="${zipsdir}/testReports"/>
-		<property name="junit-report-output" value="${testReports}"/>
-		<property name="jvm1.5" value="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>
-		<copy file="buildindex.html" tofile="${zipsdir}/index.html"/>
-		<replace file="${zipsdir}/index.html">
-			<replacefilter token="@eclipseRelease@" value="${eclipseRelease}"/>
-			<replacefilter token="@branchVersion@" value="${ptpBranchVersion}"/>
-			<replacefilter token="@buildId@" value="${buildId}"/>
-		</replace>
-		<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="@ptpBranchVersion@" value="${ptpBranchVersion}"/>
-			<replacefilter token="@photranBranchVersion@" value="${photranBranchVersion}"/>
-			<replacefilter token="@timeStamp@" value="${timestamp}"/>
-		</replace>
-		<copy file="pack.properties" todir="${buildDirectory}/site/eclipse"/>
-
-		<!-- for some reason Orbit bundles aren't getting picked up-->		
-		<copy file="${buildDirectory}/plugins/org.eclipse.jgit_0.12.1.jar"
-			todir="${buildDirectory}/site/eclipse/plugins"/>
-		<copy file="${buildDirectory}/plugins/javax.xml_1.3.4.v201005080400.jar"
-			todir="${buildDirectory}/site/eclipse/plugins"/>
-		<copy file="${buildDirectory}/plugins/javax.xml.stream_1.0.1.v201004272200.jar"
-			todir="${buildDirectory}/site/eclipse/plugins"/>
-		<copy file="${buildDirectory}/plugins/javax.xml.bind_2.1.9.v201005080401.jar"
-			todir="${buildDirectory}/site/eclipse/plugins"/>
-		<copy file="${buildDirectory}/plugins/com.sun.xml.bind_2.1.9.v200905260854.jar"
-			todir="${buildDirectory}/site/eclipse/plugins"/>
-
-		<!-- 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"/>
-		
-		<!-- generate proxy zip -->
-		<copy todir="${buildDirectory}/proxy/org.eclipse.ptp.aix.ppc_${ptpBranchVersion}.${timestamp}">
-			<fileset dir="${buildDirectory}/plugins/org.eclipse.ptp.aix.ppc"/>
-		</copy>
-		<copy todir="${buildDirectory}/proxy/org.eclipse.ptp.linux.ppc_${ptpBranchVersion}.${timestamp}">
-			<fileset dir="${buildDirectory}/plugins/org.eclipse.ptp.linux.ppc"/>
-		</copy>
-		<copy todir="${buildDirectory}/proxy/org.eclipse.ptp.linux.x86_${ptpBranchVersion}.${timestamp}">
-			<fileset dir="${buildDirectory}/plugins/org.eclipse.ptp.linux.x86"/>
-		</copy>
-		<copy todir="${buildDirectory}/proxy/org.eclipse.ptp.linux.x86_64_${ptpBranchVersion}.${timestamp}">
-			<fileset dir="${buildDirectory}/plugins/org.eclipse.ptp.linux.x86_64"/>
-		</copy>
-		<copy todir="${buildDirectory}/proxy/org.eclipse.ptp.macosx.ppc_${ptpBranchVersion}.${timestamp}">
-			<fileset dir="${buildDirectory}/plugins/org.eclipse.ptp.macosx.ppc"/>
-		</copy>
-		<copy todir="${buildDirectory}/proxy/org.eclipse.ptp.macosx.x86_${ptpBranchVersion}.${timestamp}">
-			<fileset dir="${buildDirectory}/plugins/org.eclipse.ptp.macosx.x86"/>
-		</copy>
-		<copy todir="${buildDirectory}/proxy/org.eclipse.ptp.debug.sdm_${ptpBranchVersion}.${timestamp}">
-			<fileset dir="${buildDirectory}/plugins/org.eclipse.ptp.debug.sdm"/>
-		</copy>
-		<copy todir="${buildDirectory}/proxy/org.eclipse.ptp.proxy_${ptpBranchVersion}.${timestamp}">
-			<fileset dir="${buildDirectory}/plugins/org.eclipse.ptp.proxy"/>
-		</copy>
-		<copy todir="${buildDirectory}/proxy/org.eclipse.ptp.utils_${ptpBranchVersion}.${timestamp}">
-			<fileset dir="${buildDirectory}/plugins/org.eclipse.ptp.utils"/>
-		</copy>
-		<copy todir="${buildDirectory}/proxy/org.eclipse.ptp.rm.ibm.ll.proxy_${ptpBranchVersion}.${timestamp}">
-			<fileset dir="${buildDirectory}/plugins/org.eclipse.ptp.rm.ibm.ll.proxy"/>
-		</copy>
-		<copy todir="${buildDirectory}/proxy/org.eclipse.ptp.rm.ibm.pe.proxy_${ptpBranchVersion}.${timestamp}">
-			<fileset dir="${buildDirectory}/plugins/org.eclipse.ptp.rm.ibm.pe.proxy"/>
-		</copy>
-		<copy todir="${buildDirectory}/proxy/org.eclipse.ptp.rm.slurm.proxy_${ptpBranchVersion}.${timestamp}">
-			<fileset dir="${buildDirectory}/plugins/org.eclipse.ptp.rm.slurm.proxy"/>
-		</copy>
-		<zip destfile="${zipsdir}/${proxyFile}">
-			<fileset dir="${buildDirectory}">
-				<include name="proxy/**/*"/>
-			</fileset>
-		</zip>
-	</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 -->
-		<!-- NOTE: the symlink task is broken for ant versions < 1.8.1. It should be possible to -->
-		<!-- just use overwrite="true", but this fails for dangling links. Also, the symlink "delete" -->
-		<!-- action fails with a java.io.FileNotFoundException and the delete task will not remove -->
-		<!-- symbolic links. The only option currenly is to exec the "rm" command. -->
-		<exec executable="rm">
-			<arg value="-f"/>
-			<arg value="${releaseDir}/latest"/>
-		</exec>
-		<symlink link="${releaseDir}/latest" resource="${copyToDir}" overwrite="true" failonerror="false"/>
-		<exec executable="rm">
-			<arg value="-f"/>
-			<arg value="${releaseDir}/ptp-master-${ptpBranchVersion}-latest.zip"/>
-		</exec>
-		<symlink link="${releaseDir}/ptp-master-${ptpBranchVersion}-latest.zip" resource="${copyToDir}/${masterFile}" overwrite="true" failonerror="false"/>
-		<exec executable="rm">
-			<arg value="-f"/>
-			<arg value="${releaseDir}/rdt-server-unix-${ptpBranchVersion}-latest.tar"/>
-		</exec>
-		<symlink link="${releaseDir}/rdt-server-unix-${ptpBranchVersion}-latest.tar" resource="${copyToDir}/rdt-server-unix-${ptpBranchVersion}.tar" overwrite="true" failonerror="false"/>
-		<exec executable="rm">
-			<arg value="-f"/>
-			<arg value="${releaseDir}/rdt-server-aix-${ptpBranchVersion}-latest.tar"/>
-		</exec>
-		<symlink link="${releaseDir}/rdt-server-aix-${ptpBranchVersion}-latest.tar" resource="${copyToDir}/rdt-server-aix-${ptpBranchVersion}.tar" overwrite="true" failonerror="false"/>
-	</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>
-		
-		<!-- fix artifacts -->
-		<p2.process.artifacts repositoryPath="file:/${p2dir}"/>
-
-		<!-- clean up some unnecessary files -->
-		<delete failonerror="false" quiet="true">
-			<fileset dir="${p2dir}" includes="artifacts.jar.pack.gz, content.jar.pack.gz, site.xml"/>
-		</delete>
-
-		<!-- 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="update" depends="init" unless="hasErrors">
-		<replace file="${releaseDir}/index.html">
-			<replacetoken><![CDATA[  <!-- add here -->]]></replacetoken>
-			<replacevalue><![CDATA[  <!-- add here -->
-<li><a href="@buildType@.@buildId@/index.html">@buildId@</a></li>]]></replacevalue>
-		</replace>
-		<replace file="${releaseDir}/index.html">
-			<replacefilter token="@buildType@" value="${buildType}"/>
-			<replacefilter token="@buildId@" value="${buildId}"/>
-		</replace>
-		<chmod file="${releaseDir}/index.html" perm="664"/>
-	</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.jaxb-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.rm.jaxb.pbs-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.rm.lml_jaxb-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.rm.lml-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.ppw-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.rdt.sync-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>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.sdk-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.extensionpoints.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.utils.file.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.generic.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.generic.ui"/>
-			<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.jaxb.control.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.jaxb.control.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.jaxb.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.jaxb.help"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.jaxb.pbs"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.jaxb.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml_jaxb"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml.monitor.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml.monitor.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml.da"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml.da.server"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml.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.core.server"/>
-			<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.sdm.x10"/>
-			<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.doc.user"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/doc/org.eclipse.ptp.doc.isv"/>
-			<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.doc.user"/>
-			<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.doc.user"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/ppw/org.eclipse.ptp.etfw.ppw"/>
-			<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.server.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.gnu.ui"/>
-			<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.sync.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.sync.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.sync.git.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.sync.git.ui"/>
-			<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/buildindex.html b/releng/org.eclipse.ptp.releng/buildindex.html
deleted file mode 100644
index 5d406e4..0000000
--- a/releng/org.eclipse.ptp.releng/buildindex.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-  <title>PTP @branchVersion@ Build @buildId@</title>
-</head>
-<body>
-<h2>PTP @branchVersion@ Build @buildId@</h2>
-<p><a href="build.log">Build Log</a></p>
-<p><a href="compilelog.txt">Compile Log</a></p>
-<p><a href="junits.html">JUnit Results</a></p>
-<table border="1" cellpadding="5">
-<col width="20%"/>
-<col width="30%"/>
-<col width="50%"/>
-<tr>
-	<th>Name</th>
-	<th>Download Link</th>
-	<th>Description</th>
-</tr>
-<tr>
-	<td>PTP Master Archive</td>
-	<td> 
-		<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ptp/builds/@eclipseRelease@/I.@buildId@/ptp-master-@branchVersion@-@buildId@.zip">ptp-master-@branchVersion@-@buildId@.zip</a>
-	</td>
-	<td>Contains all features/plugins for PTP and Photran. This is a copy of the PTP update site.</td>
-</tr>
-<tr>
-	<td>PTP Proxy Archive</td>
-	<td> 
-		<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ptp/builds/@eclipseRelease@/I.@buildId@/ptp-proxy-@branchVersion@-@buildId@.zip">ptp-proxy-@branchVersion@-@buildId@.zip</a>
-	</td>
-	<td>Contains the source code for the proxy components of PTP. This zip should be copied to the remote system and compiled.</td>
-</tr>
-<tr>
-	<td>RDT Server for AIX</td>
-	<td> 
-		<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ptp/builds/@eclipseRelease@/I.@buildId@/rdt-server-aix-@branchVersion@.tar"
-			class="external text"
-			rel="nofollow">rdt-server-aix-@branchVersion@.tar</a>
-	</td>
-	<td>AIX version of the RDT server. Only required if using RSE for remote connections.</td>
-</tr>
-<tr>
-	<td>RDT Server for Linux</td>
-	<td> 
-		<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ptp/builds/@eclipseRelease@/I.@buildId@/rdt-server-linux-@branchVersion@.tar"
-			class="external text"
-			rel="nofollow">rdt-server-linux-@branchVersion@.tar</a>
-	</td>
-	<td>Generic Linux version of the RDT server. Only required if using RSE for remote connections.</td>
-</tr>
-<tr>
-	<td>RDT Server for Linux PPC</td>
-	<td> 
-		<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ptp/builds/@eclipseRelease@/I.@buildId@/rdt-server-linux.ppc-@branchVersion@.tar"
-			class="external text"
-			rel="nofollow">rdt-server-linux.ppc-@branchVersion@.tar</a>
-	</td>
-	<td>Linux version of the RDT server for PPC systems. Only required if using RSE for remote connections.</td>
-</tr>
-<tr>
-	<td>RDT Server for Linux x86</td>
-	<td> 
-		<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ptp/builds/@eclipseRelease@/I.@buildId@/rdt-server-linux.x86-@branchVersion@.tar"
-			class="external text"
-			rel="nofollow">rdt-server-linux.x86-@branchVersion@.tar</a>
-	</td>
-	<td>Linux version of the RDT server for x86 systems. Only required if using RSE for remote connections.</td>
-</tr>
-<tr>
-	<td>RDT Server for Mac OS X</td>
-	<td> 
-		<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ptp/builds/@eclipseRelease@/I.@buildId@/rdt-server-macosx-@branchVersion@.tar"
-			class="external text"
-			rel="nofollow">rdt-server-macosx-@branchVersion@.tar</a>
-	</td>
-	<td>Mac OS X version of the RDT server. Only required if using RSE for remote connections.</td>
-</tr>
-<tr>
-	<td>RDT Server for Unix</td>
-	<td> 
-		<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ptp/builds/@eclipseRelease@/I.@buildId@/rdt-server-unix-@branchVersion@.tar"
-			class="external text"
-			rel="nofollow">rdt-server-unix-@branchVersion@.tar</a>
-	</td>
-	<td>Generic Unix version of the RDT server. Only required if using RSE for remote connections.</td>
-</tr>
-<tr>
-	<td>RDT Server for Windows</td>
-	<td> 
-		<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ptp/builds/@eclipseRelease@/I.@buildId@/rdt-server-windows-@branchVersion@.zip"
-			class="external text"
-			rel="nofollow">rdt-server-windows-@branchVersion@.zip</a>
-	</td>
-	<td>Windows version of the RDT server. Only required if using RSE for remote connections.</td>
-</tr>
-</table>
-</body>
-</html>
diff --git a/releng/org.eclipse.ptp.releng/buildsite.xml b/releng/org.eclipse.ptp.releng/buildsite.xml
deleted file mode 100644
index 4e598db..0000000
--- a/releng/org.eclipse.ptp.releng/buildsite.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-   <description url="http://download.eclipse.org/tools/ptp/updates/indigo">
-      Parallel Tools Platform Indigo Update Site
-   </description>
-   <feature url="features/org.eclipse.ptp_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.core_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.core" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.debug.sdm_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.debug.sdm" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.etfw_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.etfw" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.external_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.external" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.pldt_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.pldt" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.remote_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.remote" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.remote.remotetools_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.remote.remotetools" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-    <feature url="features/org.eclipse.ptp.remotetools_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.remotetools" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.ibm.ll_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rm.ibm.ll" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.ibm.pe_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rm.ibm.pe" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.mpich2_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rm.mpich2" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.openmpi_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rm.openmpi" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.pbs_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rm.pbs" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.jaxb_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rm.jaxb" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.jaxb.pbs_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rm.jaxb.pbs" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.lml_jaxb_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rm.lml_jaxb" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.lml_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rm.lml" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.slurm_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rm.slurm" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.services_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.services" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.utils_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.utils" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.pldt.lapi_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.pldt.lapi" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.gem_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.gem" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.remote.rse_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.remote.rse" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.pldt.upc_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.pldt.upc" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.etfw.tau_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.etfw.tau" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-    <feature url="features/org.eclipse.ptp.etfw.tau.fortran_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.etfw.tau.fortran" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.etfw.ppw_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.etfw.ppw" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.sci_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.sci" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-    <feature url="features/org.eclipse.ptp.sdk_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.sdk" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rdt_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rdt" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Remote Development Tools"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rdt.xlc_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rdt.xlc" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Remote Development Tools"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rdt.sync_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rdt.sync" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Remote Development Tools"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rdt.remotetools_@ptpBranchVersion@.@timeStamp@.jar" id="org.eclipse.ptp.rdt.remotetools" version="@ptpBranchVersion@.@timeStamp@">
-      <category name="Remote Development Tools"/>
-   </feature>
-   <feature url="features/org.eclipse.photran_@photranBranchVersion@.@timeStamp@.jar" id="org.eclipse.photran" version="@photranBranchVersion@.@timeStamp@">
-      <category name="Fortran Development Tools (Photran)"/>
-   </feature>
-   <feature url="features/org.eclipse.photran.intel_@photranBranchVersion@.@timeStamp@.jar" id="org.eclipse.photran.intel" version="@photranBranchVersion@.@timeStamp@" os="linux">
-      <category name="Fortran Development Tools (Photran)"/>
-   </feature>
-   <feature url="features/org.eclipse.photran.xlf_@photranBranchVersion@.@timeStamp@.jar" id="org.eclipse.photran.xlf" version="@photranBranchVersion@.@timeStamp@">
-      <category name="Fortran Development Tools (Photran)"/>
-   </feature>
-   <feature url="features/org.eclipse.rephraserengine_@photranBranchVersion@.@timeStamp@.jar" id="org.eclipse.rephraserengine" version="@photranBranchVersion@.@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 32e25bb..0000000
--- a/releng/org.eclipse.ptp.releng/maps/ptp.map
+++ /dev/null
@@ -1,207 +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.license=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.license-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.jaxb=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.jaxb-feature
-feature@org.eclipse.ptp.rm.jaxb.pbs=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.jaxb.pbs-feature
-feature@org.eclipse.ptp.rm.lml_jaxb=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.lml_jaxb-feature
-feature@org.eclipse.ptp.rm.lml=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.lml-feature
-feature@org.eclipse.ptp.rm.mpich2=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.mpich2-feature
-feature@org.eclipse.ptp.rm.openmpi=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.openmpi-feature
-feature@org.eclipse.ptp.rm.pbs=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.pbs-feature
-feature@org.eclipse.ptp.rm.slurm=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.slurm-feature
-feature@org.eclipse.ptp.external=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.external-feature
-feature@org.eclipse.ptp.debug.sdm=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.sdm-feature
-feature@org.eclipse.ptp.services=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.services-feature
-feature@org.eclipse.ptp.sdk=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.sdk-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
-feature@org.eclipse.ptp.rdt.sync=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rdt.sync-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.extensionpoints.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.utils.extensionpoints.core
-plugin@org.eclipse.ptp.utils.file.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.utils.file.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.generic.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.generic.core
-plugin@org.eclipse.ptp.rm.generic.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.generic.ui
-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.jaxb.control.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.jaxb.control.core
-plugin@org.eclipse.ptp.rm.jaxb.control.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.jaxb.control.ui
-plugin@org.eclipse.ptp.rm.jaxb.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.jaxb.core
-plugin@org.eclipse.ptp.rm.jaxb.help=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.jaxb.help
-plugin@org.eclipse.ptp.rm.jaxb.pbs=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.jaxb.pbs
-plugin@org.eclipse.ptp.rm.jaxb.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.jaxb.ui
-plugin@org.eclipse.ptp.rm.jaxb.ui.monitor=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.jaxb.ui.monitor
-plugin@org.eclipse.ptp.rm.lml_jaxb=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml_jaxb
-plugin@org.eclipse.ptp.rm.lml.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml.core
-plugin@org.eclipse.ptp.rm.lml.monitor.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml.monitor.core
-plugin@org.eclipse.ptp.rm.lml.monitor.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml.monitor.ui
-plugin@org.eclipse.ptp.rm.lml.da.server=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml.da.server
-plugin@org.eclipse.ptp.rm.lml.da=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml.da
-plugin@org.eclipse.ptp.rm.lml.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.lml.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.core.server=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.pbs.core.server
-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.sdm.x10=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/debug/org.eclipse.ptp.debug.sdm.x10
-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.doc.user=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/doc/org.eclipse.ptp.doc.user
-plugin@org.eclipse.ptp.doc.isv=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/doc/org.eclipse.ptp.doc.isv
-
-! 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.doc.user=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.doc.user
-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
-plugin@org.eclipse.ptp.etfw.doc.user=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.doc.user
-
-! 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.gnu.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.managedbuilder.gnu.ui
-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
-plugin@org.eclipse.ptp.rdt.sync.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.sync.core
-plugin@org.eclipse.ptp.rdt.sync.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.sync.ui
-plugin@org.eclipse.ptp.rdt.sync.git.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.sync.git.core
-plugin@org.eclipse.ptp.rdt.sync.git.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.sync.git.ui
-
-! 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
-
-! Orbit bundles
-plugin@javax.xml,1.3.4=GET,http://download.eclipse.org/tools/orbit/downloads/drops/R20100519200754/bundles/javax.xml_1.3.4.v201005080400.jar
-plugin@javax.xml.stream,1.0.1=GET,http://download.eclipse.org/tools/orbit/downloads/drops/R20100519200754/bundles/javax.xml.stream_1.0.1.v201004272200.jar
-plugin@javax.xml.bind,2.1.9=GET,http://download.eclipse.org/tools/orbit/downloads/drops/R20100519200754/bundles/javax.xml.bind_2.1.9.v201005080401.jar
-plugin@com.sun.xml.bind,2.1.9=GET,http://download.eclipse.org/tools/orbit/downloads/drops/R20100519200754/bundles/com.sun.xml.bind_2.1.9.v200905260854.jar
-
-! JGit plugins
-!plugin@org.eclipse.jgit=GET,http://download.eclipse.org/jgit/maven/org/eclipse/jgit/org.eclipse.jgit/0.12.1/org.eclipse.jgit-0.12.1.jar
-plugin@org.eclipse.jgit=GET,http://download.eclipse.org/tools/ptp/builds/jgit/org.eclipse.jgit_0.12.1.jar
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 025edae..0000000
--- a/releng/org.eclipse.ptp.releng/ptpbuild
+++ /dev/null
@@ -1,74 +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
-VERBOSE=false
-
-# main staging directory
-BUILD_DIR=/opt/public/download-staging.priv/tools/ptp/releng
-
-args=`getopt vc:d:t: $*`
-
-if [ $? != 0 ]; then
-	echo "usage: ptpbuild [-v] [-t tag] [-c cdt_tag] [-d build_dir] [build_args]"
-	exit 1
-fi
-
-set -- $args
-for i
-do
-	case "$i"
-	in
-	-v) VERBOSE=true; shift;;
-	-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
-
-do_build() {
-	# create the releng staging directory and go there
-	mkdir -p $1 && cd $1
-
-	# remove the old build
-	rm -fr org.eclipse.ptp_${2}
-
-	# Check out the releng project
-	cvs -d /cvsroot/tools co -r $2 -d org.eclipse.ptp_${2} org.eclipse.ptp/releng/org.eclipse.ptp.releng
-
-	# run the main script
-	cd org.eclipse.ptp_${2}
-	sh build.sh $3
-}
-
-if [ $VERBOSE = true ]; then
-	do_build $BUILD_DIR $TAG "$*" 2>&1 | tee $BUILD_LOG
-else
-	do_build $BUILD_DIR $TAG "$*" > $BUILD_LOG 2>&1
-fi
-
-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 a084c3f..0000000
--- a/releng/org.eclipse.ptp.releng/update_versions
+++ /dev/null
@@ -1,120 +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.etfw-feature \
-	org.eclipse.ptp.etfw.ppw-feature \
-	org.eclipse.ptp.etfw.tau-feature \
-	org.eclipse.ptp.etfw.tau.fortran-feature \
-	org.eclipse.ptp.external-feature \
-	org.eclipse.ptp.gem-feature \
-	org.eclipse.ptp.master \
-	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.remotejars-feature \
-	org.eclipse.ptp.rdt.remotetools-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.pbs-feature \
-	org.eclipse.ptp.rm.slurm-feature \
-	org.eclipse.ptp.sci-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.slurm.proxy \
-	org.eclipse.ptp.sci \
-	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
-}
-
-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
-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.jaxb.tests/.classpath b/rms/org.eclipse.ptp.rm.jaxb.tests/.classpath
deleted file mode 100644
index c0b0b1f..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.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="eclipse"/>
-</classpath>
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/.project b/rms/org.eclipse.ptp.rm.jaxb.tests/.project
deleted file mode 100644
index 36f1ae3..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rm.jaxb.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/rms/org.eclipse.ptp.rm.jaxb.tests/.settings/org.eclipse.jdt.core.prefs b/rms/org.eclipse.ptp.rm.jaxb.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 87a0234..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Sat Feb 12 11:12:54 CST 2011
-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/rms/org.eclipse.ptp.rm.jaxb.tests/META-INF/MANIFEST.MF b/rms/org.eclipse.ptp.rm.jaxb.tests/META-INF/MANIFEST.MF
deleted file mode 100644
index d2922be..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,31 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.rm.jaxb.tests;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.ptp.rm.jaxb.tests.JAXBTestsPlugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.debug.core,
- org.eclipse.ui,
- org.eclipse.core.filesystem,
- org.eclipse.search,
- org.eclipse.ptp.services.core;bundle-version="1.0.0",
- org.eclipse.ptp.remote.core,
- org.eclipse.ptp.core,
- org.eclipse.ptp.rm.core,
- javax.xml;bundle-version="1.3.4",
- javax.xml.stream;bundle-version="1.0.1",
- javax.xml.bind;bundle-version="2.1.9",
- com.sun.xml.bind;bundle-version="2.1.9",
- javax.activation;bundle-version="1.1.0",
- org.eclipse.cdt.debug.core;bundle-version="7.1.0",
- org.junit;bundle-version="3.8.2",
- org.eclipse.ptp.rm.jaxb.core;bundle-version="1.0.0",
- org.eclipse.ptp.rm.jaxb.ui;bundle-version="1.0.0",
- org.eclipse.core.variables;bundle-version="3.2.400",
- org.eclipse.ptp.rm.jaxb.control.core;bundle-version="1.0.0",
- org.eclipse.ptp.rm.lml.monitor.core;bundle-version="1.0.0",
- org.eclipse.ptp.rm.lml_jaxb;bundle-version="1.0.0"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: %pluginProvider
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/build.properties b/rms/org.eclipse.ptp.rm.jaxb.tests/build.properties
deleted file mode 100644
index ede7561..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = eclipse/
-bin.includes = META-INF/,\
-               .,\
-               data/,\
-               plugin.xml
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/data/qstat b/rms/org.eclipse.ptp.rm.jaxb.tests/data/qstat
deleted file mode 100755
index 8a18c36..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/data/qstat
+++ /dev/null
@@ -1,177 +0,0 @@
-#!/bin/bash
-
-echo Job id            Name             User              Time Use S Queue
-echo ----------------  ---------------- ----------------  -------- - -----
-echo 41363.localhost       em2PDOS6ML50     sbl3              2489:15: R normal          
-echo 42286.localhost       em2PDOS6ML       sbl3              1474:47: R normal          
-echo 43148.localhost       em2PDOS10ML      sbl3              2011:34: R normal          
-echo 43155.localhost       em2PDOS6ML       sbl3                     0 Q normal          
-echo 43178.localhost       em2PDOS10ML      sbl3                     0 Q normal          
-echo 43179.localhost       em2PDOS10ML      sbl3                     0 Q normal          
-echo 43779.localhost       runbatch         spradhan          366:57:4 R normal          
-echo 43788.localhost       md.170           deuxphor          25:16:11 R normal          
-echo 43789.localhost       md.161           deuxphor          25:16:12 R normal          
-echo 43790.localhost       md.402           deuxphor          25:16:18 R normal          
-echo 43791.localhost       md.239           deuxphor          25:16:24 R normal          
-echo 43792.localhost       md.568           deuxphor          25:16:18 R normal          
-echo 43793.localhost       md.9             deuxphor          25:16:21 R normal          
-echo 43794.localhost       md.44            deuxphor          25:16:08 R normal          
-echo 43795.localhost       md.1630          deuxphor          25:16:18 R normal          
-echo 43796.localhost       md.534           deuxphor          25:22:07 R normal          
-echo 43797.localhost       md.431           deuxphor          25:21:56 R normal          
-echo 43798.localhost       md.722           deuxphor          25:21:59 R normal          
-echo 43799.localhost       md.278           deuxphor          25:21:55 R normal          
-echo 43800.localhost       md.1608          deuxphor          25:20:39 R normal          
-echo 43801.localhost       md.580           deuxphor          25:19:37 R normal          
-echo 43802.localhost       md.524           deuxphor          25:18:45 R normal          
-echo 43803.localhost       md.442           deuxphor          25:16:55 R normal          
-echo 43804.localhost       md.1449          deuxphor          25:17:08 R normal          
-echo 43805.localhost       md.85            deuxphor          25:10:25 R normal          
-echo 43806.localhost       md.1574          deuxphor          25:10:49 R normal          
-echo 43807.localhost       md.1524          deuxphor          25:10:47 R normal          
-echo 43808.localhost       md.224           deuxphor          25:10:47 R normal          
-echo 43809.localhost       md.1663          deuxphor          25:10:46 R normal          
-echo 43810.localhost       md.669           deuxphor          25:10:46 R normal          
-echo 43811.localhost       md.619           deuxphor          25:10:39 R normal          
-echo 43812.localhost       md.88            deuxphor          25:10:39 R normal          
-echo 43813.localhost       md.489           deuxphor          25:15:50 R normal          
-echo 43814.localhost       md.513           deuxphor          25:15:52 R normal          
-echo 43815.localhost       md.501           deuxphor          25:08:20 R normal          
-echo 43816.localhost       md.1568          deuxphor          25:12:18 R normal          
-echo 43817.localhost       md.556           deuxphor          25:12:03 R normal          
-echo 43818.localhost       md.452           deuxphor          25:12:05 R normal          
-echo 43819.localhost       md.698           deuxphor          25:12:18 R normal          
-echo 43820.localhost       md.420           deuxphor          25:10:16 R normal          
-echo 43821.localhost       md.536           deuxphor          25:05:31 R normal          
-echo 43822.localhost       md.27            deuxphor          25:05:33 R normal          
-echo 43823.localhost       md.504           deuxphor          25:10:58 R normal          
-echo 43824.localhost       md.1499          deuxphor          25:09:21 R normal          
-echo 43825.localhost       md.519           deuxphor          25:03:30 R normal          
-echo 43826.localhost       md.1404          deuxphor          25:07:40 R normal          
-echo 43827.localhost       md.142           deuxphor          25:08:24 R normal          
-echo 43828.localhost       md.221           deuxphor          25:08:26 R normal          
-echo 43829.localhost       md.212           deuxphor          25:06:21 R normal          
-echo 43830.localhost       md.569           deuxphor          25:01:07 R normal          
-echo 43831.localhost       md.241           deuxphor          25:06:22 R normal          
-echo 43832.localhost       md.622           deuxphor          25:05:06 R normal          
-echo 43833.localhost       md.387           deuxphor          24:59:53 R normal          
-echo 43834.localhost       md.737           deuxphor          25:04:56 R normal          
-echo 43835.localhost       md.134           deuxphor          25:02:58 R normal          
-echo 43836.localhost       md.1478          deuxphor          24:57:57 R normal          
-echo 43837.localhost       md.347           deuxphor          24:57:53 R normal          
-echo 43838.localhost       md.1403          deuxphor          25:02:52 R normal          
-echo 43839.localhost       md.1464          deuxphor          25:01:27 R normal          
-echo 43840.localhost       md.1607          deuxphor          25:01:23 R normal          
-echo 43841.localhost       md.709           deuxphor          24:56:03 R normal          
-echo 43842.localhost       md.1604          deuxphor          24:55:41 R normal          
-echo 43843.localhost       md.623           deuxphor          24:55:42 R normal          
-echo 43844.localhost       md.25            deuxphor          24:55:35 R normal          
-echo 43845.localhost       md.721           deuxphor          24:55:38 R normal          
-echo 43846.localhost       md.262           deuxphor          24:55:27 R normal          
-echo 43847.localhost       md.1616          deuxphor          09:50:09 R normal          
-echo 43848.localhost       md.38            deuxphor          09:50:21 R normal          
-echo 43849.localhost       md.326           deuxphor          09:31:44 R normal          
-echo 43850.localhost       md.1637          deuxphor          09:23:49 R normal          
-echo 43851.localhost       md.1528          deuxphor          09:28:41 R normal          
-echo 43852.localhost       md.320           deuxphor          09:28:40 R normal          
-echo 43853.localhost       md.587           deuxphor          09:22:21 R normal          
-echo 43854.localhost       md.500           deuxphor          09:23:26 R normal          
-echo 43855.localhost       md.1649          deuxphor          09:23:00 R normal          
-echo 43856.localhost       md.1496          deuxphor          09:26:19 R normal          
-echo 43857.localhost       md.325           deuxphor          09:22:14 R normal          
-echo 43858.localhost       md.137           deuxphor          09:22:11 R normal          
-echo 43859.localhost       md.508           deuxphor          09:22:07 R normal          
-echo 43860.localhost       md.22            deuxphor          09:18:05 R normal          
-echo 43861.localhost       md.310           deuxphor          09:18:02 R normal          
-echo 43862.localhost       md.378           deuxphor          09:18:00 R normal          
-echo 43863.localhost       md.648           deuxphor          09:17:58 R normal          
-echo 43864.localhost       md.719           deuxphor          09:17:54 R normal          
-echo 43865.localhost       md.1521          deuxphor          08:55:32 R normal          
-echo 43866.localhost       md.227           deuxphor          08:46:57 R normal          
-echo 43867.localhost       md.639           deuxphor          07:40:18 R normal          
-echo 43868.localhost       md.1472          deuxphor          07:32:12 R normal          
-echo 43869.localhost       md.466           deuxphor          07:32:08 R normal          
-echo 43870.localhost       md.1505          deuxphor          08:55:53 R normal          
-echo 43871.localhost       md.211           deuxphor          08:55:52 R normal          
-echo 43872.localhost       md.128           deuxphor          07:12:52 R normal          
-echo 43873.localhost       md.716           deuxphor                 0 Q normal          
-echo 43874.localhost       md.1413          deuxphor                 0 Q normal          
-echo 43875.localhost       md.538           deuxphor                 0 Q normal          
-echo 43876.localhost       md.69            deuxphor                 0 Q normal          
-echo 43877.localhost       md.16            deuxphor                 0 Q normal          
-echo 43878.localhost       md.335           deuxphor                 0 Q normal          
-echo 43879.localhost       md.1532          deuxphor                 0 Q normal          
-echo 43880.localhost       md.409           deuxphor                 0 Q normal          
-echo 43881.localhost       md.584           deuxphor                 0 Q normal          
-echo 43882.localhost       md.342           deuxphor                 0 Q normal          
-echo 43883.localhost       md.480           deuxphor                 0 Q normal          
-echo 43884.localhost       md.1453          deuxphor                 0 Q normal          
-echo 43885.localhost       md.91            deuxphor                 0 Q normal          
-echo 43886.localhost       md.1561          deuxphor                 0 Q normal          
-echo 43887.localhost       md.448           deuxphor                 0 Q normal          
-echo 43888.localhost       em2PDOS6ML       sbl3              1258:26: R normal          
-echo 43889.localhost       em2PDOS6ML       sbl3                     0 Q normal          
-echo 43897.localhost       em2PDOS3ML       sbl3                     0 Q normal          
-echo 43898.localhost       all_3            dmcelhen          167:50:1 R normal          
-echo 43900.localhost       all_3            dmcelhen          167:06:0 R normal          
-echo 44004.localhost       cow_fcc_CE       gghosh            289:27:3 R normal          
-echo 44024.localhost       coti_fcc_CE      gghosh            234:43:5 R normal          
-echo 44026.localhost       cota_fcc_CE      gghosh            234:28:0 R normal          
-echo 44027.localhost       coti_bcc_CE      gghosh            102:22:3 R normal          
-echo 44028.localhost       core_hcp_CE      gghosh            231:01:3 R normal          
-echo 44029.localhost       coru_hcp_CE      gghosh            230:08:5 R normal          
-echo 44031.localhost       coir_hcp_CE      gghosh            212:06:0 R normal          
-echo 44033.localhost       coti_hcp_CE      gghosh            190:53:0 R normal          
-echo 44040.localhost       amberbench       yimao             59:44:26 R normal          
-echo 44059.localhost       Co_dhbq          prithag           59:06:02 R normal          
-echo 44060.localhost       Co_dhbq          prithag           58:47:18 R normal          
-echo 44064.localhost       slip51           qnguyen1          14:18:35 R normal          
-echo 44065.localhost       Job-1            ama7300           14:14:50 R normal          
-echo 44072.localhost       scb_bgc_2010     frenzel           102:02:5 R normal          
-echo 44073.localhost       scb_bgc_2010     frenzel                  0 H normal          
-echo 44075.localhost       scb_bgc_2010     frenzel                  0 H normal          
-echo 44076.localhost       scb_bgc_2010     frenzel                  0 H normal          
-echo 44078.localhost       scb_bgc_2010     frenzel                  0 H normal          
-echo 44080.localhost       w1846a375        stoakes2          92:03:27 R normal          
-echo 44082.localhost       w1846a625        stoakes2          101:34:3 R normal          
-echo 44083.localhost       w1846a750        stoakes2          94:01:55 R normal          
-echo 44084.localhost       amberbench       yimao             52:51:11 R normal          
-echo 44104.localhost       g_try-speed      hanying                  0 Q normal          
-echo 44128.localhost       g_uethnp2        landrews          09:31:19 R normal          
-echo 44135.localhost       molprojob        linachen          08:30:25 R normal          
-echo 44136.localhost       molprojob        linachen          08:55:27 R normal          
-echo 44137.localhost       molprojob        linachen          08:42:35 R normal          
-echo 44138.localhost       molprojob        linachen          08:36:33 R normal          
-echo 44139.localhost       molprojob        linachen          07:33:06 R normal          
-echo 44140.localhost       molprojob        linachen          07:43:25 R normal          
-echo 44141.localhost       molprojob        linachen          07:08:09 R normal          
-echo 44142.localhost       molprojob        linachen          07:02:47 R normal          
-echo 44143.localhost       molprojob        linachen          07:00:59 R normal          
-echo 44144.localhost       molprojob        linachen          06:59:15 R normal          
-echo 44145.localhost       molprojob        linachen          01:43:27 R normal          
-echo 44146.localhost       molprojob        linachen          01:43:41 R normal          
-echo 44147.localhost       molprojob        linachen          01:43:24 R normal          
-echo 44148.localhost       molprojob        linachen          00:23:28 R normal          
-echo 44149.localhost       molprojob        linachen          00:23:27 R normal          
-echo 44150.localhost       molprojob        linachen          00:16:28 R normal          
-echo 44151.localhost       molprojob        linachen                 0 Q normal          
-echo 44152.localhost       molprojob        linachen                 0 Q normal          
-echo 44153.localhost       molprojob        linachen                 0 Q normal          
-echo 44154.localhost       molprojob        linachen                 0 Q normal          
-echo 44155.localhost       molprojob        linachen                 0 Q normal          
-echo 44156.localhost       molprojob        linachen                 0 Q normal          
-echo 44157.localhost       molprojob        linachen                 0 Q normal          
-echo 44158.localhost       molprojob        linachen                 0 Q normal          
-echo 44159.localhost       molprojob        linachen                 0 Q normal          
-echo 44160.localhost       molprojob        linachen                 0 Q normal          
-echo 44161.localhost       molprojob        linachen                 0 Q normal          
-echo 44162.localhost       molprojob        linachen                 0 Q normal          
-echo 44163.localhost       molprojob        linachen                 0 Q normal          
-echo 44164.localhost       molprojob        linachen                 0 Q normal          
-echo 44165.localhost       molprojob        linachen                 0 Q normal          
-echo 44166.localhost       molprojob        linachen                 0 Q normal          
-echo 44167.localhost       molprojob        linachen                 0 Q normal          
-echo 44188.localhost       g_20_s13_nh2     daramola          41:32:28 R normal          
-echo 44189.localhost       g_20_s14_nh3     daramola          27:45:32 R normal          
-echo 44192.localhost       STDIN            dtcheng           21:45:29 R normal          
-echo 44194.localhost       STDIN            dtcheng           00:00:00 R normal
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/data/qstatF b/rms/org.eclipse.ptp.rm.jaxb.tests/data/qstatF
deleted file mode 100755
index 5bdd2fa..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/data/qstatF
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-sleep 1
-echo normal
-echo iacat2
-echo indprio
-echo lincoln_nomss
-echo cap1
-echo lincoln_debug
-echo long
-echo iacat
-echo industrial
-echo lincoln
-echo wide
-echo nomss
-echo debug
-echo fernsler
-echo iacat3
-echo lincoln_cuda3.2
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/data/qstatId b/rms/org.eclipse.ptp.rm.jaxb.tests/data/qstatId
deleted file mode 100755
index 01a8434..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/data/qstatId
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-./qstat | grep $1
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/data/qsub b/rms/org.eclipse.ptp.rm.jaxb.tests/data/qsub
deleted file mode 100755
index de3cb80..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/data/qsub
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-
-echo EMULATING QSUB LOCALLY > qsub.txt
-echo $1 >> qsub.txt
-cat $1 >> qsub.txt
-echo >> qsub.txt
-echo 44104.localhost
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/data/tabbed-example.xml b/rms/org.eclipse.ptp.rm.jaxb.tests/data/tabbed-example.xml
deleted file mode 100644
index e6e2610..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/data/tabbed-example.xml
+++ /dev/null
@@ -1,303 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- ******************************************************************************* -->
-<!-- * Copyright (c) 2011 University of Illinois 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: -->
-<!-- * Albert L. Rossi - design and implementation -->
-<!-- ****************************************************************************** -->
-<resource-manager-builder xmlns="http://org.eclipse.ptp/rm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="resource_manager_type.xsd" name="tabbed-example">
-	<control-data>
-		<property name="e1" visible="true"/>
-		<property name="e2" visible="true"/>
-		<property name="e3" visible="true"/>
-		<property name="e4" visible="true"/>
-		<property name="e5" visible="true"/>
-		<property name="path1" visible="true"/>
-      <property name="path2" visible="true"/>
-      <property name="path3" visible="true"/>
-      <property name="path4" visible="true"/>
-		<attribute name="mpiCommand" type="choice">
-			<description>Which mpi command to use.</description>
-			<choice>,mpiexec,mpirun</choice>
-		</attribute>
-		<attribute name="mpiCores" min="1" type="integer">
-			<description>the '-np' value</description>
-		</attribute>
-		<attribute name="destination" type="string">
-			<description>Designation of the queue to which to submit the job.</description>
-			<tooltip>Format: queue[@server].</tooltip>
-		</attribute>
-		<attribute name="Resource_List.mem" type="string">
-			<description>Maximum amount of memory used by all concurrent processes in the job.</description>
-			<tooltip><![CDATA[Format: integer[suffix]; the suffix is a multiplier 
-in bytes or words (word size of the host): b (bytes), 
-w (words), kb/kw (kilo), mb/mw (mega), gb/bw (giga).]]></tooltip>
-			<default>20gb</default>
-		</attribute>
-		<attribute name="Resource_List.walltime" type="string">
-			<description>Maximum amount of real time during which the job can be in the running state.</description>
-			<tooltip>Format: [[hours:]minutes:]seconds[.milliseconds].</tooltip>
-			<default>00:30:00</default>
-		</attribute>
-		<script>
-			<line>
-				<arg>QUEUE = ${ptp_rm:destination#value}</arg>
-			</line>
-			<line>
-				<arg>COMMAND = ${ptp_rm:mpiCommand#value}</arg>
-			</line>
-			<line>
-				<arg>CORES = ${ptp_rm:mpiCores#value}</arg>
-			</line>
-			<line>
-				<arg>MEM = ${ptp_rm:Resource_List.mem#value}</arg>
-			</line>
-			<line>
-				<arg>WALL = ${ptp_rm:Resource_List.walltime#value}</arg>
-			</line>
-			<line>
-				<arg>e1 = ${ptp_rm:e1#value}</arg>
-			</line>
-			<line>
-				<arg>e2 = ${ptp_rm:e2#value}</arg>
-			</line>
-			<line>
-				<arg>e3 = ${ptp_rm:e3#value}</arg>
-			</line>
-			<line>
-				<arg>e4 = ${ptp_rm:e4#value}</arg>
-			</line>
-			<line>
-				<arg>e5 = ${ptp_rm:e5#value}</arg>
-			</line>
-			<line>
-            <arg>path1 = ${ptp_rm:path1#value}</arg>
-         </line>
-         <line>
-            <arg>path2 = ${ptp_rm:path2#value}</arg>
-         </line>
-         <line>
-            <arg>path3 = ${ptp_rm:path3#value}</arg>
-         </line>
-         <line>
-            <arg>path4 = ${ptp_rm:path4#value}</arg>
-         </line>
-		</script>
-		<submit-interactive name="submit-interactive">
-			<arg>echo</arg>
-			<arg>$VAR_1</arg>
-			<arg>$VAR_2</arg>
-			<arg>$VAR_3</arg>
-			<arg>$VAR_4</arg>
-			<arg>$VAR_5</arg>
-			<environment name="VAR_1" value="${ptp_rm:e1#value}"/>
-			<environment name="VAR_2" value="${ptp_rm:e2#value}"/>
-			<environment name="VAR_3" value="${ptp_rm:e3#value}"/>
-			<environment name="VAR_4" value="${ptp_rm:e4#value}"/>
-			<environment name="VAR_5" value="${ptp_rm:e5#value}"/>
-		</submit-interactive>
-		<launch-tab>
-			<dynamic includeWidgetValuesFrom="Environment,Paths">
-				<title>Settings</title>
-				<composite>
-					<layout>
-						<grid-layout numColumns="4" makeColumnsEqualWidth="false" horizontalSpacing="10" verticalSpacing="15"/>
-					</layout>
-					<widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_RED">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<fixed-text>Name</fixed-text>
-					</widget>
-					<widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_RED">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" horizontalSpan="2" grabExcessHorizontal="false"/>
-						</layout-data>
-						<fixed-text>Value</fixed-text>
-					</widget>
-					<widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_RED">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<fixed-text>Description</fixed-text>
-					</widget>
-					<!-- row 1 -->
-					<widget type="label" style="SWT.LEFT">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<tooltip>${ptp_rm:Resource_List.mem#tooltip}</tooltip>
-						<fixed-text>Total Memory Needed: </fixed-text>
-					</widget>
-					<widget type="text" style="SWT.BORDER" saveValueTo="Resource_List.mem">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.FILL" horizontalSpan="2" grabExcessHorizontal="false" widthHint="150"/>
-						</layout-data>
-					</widget>
-					<widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_BLUE">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<fixed-text>${ptp_rm:Resource_List.mem#description}</fixed-text>
-					</widget>
-					<widget type="label" style="SWT.LEFT">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<tooltip>${ptp_rm:Resource_List.walltime#tooltip}</tooltip>
-						<fixed-text>Wallclock Time: </fixed-text>
-					</widget>
-					<widget type="text" style="SWT.BORDER" saveValueTo="Resource_List.walltime">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.FILL" horizontalSpan="2" grabExcessHorizontal="false" widthHint="150"/>
-						</layout-data>
-					</widget>
-					<widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_BLUE">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<fixed-text>${ptp_rm:Resource_List.walltime#description}</fixed-text>
-					</widget>
-					<widget type="label" style="SWT.LEFT">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<fixed-text>MPI Command: </fixed-text>
-					</widget>
-					<widget type="combo" style="SWT.BORDER" readOnly="true" saveValueTo="mpiCommand">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.FILL" horizontalSpan="2" grabExcessHorizontal="false"/>
-						</layout-data>
-					</widget>
-					<widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_BLUE">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<fixed-text>${ptp_rm:mpiCommand#description}</fixed-text>
-					</widget>
-					<!-- row 4 -->
-					<widget type="label" style="SWT.LEFT">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<fixed-text>MPI Number of Cores: </fixed-text>
-					</widget>
-					<widget type="spinner" readOnly="true" saveValueTo="mpiCores">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" horizontalSpan="2" grabExcessHorizontal="false"/>
-						</layout-data>
-					</widget>
-					<widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_BLUE">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<fixed-text>${ptp_rm:mpiCores#description}</fixed-text>
-					</widget>
-				</composite>
-			</dynamic>
-			<dynamic>
-				<title>Paths</title>
-				<composite>
-					<layout>
-						<grid-layout numColumns="4" makeColumnsEqualWidth="false" horizontalSpacing="10" verticalSpacing="15"/>
-					</layout>
-					<widget type="label" style="SWT.LEFT">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<fixed-text>Browse URI: </fixed-text>
-					</widget>
-					<widget type="browse" uri="true" style="SWT.BORDER" readOnly="false" title="Browse" saveValueTo="path1">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.FILL" widthHint="200" horizontalSpan="2" grabExcessHorizontal="true"/>
-						</layout-data>
-						<sub-layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" widthHint="100" horizontalSpan="1" grabExcessHorizontal="false"/>
-						</sub-layout-data>
-					</widget>
-					<!-- row 5 -->
-					<widget type="label" style="SWT.LEFT">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<fixed-text>Browse Dir Path: </fixed-text>
-					</widget>
-					<widget type="browse" uri="false" directory="true" style="SWT.BORDER" readOnly="true" title="Browse" saveValueTo="path2">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.FILL" widthHint="200" horizontalSpan="2" grabExcessHorizontal="true"/>
-						</layout-data>
-						<sub-layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" widthHint="100" horizontalSpan="1" grabExcessHorizontal="false"/>
-						</sub-layout-data>
-					</widget>
-					<!-- row 6 -->
-					<widget type="label" style="SWT.LEFT">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<fixed-text>Browse Local File: </fixed-text>
-					</widget>
-					<widget type="browse" style="SWT.BORDER | SWT.H_SCROLL" readOnly="true" localOnly="true" title="Browse" saveValueTo="path3">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.FILL" widthHint="200" horizontalSpan="2" grabExcessHorizontal="true"/>
-						</layout-data>
-						<sub-layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" widthHint="100" horizontalSpan="1" grabExcessHorizontal="false"/>
-						</sub-layout-data>
-					</widget>
-					<!-- row 7 -->
-					<widget type="label" style="SWT.LEFT">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-						</layout-data>
-						<fixed-text>Browse Local Dir URI: </fixed-text>
-					</widget>
-					<widget type="browse" directory="true" uri="true" style="SWT.BORDER" readOnly="true" localOnly="true" title="Browse" saveValueTo="path4">
-						<layout-data>
-							<grid-data horizontalAlign="SWT.FILL" widthHint="200" horizontalSpan="2" grabExcessHorizontal="true"/>
-						</layout-data>
-						<sub-layout-data>
-							<grid-data horizontalAlign="SWT.BEGINNING" widthHint="100" horizontalSpan="1" grabExcessHorizontal="false"/>
-						</sub-layout-data>
-					</widget>
-				</composite>
-			</dynamic>
-			<dynamic includeWidgetValuesFrom="Settings">
-				<title>Environment</title>
-				<composite group="true">
-					<layout>
-						<grid-layout numColumns="1"/>
-					</layout>
-					<viewer name="environment" style="SWT.BORDER | SWT.MULTI" sort="true" type="table">
-						<layout-data>
-							<grid-data widthHint="600" heightHint="200" horizontalSpan="1"/>
-						</layout-data>
-						<column-data name="Name" width="175">
-							<tooltip>Double-click on selected rows toggles their checked value.</tooltip>
-						</column-data>
-						<column-data name="Value" width="400">
-							<tooltip>Click to activate value widget.</tooltip>
-						</column-data>
-						<items>
-							<include>e1</include>
-							<include>e2</include>
-							<include>e3</include>
-							<include>e4</include>
-							<include>e5</include>
-						</items>
-						<value pattern="export @name='@value'" separator="; "/>
-					</viewer>
-				</composite>
-			</dynamic>
-		</launch-tab>
-	</control-data>
-	<monitor-data schedulerType="Tabbed">
-		<driver>
-			<name></name>
-		</driver>
-	</monitor-data>
-</resource-manager-builder>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/data/test-pbs.xml b/rms/org.eclipse.ptp.rm.jaxb.tests/data/test-pbs.xml
deleted file mode 100644
index a39f031..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/data/test-pbs.xml
+++ /dev/null
@@ -1,715 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- ******************************************************************************* -->
-<!-- * Copyright (c) 2011 University of Illinois 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: -->
-<!-- * Albert L. Rossi - design and implementation -->
-<!-- ****************************************************************************** -->
-<resource-manager-builder xmlns="http://org.eclipse.ptp/rm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="resource_manager_type.xsd" name="test-pbs">
-   <control-data>
-      <property name="queues" visible="false"/>
-      <property name="stdout" visible="false">
-         <default>${ptp_rm:directory#value}/${ptp_rm:@jobId#name}.ember.out</default>
-      </property>
-      <attribute name="mpiCommand" type="choice">
-         <description>Which mpi command to use.</description>
-         <choice>,mpiexec,mpirun</choice>
-      </attribute>
-      <attribute name="mpiCores" min="1" type="integer">
-         <description>the '-np' value</description>
-      </attribute>
-      <attribute name="Account_Name" type="string">
-         <description>Account to which to charge this job.</description>
-         <tooltip>Format: string</tooltip>
-      </attribute>
-      <attribute name="Checkpoint" type="choice">
-         <description>Determines when checkpointing (if supported) will be performed by PBS on behalf of the job.</description>
-         <tooltip><![CDATA[Format: the strings "n" (no checkpointing), 
-"s" (to be performed only when the server executing 
-the job is shutdown), "c"s (to be performed at the 
-default minimum time for thes servers executing the 
-job), "c=mmmm" (to be performed at an intervals 
-of minutes which is the integer number of minutes of CPUs 
-time used bys the job; values must be greater than zero); 
-defaults value: "u", which is unspecified.]]></tooltip>
-         <choice>,u,n,s,c,c=????</choice>
-         <default>u</default>
-      </attribute>
-      <attribute name="depend" type="string">
-         <description>The type of inter-job dependencies specified by the job owner.</description>
-         <tooltip>Format: "type:jobid[,jobid...]"; default value: no dependencies.</tooltip>
-      </attribute>
-      <attribute name="destination" type="choice">
-         <description>Designation of the queue to which to submit the job.</description>
-         <tooltip>Format: queue[@server].</tooltip>
-         <choice>normal,debug</choice>
-      </attribute>
-      <attribute name="directive" type="string">
-         <description>Defines the prefix that declares a directive to the qsub command within the script file.</description>
-         <tooltip><![CDATA[See the paragraph on script directives in the 
-Extended Description section. If the option is presented with a
-directive_prefix argument that is the null string, qsub will 
-not scan the script file for directives.]]></tooltip>
-      </attribute>
-      <attribute name="Error_Path" type="string">
-         <description>The final path name for the file containing the job's standard error stream.</description>
-         <tooltip><![CDATA[Format: "[hostname:]pathname". If 
-the option is not specified, the default file name for the 
-standard error stream will be used. The default name has 
-the following form: job_name.eSeq_num where job_name is 
-the name of the job, see -N option, and Seq_num
-is the job number assigned when the job is submitted; 
-default value: (job_name).e(job_number).]]></tooltip>
-      </attribute>
-      <attribute name="export_all" type="boolean">
-         <description><![CDATA[Declares that all environment variables in the qsub command's environment are to be exported to the batch job.]]></description>
-         <default>true</default>
-      </attribute>
-      <attribute name="group_list" type="string">
-         <description><![CDATA[A list of composite-descriptor group="true"_names@hosts which determines the composite-descriptor group="true" under which the job is run on a given host.]]></description>
-         <tooltip><![CDATA[Format: composite-descriptor 
-group="true"_name[@host][,composite-descriptor group="true"_name[@host]...].
-When a job is to be placed into execution, the server will select a 
-composite-descriptor group="true" name according to the following ordered set 
-of rules: 1) Select the composite-descriptor group="true" name from
-the list for which the associated host name matches the name of the
-execution host; 2) Select the composite-descriptor group="true" name 
-which has no associated host name, the wildcard name; 3) Use
-the login composite-descriptor group="true" for the username under 
-which the job will be run.]]></tooltip>
-      </attribute>
-      <attribute name="Hold_Types" type="choice">
-         <description>The set of holds currently applied to the job.</description>
-         <tooltip><![CDATA[If the set is not null, the job will not be scheduled
-for execution and is said to be in the hold state. Note, the hold
-state takes precedence over the wait state. Format: string made up 
-of the letters 'u', 's', 'o'; default value: no hold.]]></tooltip>
-         <choice>,u,s,o</choice>
-      </attribute>
-      <attribute name="Job_Name" type="string">
-         <description>The name assigned to the job by the qsub or qalter command.</description>
-         <tooltip><![CDATA[Format: string up to 15 characters, 
-first character must be alphabetic; default value: 
-the base name of the job script or STDIN.]]></tooltip>
-      </attribute>
-      <attribute name="Join_Path" type="boolean">
-         <description>Merge stdout and stderr into stdout.</description>
-         <tooltip><![CDATA[Format: boolean, values accepted are "True", "TRUE",
-"true", "Y", "y", "1", "False", "FALSE", "false", "N", "n", "0";
-default value: false.]]></tooltip>
-         <default>false</default>
-      </attribute>
-      <attribute name="Keep_Files" type="choice">
-         <description>Retain these streams on the execution host upon job termination.</description>
-         <tooltip><![CDATA[Format: "o", "e", "oe" or "eo"; default value:
-no keep, return files to submission host.]]></tooltip>
-         <choice>,o,e,oe,eo</choice>
-      </attribute>
-      <attribute name="Mail_Points" type="choice">
-         <description>Identifies at which state changes the server will send mail about the job.</description>
-         <tooltip><![CDATA[Format: string made up of the letters
-'a' for abort, 'b' for beginning, and default value:
- a', send on job abort.]]></tooltip>
-         <choice>,a,b</choice>
-         <default>a</default>
-      </attribute>
-      <attribute name="Mail_Users" type="string">
-         <description>The set of users to whom mail may be sent when the job makes certain state changes.</description>
-         <tooltip>Format: "user@host[,user@host]"; default value: job owner only.</tooltip>
-      </attribute>
-      <attribute name="Output_Path" type="string">
-         <description>The final path name for the file containing the job's standard output stream.</description>
-         <tooltip><![CDATA[Format: "[hostname:]pathname". If the option
-is not specified, the default file name for the standard error stream 
-will be used. The default name has the following form: job_name.oSeq_num
-where job_name is the name of the job, see -N option, and Seq_num
-is the job number assigned when the job is submitted; 
-default value: (job_name).o(job_number).]]></tooltip>
-      </attribute>
-      <attribute name="Priority" type="string">
-         <description>The job scheduling priority assigned by the user.</description>
-         <tooltip>Format: "[+|-]nnnnn"; default value: undefined.</tooltip>
-      </attribute>
-      <attribute name="Rerunnable" type="choice">
-         <description>The rerunnable flag assigned by the user.</description>
-         <tooltip>Format: "y" or "n", see Join_Path; default value: y, job is rerunable.</tooltip>
-         <choice>,n,y</choice>
-         <default>y</default>
-      </attribute>
-      <attribute name="Resource_List.arch" type="string">
-         <description>Specifies the administrator defined system architecture requried.</description>
-         <tooltip>This defaults to whatever the PBS_MACH string is set to in "local.mk". Units: string.</tooltip>
-      </attribute>
-      <attribute name="Resource_List.cput" type="string">
-         <description>Maximum amount of CPU time used by all processes in the job.</description>
-         <tooltip>Format: [[hours:]minutes:]seconds[.milliseconds].</tooltip>
-      </attribute>
-      <attribute name="Resource_List.file" type="string">
-         <description>The largest size of any single file that may be created by the job.</description>
-         <tooltip><![CDATA[Format: integer[suffix]; the suffix is a multiplier 
-in bytes or words (word size of the host): b (bytes), 
-w (words), kb/kw (kilo), mb/mw (mega), gb/bw (giga).]]></tooltip>
-      </attribute>
-      <attribute name="Resource_List.host" type="string">
-         <description>Name of host on which job should be run.</description>
-      </attribute>
-      <attribute name="Resource_List.mem" type="string">
-         <description>Maximum amount of memory used by all concurrent processes in the job.</description>
-         <tooltip><![CDATA[Format: integer[suffix]; the suffix is a multiplier 
-in bytes or words (word size of the host): b (bytes), 
-w (words), kb/kw (kilo), mb/mw (mega), gb/bw (giga).]]></tooltip>
-      </attribute>
-      <attribute name="Resource_List.nice" type="integer" min="0" max="10">
-         <description>The nice value under which the job is to be run.</description>
-         <tooltip>0 to 10.</tooltip>
-         <default>0</default>
-      </attribute>
-      <attribute name="Resource_List.nodes" type="string">
-         <description>Number and/or type of nodes to be reserved for exclusive use by the job.</description>
-         <tooltip><![CDATA[The value is one or more node_specs joined with 
-the '+' character, "node_spec[+node_spec...]. Each node_spec is
-a number of nodes required of the type declared in the node_spec
-and a name or one or more properity or properities desired for 
-the nodes. The number, the name, and each properity in the 
-node_spec are separated by a colon ':'. If no number is specified, 
-one (1) is assumed. Units: string. The name of a node is its 
-hostname. The properties of nodes are: ppn=# requested; defaults 
-to 1; or an arbitrary string defined by system administrator. 
-Example: To ask for 2 processors on each of two blue nodes and 
-three processors on one red node: -l nodes=2:blue:ppn=2+red:ppn=3.]]></tooltip>
-         <default>1</default>
-      </attribute>
-      <attribute name="Resource_List.ompthreads" type="integer" min="1">
-         <description>Number of threads per processor for Open MP jobs.</description>
-         <default>1</default>
-      </attribute>
-      <attribute name="Resource_List.pcput" type="string">
-         <description>Maximum amount of CPU time used by any single process in the job.</description>
-         <tooltip>Format: [[hours:]minutes:]seconds[.milliseconds].</tooltip>
-      </attribute>
-      <attribute name="Resource_List.pmem" type="string">
-         <description>Maximum amount of physical memory (workingset) used by any single process of the job.</description>
-         <tooltip><![CDATA[Format: integer[suffix]; the suffix is a multiplier
-in bytes or words (word size of the host): b (bytes), w (words), kb/kw
-(kilo), mb/mw (mega), gb/bw (giga).]]></tooltip>
-      </attribute>
-      <attribute name="Resource_List.pvmem" type="string">
-         <description>Maximum amount of virtual memory used by any single process in the job.</description>
-         <tooltip><![CDATA[Format: integer[suffix]; the suffix is a multiplier
-in bytes or words (word size of the host): b (bytes), w (words), kb/kw
-(kilo), mb/mw (mega), gb/bw (giga).]]></tooltip>
-      </attribute>
-      <attribute name="Resource_List.vmem" type="string">
-         <description>Maximum amount of virtual memory used by all concurrent processes in the job.</description>
-         <tooltip><![CDATA[Format: integer[suffix]; the suffix is a multiplier 
-in bytes or words (word size of the host): b (bytes), w (words), kb/kw
-(kilo), mb/mw (mega), gb/bw (giga).]]></tooltip>
-      </attribute>
-      <attribute name="Resource_List.walltime" type="string">
-         <description>Maximum amount of real time during which the job can be in the running state.</description>
-         <tooltip>Format: [[hours:]minutes:]seconds[.milliseconds].</tooltip>
-         <default>00:30:00</default>
-      </attribute>
-      <attribute name="Shell_Path_List" type="string">
-         <description>A set of absolute paths of the program to process the job's script file.</description>
-         <tooltip><![CDATA[Format: path[@host][,path[@host]...]. 
-If this is null, then the user's login shell on the host 
-of execution will be used. Default value: null, login shell.]]></tooltip>
-      </attribute>
-      <attribute name="stagein" type="string">
-         <description>The list of files to be staged in prior to job execution.</description>
-         <tooltip>Format: local_path@remote_host:remote_path.</tooltip>
-      </attribute>
-      <attribute name="stageout" type="string">
-         <description>The list of files to be staged out after job execution.</description>
-         <tooltip>Format: local_path@remote_host:remote_path.</tooltip>
-      </attribute>
-      <attribute name="User_List" type="string">
-         <description>The list of user@hosts which determines the user name under which the job is run on a given host.</description>
-         <tooltip><![CDATA[When a job is to be placed into execution, 
-the server will select a user name from the list according
-to the following ordered set of rules: 1) Select the user 
-name from the list for which the associated host name matches
-the name of the execution host; 2) Select the user name which 
-has no associated host name, the wild card name; 3) Use the 
-Job_Owner as the user name. Default value: job owner name.]]></tooltip>
-      </attribute>
-      <attribute name="Variable_List" type="string">
-         <description>This is the list of environment variables passed with the Queue Job batch request.</description>
-      </attribute>
-      <script insertEnvironmentAfter="35">
-         <line>
-            <arg>#!/bin/bash</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -A">#PBS -A ${ptp_rm:Account_Name#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -c">#PBS -c ${ptp_rm:Checkpoint#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -W depend=">#PBS -W depend=${ptp_rm:depend#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -q">#PBS -q ${ptp_rm:destination#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -C">#PBS -C ${ptp_rm:line#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -e">#PBS -e ${ptp_rm:Error_Path#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -V">#PBS -V ${ptp_rm:export_all#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -W group_list=">#PBS -W group_list=${ptp_rm:group_list#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -h">#PBS -h ${ptp_rm:Hold_Types#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -N">#PBS -N ${ptp_rm:Job_Name#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -j">#PBS -j ${ptp_rm:Join_Path#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -k">#PBS -k ${ptp_rm:Keep_Files#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -m">#PBS -m ${ptp_rm:Mail_Points#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -M">#PBS -M ${ptp_rm:Mail_Users#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -o">#PBS -o ${ptp_rm:Output_Path#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -p">#PBS -p ${ptp_rm:Priority#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -r">#PBS -r ${ptp_rm:Rerunnable#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l arch=">#PBS -l arch=${ptp_rm:Resource_List.arch#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l cput=">#PBS -l cput=${ptp_rm:Resource_List.cput#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l file=">#PBS -l file=${ptp_rm:Resource_List.file#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l host=">#PBS -l host=${ptp_rm:Resource_List.host#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l mem=">#PBS -l mem=${ptp_rm:Resource_List.mem#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l nice=">#PBS -l nice=${ptp_rm:Resource_List.nice#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l nodes=">#PBS -l nodes=${ptp_rm:Resource_List.nodes#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l ompthreads=">#PBS -l ompthreads=${ptp_rm:Resource_List.ompthreads#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l pcput=">#PBS -l pcput=${ptp_rm:Resource_List.pcput#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l pmem=">#PBS -l pmem=${ptp_rm:Resource_List.pmem#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l pvmem=">#PBS -l pvmem=${ptp_rm:Resource_List.pvmem#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l vmem=">#PBS -l vmem=${ptp_rm:Resource_List.vmem#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l walltime=">#PBS -l walltime=${ptp_rm:Resource_List.walltime#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -S">#PBS -S ${ptp_rm:Shell_Path_List#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -W stagein=">#PBS -W stagein=${ptp_rm:stagein#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -W stageout=">#PBS -W stageout=${ptp_rm:stageout#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -u">#PBS -u ${ptp_rm:User_List#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -v">#PBS -v ${ptp_rm:Variable_List#value}</arg>
-         </line>
-         <line>
-            <arg>MPI_ARGS="-np ${ptp_rm:mpiCores#value}"</arg>
-         </line>
-         <line>
-            <arg resolve="false">if [ "-np" == "$MPI_ARGS" ] ; then</arg>
-         </line>
-         <line>
-            <arg resolve="false"> MPI_ARGS=</arg>
-         </line>
-         <line>
-            <arg resolve="false">fi</arg>
-         </line>
-         <line>
-            <arg>OUT=${ptp_rm:Job_Name#value}.out</arg>
-         </line>
-         <line>
-            <arg>MPI_COMMAND=${ptp_rm:mpiCommand#value}</arg>
-         </line>
-         <line>
-            <arg resolve="false">if [ -n "${MPI_COMMAND}" ] ; then</arg>
-         </line>
-         <line>
-            <arg resolve="false"> MPI_COMMAND="${MPI_COMMAND} ${MPI_ARGS}"</arg>
-         </line>
-         <line>
-            <arg resolve="false">fi</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="cd">cd ${ptp_rm:directory#value}</arg>
-         </line>
-         <line>
-            <arg resolve="false">${MPI_COMMAND} </arg>
-            <arg>${ptp_rm:executablePath#value} ${ptp_rm:progArgs#value}</arg>
-            <arg resolve="false">&gt;&amp; ${PBS_JOBID}.out</arg>
-         </line>
-         <line>
-            <arg resolve="false">touch DONE</arg>
-         </line>
-      </script>
-      <start-up-command name="get-queues">
-         <arg>qstat</arg>
-         <arg>-Q</arg>
-         <arg>-f</arg>
-         <stdout-parser delim="\n">
-            <target ref="queues">
-               <match>
-                  <expression>Queue: ([\w\d]+)</expression>
-                  <add field="value">
-                     <entry valueGroup="1"/>
-                  </add>
-               </match>
-            </target>
-         </stdout-parser>
-      </start-up-command>
-      <submit-batch name="submit-batch" waitForId="true">
-         <arg>qsub</arg>
-         <arg>${ptp_rm:managed_file_for_script#value}</arg>
-         <stdout-parser delim="\n" all="true" save="1">
-            <target ref="@jobId">
-               <match>
-                  <expression>([\d]+)[.].*</expression>
-                  <set field="name">
-                     <entry valueGroup="1"/>
-                  </set>
-                  <set field="value">
-                     <entry value="SUBMITTED"/>
-                  </set>
-               </match>
-            </target>
-         </stdout-parser>
-      </submit-batch>
-      <get-job-status name="get-job-status" ignoreExitStatus="true">
-         <arg>qstat</arg>
-         <arg>${ptp_rm:@jobId#name}</arg>
-         <stdout-parser delim="\n">
-            <target ref="@jobId">
-               <match>
-                  <expression>.+[\s]+.+[\s]+.+[\s]+.+[\s]+([A-Z])[\s]+.+</expression>
-                  <set field="value">
-                     <entry valueGroup="1"/>
-                  </set>
-               </match>
-               <test op="EQ">
-                  <value>#value</value>
-                  <value>Q</value>
-                  <set field="value">
-                     <entry value="QUEUED_ACTIVE"/>
-                  </set>
-               </test>
-               <test op="EQ">
-                  <value>#value</value>
-                  <value>R</value>
-                  <set field="value">
-                     <entry value="RUNNING"/>
-                  </set>
-               </test>
-               <test op="EQ">
-                  <value>#value</value>
-                  <value>S</value>
-                  <set field="value">
-                     <entry value="SUSPENDED"/>
-                  </set>
-               </test>
-               <test op="EQ">
-                  <value>#value</value>
-                  <value>C</value>
-                  <set field="value">
-                     <entry value="COMPLETED"/>
-                  </set>
-               </test>
-               <test op="EQ">
-                  <value>#value</value>
-                  <value>E</value>
-                  <set field="value">
-                     <entry value="COMPLETED"/>
-                  </set>
-               </test>
-               <test op="EQ">
-                  <value>#value</value>
-                  <value>H</value>
-                  <set field="value">
-                     <entry value="SYSTEM_ON_HOLD"/>
-                  </set>
-               </test>
-            </target>
-         </stdout-parser>
-         <stderr-parser delim="\n">
-            <target ref="@jobId">
-               <match>
-                  <expression>.+</expression>
-                  <set field="value">
-                     <entry value="COMPLETED"/>
-                  </set>
-               </match>
-            </target>
-         </stderr-parser>
-      </get-job-status>
-      <terminate-job name="cancel">
-         <arg>qdel</arg>
-         <arg>${ptp_rm:@jobId#name}</arg>
-      </terminate-job>
-      <launch-tab>
-         <basic>
-            <title>Basic PBS Settings</title>
-            <composite group="true">
-               <layout>
-                  <grid-layout numColumns="4" makeColumnsEqualWidth="false" horizontalSpacing="10" verticalSpacing="15"/>
-               </layout>
-               <!-- HEADER -->
-               <widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_RED">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <fixed-text>Name</fixed-text>
-               </widget>
-               <widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_RED">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" horizontalSpan="2" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <fixed-text>Value</fixed-text>
-               </widget>
-               <widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_RED">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <fixed-text>Description</fixed-text>
-               </widget>
-               <!-- row 1 -->
-               <widget type="label" style="SWT.LEFT">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <tooltip>${ptp_rm:Job_Name#tooltip}</tooltip>
-                  <fixed-text>Job Name: </fixed-text>
-               </widget>
-               <widget type="text" style="SWT.BORDER" saveValueTo="Job_Name">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.FILL" horizontalSpan="2" grabExcessHorizontal="false" widthHint="150"/>
-                  </layout-data>
-               </widget>
-               <widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_BLUE">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <fixed-text>${ptp_rm:Job_Name#description}</fixed-text>
-               </widget>
-               <!-- row 2 -->
-               <widget type="label" style="SWT.LEFT">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <tooltip>${ptp_rm:destination#tooltip}</tooltip>
-                  <fixed-text>Queue: </fixed-text>
-               </widget>
-               <widget type="combo" style="SWT.BORDER" readOnly="true" saveValueTo="destination">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.FILL" horizontalSpan="2" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <items-from>queues</items-from>
-               </widget>
-               <widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_BLUE">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <fixed-text>${ptp_rm:destination#description}</fixed-text>
-               </widget>
-               <!-- row 3 -->
-               <widget type="label" style="SWT.LEFT">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <tooltip>${ptp_rm:Resource_List.nodes#tooltip}</tooltip>
-                  <fixed-text>Number of nodes: </fixed-text>
-               </widget>
-               <widget type="text" style="SWT.BORDER" saveValueTo="Resource_List.nodes">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.FILL" horizontalSpan="2" grabExcessHorizontal="false"  widthHint="150"/>
-                  </layout-data>
-               </widget>
-               <widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_BLUE">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <fixed-text>${ptp_rm:Resource_List.nodes#description}</fixed-text>
-               </widget>
-               <!-- row 4 -->
-               <widget type="label" style="SWT.LEFT">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <tooltip>${ptp_rm:Resource_List.mem#tooltip}</tooltip>
-                  <fixed-text>Total Memory Needed: </fixed-text>
-               </widget>
-               <widget type="text" style="SWT.BORDER" saveValueTo="Resource_List.mem">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.FILL" horizontalSpan="2" grabExcessHorizontal="false"  widthHint="150"/>
-                  </layout-data>
-               </widget>
-               <widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_BLUE">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <fixed-text>${ptp_rm:Resource_List.mem#description}</fixed-text>
-               </widget>
-               <!-- row 5 -->
-               <widget type="label" style="SWT.LEFT">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <tooltip>${ptp_rm:Resource_List.walltime#tooltip}</tooltip>
-                  <fixed-text>Wallclock Time: </fixed-text>
-               </widget>
-               <widget type="text" style="SWT.BORDER" saveValueTo="Resource_List.walltime">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.FILL" horizontalSpan="2" grabExcessHorizontal="false"  widthHint="150"/>
-                  </layout-data>
-               </widget>
-               <widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_BLUE">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <fixed-text>${ptp_rm:Resource_List.walltime#description}</fixed-text>
-               </widget>
-               <!-- row 6 -->
-               <widget type="label" style="SWT.LEFT">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <fixed-text>MPI Command: </fixed-text>
-               </widget>
-               <widget type="combo" style="SWT.BORDER" readOnly="true" saveValueTo="mpiCommand">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.FILL" horizontalSpan="2" grabExcessHorizontal="false"/>
-                  </layout-data>
-               </widget>
-               <widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_BLUE">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <fixed-text>${ptp_rm:mpiCommand#description}</fixed-text>
-               </widget>
-               <!-- row 7 -->
-               <widget type="label" style="SWT.LEFT">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <fixed-text>MPI Number of Cores: </fixed-text>
-               </widget>
-               <widget type="spinner" readOnly="true" saveValueTo="mpiCores">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" horizontalSpan="2" grabExcessHorizontal="false"/>
-                  </layout-data>
-               </widget>
-               <widget type="label" style="SWT.LEFT" foreground="SWT.COLOR_DARK_BLUE">
-                  <layout-data>
-                     <grid-data horizontalAlign="SWT.BEGINNING" grabExcessHorizontal="false"/>
-                  </layout-data>
-                  <fixed-text>${ptp_rm:mpiCores#description}</fixed-text>
-               </widget>
-            </composite>
-         </basic>
-         <advanced>
-            <title>Advanced PBS Settings</title>
-            <composite>
-               <layout>
-                  <grid-layout numColumns="1"/>
-               </layout>
-               <layout-data>
-                  <grid-data widthHint="600" heightHint="600" horizontalSpan="1"/>
-               </layout-data>
-               <composite>
-                  <layout>
-                     <grid-layout numColumns="3"/>
-                  </layout>
-                  <widget type="label" style="SWT.LEFT">
-                     <layout-data>
-                        <grid-data horizontalAlign="SWT.BEGINNING"/>
-                     </layout-data>
-                     <tooltip>${ptp_rm:destination#tooltip}</tooltip>
-                     <fixed-text>Queue: </fixed-text>
-                  </widget>
-                  <widget type="combo" style="SWT.BORDER" readOnly="true" saveValueTo="destination">
-                     <layout-data>
-                        <grid-data horizontalSpan="2"/>
-                     </layout-data>
-                     <items-from>queues</items-from>
-                  </widget>
-                  <widget type="text" readOnly="true" style="SWT.LEFT | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL">
-                     <layout-data>
-                        <grid-data widthHint="600" heightHint="75" horizontalSpan="3"/>
-                     </layout-data>
-                     <dynamic-text>
-                        <arg>${ptp_rm:allAttributes#value}</arg>
-                        <arg isUndefinedIfMatches=" destination=''"> destination='${ptp_rm:destination#value}'</arg>
-                     </dynamic-text>
-                  </widget>
-               </composite>
-               <viewer name="allAttributes" style="SWT.BORDER | SWT.MULTI" sort="true" type="tree">
-                  <layout-data>
-                     <grid-data widthHint="600" heightHint="400" horizontalSpan="2"/>
-                  </layout-data>
-                  <column-data name="Name" width="175">
-                     <tooltip>Double-click on selected rows toggles their checked value.</tooltip>
-                  </column-data>
-                  <column-data name="Value" width="400">
-                     <tooltip>Click to activate value widget.</tooltip>
-                  </column-data>
-                  <items allPredefined="true">
-                     <exclude>destination</exclude>
-                  </items>
-                  <value pattern="@name='@value'"/>
-               </viewer>
-            </composite>
-         </advanced>
-         <custom-controller>Import PBS Script</custom-controller>
-      </launch-tab>
-   </control-data>
-   <monitor-data schedulerType="PBS">
-      <driver>
-         <name></name>
-      </driver>
-   </monitor-data>
-</resource-manager-builder>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/data/tokenizer-examples.xml b/rms/org.eclipse.ptp.rm.jaxb.tests/data/tokenizer-examples.xml
deleted file mode 100644
index 2a1a2c4..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/data/tokenizer-examples.xml
+++ /dev/null
@@ -1,403 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resource-manager-builder xmlns="http://org.eclipse.ptp/rm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="resource_manager_type.xsd" name="test-parsers">
-	<control-data>
-		<!-- EXAMPLE 1: output is a list of line-separated queue names to be assigned
-			to the known property "available-queues" -->
-		<start-up-command name="test00ParseQstat">
-			<arg/>
-			<stdout-parser delim="\n">
-				<target ref="available_queues">
-					<match>
-						<expression>[^\s]+</expression>
-						<!-- <append field="value" separator=","> -->
-						<!-- <entry valueGroup="0"/> -->
-						<!-- </append> -->
-						<add field="value">
-							<entry valueGroup="0"/>
-						</add>
-					</match>
-				</target>
-			</stdout-parser>
-		</start-up-command>
-		<!-- EXAMPLE 2: output is to be searched for its final line which should
-			contain a job id of the form "[digits].[chars]" -->
-		<start-up-command name="test01JobId">
-			<arg/>
-			<stdout-parser delim="\n" all="true" save="1">
-				<target ref="@jobId">
-					<match>
-						<expression>([\d]*)[.].*</expression>
-						<set field="value">
-							<entry valueGroup="1"/>
-						</set>
-					</match>
-				</target>
-			</stdout-parser>
-		</start-up-command>
-		<!-- EXAMPLE 3: indeterminate number and order of lines containing parts
-			of attribute definitions, but each line bearing a distinct
-			id (e.g., openMPI attribute discovery) -->
-		<start-up-command name="test02OpenMPI">
-			<arg/>
-			<stdout-parser delim="\n">
-				<target type="attribute">
-					<match>
-						<expression>mca:.*:param:([^:]*):value:(.*)</expression>
-						<set field="name">
-							<entry valueGroup="1"/>
-						</set>
-						<set field="visible">
-							<entry value="true"/>
-						</set>
-						<set field="value">
-							<entry valueGroup="2"/>
-						</set>
-					</match>
-					<match>
-						<expression>mca:.*:param:([^:]*):status:(.*)</expression>
-						<set field="status">
-							<entry valueGroup="2"/>
-						</set>
-					</match>
-					<match>
-						<expression>mca:.*:param:([^:]*):help:(.*)</expression>
-						<set field="tooltip">
-							<entry valueGroup="2"/>
-						</set>
-					</match>
-					<test op="EQ">
-						<value>#status</value>
-						<value>read-only</value>
-						<set field="readOnly">
-							<entry value="true"/>
-						</set>
-						<else>
-							<set field="readOnly">
-								<entry value="false"/>
-							</set>
-						</else>
-					</test>
-				</target>
-				<target type="attribute">
-					<match>
-						<expression>(.*):([^:]*)</expression>
-						<set field="name">
-							<entry valueGroup="1"/>
-						</set>
-						<set field="value">
-							<entry valueGroup="2"/>
-						</set>
-						<set field="visible">
-							<entry value="false"/>
-						</set>
-						<set field="readOnly">
-							<entry value="true"/>
-						</set>
-					</match>
-				</target>
-			</stdout-parser>
-		</start-up-command>
-		<!-- EXAMPLE 4: indeterminate number of definitions, but grouped
-			by caption; use of moveToTop to promote the target to the top of the list
-			when the caption appears -->
-		<start-up-command name="test03ImplicitWithTags">
-			<arg/>
-			<stdout-parser delim="\n">
-				<target type="property">
-					<match moveToTop="true">
-						<expression>PROPERTY</expression>
-					</match>
-					<match>
-						<expression>name:(.*)</expression>
-						<set field="name">
-							<entry valueGroup="1"/>
-						</set>
-					</match>
-					<match>
-						<expression>value:(.*)</expression>
-						<set field="value">
-							<entry valueGroup="1"/>
-						</set>
-					</match>
-				</target>
-				<target type="attribute">
-					<match moveToTop="true">
-						<expression>ATTRIBUTE</expression>
-					</match>
-					<match>
-						<expression>name:(.*)</expression>
-						<set field="name">
-							<entry valueGroup="1"/>
-						</set>
-					</match>
-					<match>
-						<expression>value:(.*)</expression>
-						<set field="value">
-							<entry valueGroup="1"/>
-						</set>
-					</match>
-				</target>
-			</stdout-parser>
-		</start-up-command>
-		<!-- EXAMPLE 5: similar to 4, but without delimiter (implicit ordering) -->
-		<start-up-command name="test04ImplicitOrdering">
-			<arg/>
-			<stdout-parser delim="\n">
-				<target type="attribute" matchAll="true">
-					<match>
-						<expression>.+</expression>
-						<set field="name">
-							<entry valueGroup="0"/>
-						</set>
-					</match>
-					<match>
-						<expression>.*</expression>
-						<set field="type">
-							<entry valueGroup="0"/>
-						</set>
-					</match>
-					<match>
-						<expression>.*</expression>
-						<set field="description">
-							<entry valueGroup="0"/>
-						</set>
-					</match>
-					<match>
-						<expression>.*</expression>
-						<set field="tooltip">
-							<entry valueGroup="0"/>
-						</set>
-					</match>
-					<match>
-						<expression>.*</expression>
-						<set field="value">
-							<entry valueGroup="0"/>
-						</set>
-					</match>
-				</target>
-			</stdout-parser>
-		</start-up-command>
-		<!-- EXAMPLE 6: like 4, but with indeterminate type order and using buffer + DOTALL -->
-		<start-up-command name="test05ImplicitWithTagsDotall">
-			<arg/>
-			<stdout-parser maxMatchLen="32" applyToAll="true">
-				<target type="property">
-					<match>
-						<expression flags="DOTALL">.*PROPERTY[\n]name:(\w*)[\n]value:([\d.-]*).*</expression>
-						<set field="name">
-							<entry valueGroup="1"/>
-						</set>
-						<set field="value">
-							<entry valueGroup="2"/>
-						</set>
-					</match>
-				</target>
-				<target type="property">
-					<match>
-						<expression flags="DOTALL">.*PROPERTY[\n]value:([\d.-]*)[\n]name:(\w*).*</expression>
-						<set field="name">
-							<entry valueGroup="2"/>
-						</set>
-						<set field="value">
-							<entry valueGroup="1"/>
-						</set>
-					</match>
-				</target>
-				<target type="attribute">
-					<match>
-						<expression flags="DOTALL">.*ATTRIBUTE[\n]name:(\w*)[\n]value:([\d.-]*).*</expression>
-						<set field="name">
-							<entry valueGroup="1"/>
-						</set>
-						<set field="value">
-							<entry valueGroup="2"/>
-						</set>
-					</match>
-				</target>
-				<target type="attribute">
-					<match>
-						<expression flags="DOTALL">.*ATTRIBUTE[\n]value:([\d.-]*)[\n]name:(\w*).*</expression>
-						<set field="name">
-							<entry valueGroup="2"/>
-						</set>
-						<set field="value">
-							<entry valueGroup="1"/>
-						</set>
-					</match>
-				</target>
-			</stdout-parser>
-		</start-up-command>
-		<!-- EXAMPLE 7: indeterminate number of property definitions, but on single line -->
-		<start-up-command name="test06PropertyDefsSingleLine">
-			<arg/>
-			<stdout-parser delim="\n">
-				<target type="property">
-					<match>
-						<expression expression="&lt;name&gt;(.*)&lt;/name&gt;&lt;value&gt;(.*)&lt;/value&gt;"/>
-						<set field="name">
-							<entry valueGroup="1"/>
-						</set>
-						<set field="value">
-							<entry valueGroup="2"/>
-						</set>
-					</match>
-				</target>
-			</stdout-parser>
-		</start-up-command>
-		<!-- EXAMPLE 8: looking for values interspersed in the stream but which will
-			not exceed 32 chars -->
-		<start-up-command name="test07JobStates">
-			<arg/>
-			<stdout-parser maxMatchLen="32">
-				<target ref="jobStates">
-					<match>
-						<expression flags="DOTALL">.*&lt;job&gt;([\d]*):([\w]*)&lt;/job&gt;.*</expression>
-						<put field="value">
-							<entry keyGroup="1" valueGroup="2"/>
-						</put>
-					</match>
-				</target>
-			</stdout-parser>
-		</start-up-command>
-		<!-- EXAMPLE 9: Successive names/values, in order, but staggered -->
-		<start-up-command name="test08Staggered">
-			<arg/>
-			<stdout-parser delim="\n">
-				<target type="property">
-					<match>
-						<expression>name:(.*)</expression>
-						<set field="name">
-							<entry valueGroup="1"/>
-						</set>
-					</match>
-					<match>
-						<expression>value:(.*)</expression>
-						<set field="value">
-							<entry valueGroup="1"/>
-						</set>
-					</match>
-				</target>
-			</stdout-parser>
-		</start-up-command>
-		<!-- EXAMPLE 10: forced merge -->
-		<start-up-command name="test09Merged">
-			<arg/>
-			<stdout-parser delim="\n">
-				<target type="property">
-					<match>
-						<expression>name:(.+);value:(.+)</expression>
-						<set field="name">
-							<entry valueGroup="1"/>
-						</set>
-						<set field="value">
-							<entry valueGroup="2"/>
-						</set>
-					</match>
-					<match>
-						<expression>name:(.+);default:(.+)</expression>
-						<set field="name">
-							<entry valueGroup="1"/>
-						</set>
-						<set field="default">
-							<entry valueGroup="2"/>
-						</set>
-					</match>
-				</target>
-			</stdout-parser>
-		</start-up-command>
-		<!-- EXAMPLE 11: exit-on -->
-		<start-up-command name="test10ExitOn">
-			<arg/>
-			<stdout-parser maxMatchLen="32">
-				<target ref="jobStates">
-					<match>
-						<expression flags="DOTALL">.*&lt;job&gt;([\d]*):([\w]*)&lt;/job&gt;.*</expression>
-						<put field="value">
-							<entry keyGroup="1" valueGroup="2"/>
-						</put>
-					</match>
-				</target>
-				<exit-on flags="DOTALL">.*EXIT.*</exit-on>
-			</stdout-parser>
-		</start-up-command>
-		<!-- EXAMPLE 12: exit-after -->
-		<start-up-command name="test11ExitAfter">
-			<arg/>
-			<stdout-parser maxMatchLen="32">
-				<target ref="jobStates">
-					<match>
-						<expression flags="DOTALL">.*&lt;job&gt;([\d]*):([\w]*)&lt;/job&gt;.*</expression>
-						<put field="value">
-							<entry keyGroup="1" valueGroup="2"/>
-						</put>
-					</match>
-				</target>
-				<exit-after flags="DOTALL">.*EXIT.*</exit-after>
-			</stdout-parser>
-		</start-up-command>
-		<submit-interactive name="empty">
-			<arg/>
-		</submit-interactive>
-		<get-job-status name="test12GetStatus">
-			<arg/>
-			<stdout-parser delim="\n">
-				<target ref="@jobId">
-					<match>
-						<expression>.+[\s]+.+[\s]+.+[\s]+.+[\s]+([A-Z])[\s]+.+</expression>
-						<set field="value">
-							<entry valueGroup="1"/>
-						</set>
-					</match>
-					<test op="EQ">
-						<value>#value</value>
-						<value>Q</value>
-						<set field="value">
-							<entry value="QUEUED_ACTIVE"/>
-						</set>
-					</test>
-					<test op="EQ">
-						<value>#value</value>
-						<value>R</value>
-						<set field="value">
-							<entry value="RUNNING"/>
-						</set>
-					</test>
-					<test op="EQ">
-						<value>#value</value>
-						<value>S</value>
-						<set field="value">
-							<entry value="SUSPENDED"/>
-						</set>
-					</test>
-					<test op="EQ">
-						<value>#value</value>
-						<value>C</value>
-						<set field="value">
-							<entry value="COMPLETED"/>
-						</set>
-					</test>
-					<test op="EQ">
-						<value>#value</value>
-						<value>E</value>
-						<set field="value">
-							<entry value="COMPLETED"/>
-						</set>
-					</test>
-					<test op="EQ">
-						<value>#value</value>
-						<value>H</value>
-						<set field="value">
-							<entry value="SYSTEM_ON_HOLD"/>
-						</set>
-					</test>
-				</target>
-			</stdout-parser>
-		</get-job-status>
-	</control-data>
-	<monitor-data schedulerType="test">
-      <driver>
-         <name></name>
-      </driver>
-   </monitor-data>
-</resource-manager-builder>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/plugin.xml b/rms/org.eclipse.ptp.rm.jaxb.tests/plugin.xml
deleted file mode 100644
index cc88ed9..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/plugin.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.ptp.rm.jaxb.core.JAXBResourceManagerConfigurations">
-      <JAXBResourceManagerConfiguration
-            configurationFile="data/tabbed-example.xml"
-            name="Tabbed Example">
-      </JAXBResourceManagerConfiguration>
-   </extension>
-
-</plugin>
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/JAXBTestsPlugin.java b/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/JAXBTestsPlugin.java
deleted file mode 100644
index 1f4cc65..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/JAXBTestsPlugin.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 University of Illinois 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: 
- * 	Albert L. Rossi - design and implementation
- ******************************************************************************/
-package org.eclipse.ptp.rm.jaxb.tests;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.net.URL;
-
-import org.eclipse.core.resources.ISaveContext;
-import org.eclipse.core.resources.ISaveParticipant;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ptp.core.Preferences;
-import org.eclipse.ptp.rm.core.RMCorePlugin;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCoreConstants;
-import org.eclipse.ptp.rm.jaxb.core.JAXBInitializationUtils;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.xml.sax.SAXException;
-
-public class JAXBTestsPlugin extends Plugin {
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.ptp.rm.jaxb.tests"; //$NON-NLS-1$
-
-	// The shared instance
-	private static JAXBTestsPlugin fPlugin;
-
-	/**
-	 * The constructor
-	 */
-	public JAXBTestsPlugin() {
-		fPlugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
-	 */
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		ResourcesPlugin.getWorkspace().addSaveParticipant(getUniqueIdentifier(), new ISaveParticipant() {
-			public void doneSaving(ISaveContext saveContext) {
-				// Nothing
-			}
-
-			public void prepareToSave(ISaveContext saveContext) throws CoreException {
-				// Nothing
-			}
-
-			public void rollback(ISaveContext saveContext) {
-				// Nothing
-			}
-
-			public void saving(ISaveContext saveContext) throws CoreException {
-				Preferences.savePreferences(getUniqueIdentifier());
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-	 */
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		try {
-			Preferences.savePreferences(getUniqueIdentifier());
-			ResourcesPlugin.getWorkspace().removeSaveParticipant(getUniqueIdentifier());
-		} finally {
-			super.stop(context);
-			fPlugin = null;
-		}
-	}
-
-	/**
-	 * Raise core exception.
-	 * 
-	 * @param message
-	 * @return
-	 */
-	public static CoreException coreErrorException(String message) {
-		return new CoreException(new Status(IStatus.ERROR, RMCorePlugin.getDefault().getBundle().getSymbolicName(), message));
-	}
-
-	/**
-	 * Raise core exception.
-	 * 
-	 * @param message
-	 * @param t
-	 * @return
-	 */
-	public static CoreException coreErrorException(String message, Throwable t) {
-		return new CoreException(new Status(IStatus.ERROR, RMCorePlugin.getDefault().getBundle().getSymbolicName(), message, t));
-	}
-
-	/**
-	 * Returns the shared instance
-	 * 
-	 * @return the shared instance
-	 */
-	public static JAXBTestsPlugin getDefault() {
-		return fPlugin;
-	}
-
-	public static JAXBTestsPlugin getfPlugin() {
-		return fPlugin;
-	}
-
-	public static URL getResource(String resource) throws IOException {
-		URL url = null;
-		if (getDefault() != null) {
-			Bundle bundle = getDefault().getBundle();
-			url = FileLocator.find(bundle, new Path(JAXBCoreConstants.PATH_SEP + resource), null);
-		} else {
-			url = new File(resource).toURL();
-		}
-		return url;
-	}
-
-	/**
-	 * Generate a unique identifier
-	 * 
-	 * @return unique identifier string
-	 */
-	public static String getUniqueIdentifier() {
-		if (getDefault() == null) {
-			return PLUGIN_ID;
-		}
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	public static URL getURL(String name) throws IOException {
-		URL instance = JAXBTestsPlugin.getResource(name);
-		if (instance == null) {
-			File f = new File(name);
-			if (f.exists() && f.isFile()) {
-				instance = f.toURL();
-			} else {
-				throw new FileNotFoundException(name);
-			}
-		}
-		return instance;
-	}
-
-	/**
-	 * Create log entry from an IStatus
-	 * 
-	 * @param status
-	 */
-	public static void log(IStatus status) {
-		getDefault().getLog().log(status);
-	}
-
-	/**
-	 * Create log entry from a string
-	 * 
-	 * @param msg
-	 */
-	public static void log(String msg) {
-		log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, msg, null));
-	}
-
-	/**
-	 * Create log entry from a Throwable
-	 * 
-	 * @param e
-	 */
-	public static void log(Throwable e) {
-		log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, e.getMessage(), e));
-	}
-
-	public static void validate(String xml) throws SAXException, IOException, URISyntaxException {
-		JAXBInitializationUtils.validate(getURL(xml));
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/ManagedFilesTest.java b/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/ManagedFilesTest.java
deleted file mode 100644
index f0c1764..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/ManagedFilesTest.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 University of Illinois 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: 
- * 	Albert L. Rossi - design and implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.jaxb.tests;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.ptp.remote.core.RemoteServicesDelegate;
-import org.eclipse.ptp.rm.jaxb.control.JAXBControlConstants;
-import org.eclipse.ptp.rm.jaxb.control.internal.runnable.ManagedFilesJob;
-import org.eclipse.ptp.rm.jaxb.control.internal.variables.RMVariableMap;
-import org.eclipse.ptp.rm.jaxb.control.runnable.ScriptHandler;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerControl;
-import org.eclipse.ptp.rm.jaxb.core.IVariableMap;
-import org.eclipse.ptp.rm.jaxb.core.JAXBInitializationUtils;
-import org.eclipse.ptp.rm.jaxb.core.data.AttributeType;
-import org.eclipse.ptp.rm.jaxb.core.data.ControlType;
-import org.eclipse.ptp.rm.jaxb.core.data.ManagedFileType;
-import org.eclipse.ptp.rm.jaxb.core.data.ManagedFilesType;
-import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;
-import org.eclipse.ptp.rm.jaxb.core.data.ResourceManagerData;
-import org.eclipse.ptp.rm.jaxb.core.data.ScriptType;
-import org.eclipse.ptp.rmsystem.IJobStatus;
-import org.eclipse.ptp.rmsystem.IResourceManagerComponentConfiguration;
-
-public class ManagedFilesTest extends TestCase implements IJAXBResourceManagerControl {
-
-	private static final String xml = JAXBControlConstants.DATA + "test-pbs.xml"; //$NON-NLS-1$
-	private static ControlType controlData;
-	private static Map<String, Object> env;
-	private static Map<String, String> live;
-	private static boolean verbose = false;
-	private RMVariableMap rmVarMap;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.IResourceManagerControl#control(java.lang.String
-	 * , java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void control(String jobId, String operation, IProgressMonitor monitor) throws CoreException {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rmsystem.IResourceManagerControl#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerControl#getAppendEnv()
-	 */
-	public boolean getAppendEnv() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.IResourceManagerControl#getControlConfiguration
-	 * ()
-	 */
-	public IResourceManagerComponentConfiguration getControlConfiguration() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerControl#getEnvironment()
-	 */
-	public IVariableMap getEnvironment() {
-		return rmVarMap;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.IResourceManagerControl#getJobStatus(java.lang
-	 * .String, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IJobStatus getJobStatus(String jobId, IProgressMonitor monitor) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerControl#getLaunchEnv()
-	 */
-	public Map<String, String> getLaunchEnv() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerControl#
-	 * getRemoteServicesDelegate(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public RemoteServicesDelegate getRemoteServicesDelegate(IProgressMonitor monitor) throws CoreException {
-		RemoteServicesDelegate d = new RemoteServicesDelegate(null, null);
-		d.initialize(monitor);
-		return d;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerControl#getState()
-	 */
-	public String getState() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerControl#jobStateChanged
-	 * (java.lang.String, org.eclipse.ptp.rmsystem.IJobStatus)
-	 */
-	public void jobStateChanged(String jobId, IJobStatus status) {
-	}
-
-	@Override
-	public void setUp() {
-		try {
-			JAXBTestsPlugin.validate(xml);
-			ResourceManagerData rmdata = JAXBInitializationUtils.initializeRMData(JAXBTestsPlugin.getURL(xml));
-			controlData = rmdata.getControlData();
-			rmVarMap = new RMVariableMap();
-			JAXBInitializationUtils.initializeMap(rmdata, rmVarMap);
-			env = rmVarMap.getVariables();
-			live = new HashMap<String, String>();
-			live.put("FOO_VAR_1", "FOO_VALUE_1"); //$NON-NLS-1$ //$NON-NLS-2$
-			live.put("FOO_VAR_2", "FOO_VALUE_2"); //$NON-NLS-1$ //$NON-NLS-2$
-			live.put("FOO_VAR_3", "FOO_VALUE_3"); //$NON-NLS-1$ //$NON-NLS-2$
-		} catch (Throwable t) {
-			t.printStackTrace();
-			assertNotNull(t);
-		}
-		setTestValues();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.IResourceManagerControl#start(org.eclipse.core
-	 * .runtime.IProgressMonitor)
-	 */
-	public void start(IProgressMonitor monitor) throws CoreException {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rmsystem.IResourceManagerControl#stop()
-	 */
-	public void stop() throws CoreException {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.IResourceManagerControl#submitJob(org.eclipse
-	 * .debug.core.ILaunchConfiguration, java.lang.String,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public String submitJob(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
-		return null;
-	}
-
-	@Override
-	public void tearDown() {
-		controlData = null;
-	}
-
-	public void testManagedFiles() {
-		composeScript();
-		if (verbose) {
-			PropertyType contents = (PropertyType) env.get(JAXBControlConstants.SCRIPT);
-			if (contents != null) {
-				System.out.println(contents.getValue());
-			}
-		}
-		ManagedFilesType files = controlData.getManagedFiles();
-		files = maybeAddManagedFileForScript(files);
-		assertNotNull(files);
-		try {
-			ManagedFilesJob job = new ManagedFilesJob(null, files, this);
-			job.schedule();
-			try {
-				job.join();
-			} catch (InterruptedException t) {
-				t.printStackTrace();
-			}
-		} catch (Throwable t) {
-			t.printStackTrace();
-			assertNotNull(t);
-		}
-	}
-
-	private void composeScript() {
-		ScriptType script = controlData.getScript();
-		assertNotNull(script);
-		ScriptHandler job = new ScriptHandler(null, script, rmVarMap, live, false);
-		job.schedule();
-		try {
-			job.join();
-		} catch (InterruptedException t) {
-			t.printStackTrace();
-		}
-
-		PropertyType contents = (PropertyType) env.get(JAXBControlConstants.SCRIPT);
-		assertNotNull(contents);
-	}
-
-	private ManagedFilesType maybeAddManagedFileForScript(ManagedFilesType files) {
-		PropertyType scriptVar = (PropertyType) rmVarMap.get(JAXBControlConstants.SCRIPT);
-		PropertyType scriptPathVar = (PropertyType) rmVarMap.get(JAXBControlConstants.SCRIPT_PATH);
-		if (scriptVar != null || scriptPathVar != null) {
-			if (files == null) {
-				files = new ManagedFilesType();
-				files.setFileStagingLocation(JAXBControlConstants.ECLIPSESETTINGS);
-			}
-			List<ManagedFileType> fileList = files.getFile();
-			ManagedFileType scriptFile = null;
-			if (!fileList.isEmpty()) {
-				for (ManagedFileType f : fileList) {
-					if (f.getName().equals(JAXBControlConstants.SCRIPT_FILE)) {
-						scriptFile = f;
-						break;
-					}
-				}
-			}
-			if (scriptFile == null) {
-				scriptFile = new ManagedFileType();
-				scriptFile.setName(JAXBControlConstants.SCRIPT_FILE);
-				fileList.add(scriptFile);
-			}
-			scriptFile.setResolveContents(false);
-			scriptFile.setUniqueIdPrefix(true);
-			if (scriptPathVar != null) {
-				scriptFile.setPath(String.valueOf(scriptPathVar.getValue()));
-				scriptFile.setDeleteSourceAfterUse(false);
-			} else {
-				scriptFile.setContents(JAXBControlConstants.OPENVRM + JAXBControlConstants.SCRIPT + JAXBControlConstants.PD
-						+ JAXBControlConstants.VALUE + JAXBControlConstants.CLOSV);
-				scriptFile.setDeleteSourceAfterUse(true);
-			}
-		}
-		return files;
-	}
-
-	private void putValue(String name, String value) {
-		PropertyType p = new PropertyType();
-		p.setName(name);
-		p.setValue(value);
-		env.put(name, p);
-	}
-
-	private void setTestValues() {
-		for (String key : env.keySet()) {
-			Object target = env.get(key);
-			String value = key + "_TEST_VALUE"; //$NON-NLS-1$
-			if (target instanceof PropertyType) {
-				((PropertyType) target).setValue(value);
-			} else if (target instanceof AttributeType) {
-				((AttributeType) target).setValue(value);
-			}
-		}
-		putValue(JAXBControlConstants.CONTROL_USER_VAR, "fooUser"); //$NON-NLS-1$
-		putValue(JAXBControlConstants.CONTROL_ADDRESS_VAR, "abe.ncsa.uiuc.edu"); //$NON-NLS-1$
-		putValue(JAXBControlConstants.DIRECTORY, "/u/ncsa/arossi/test"); //$NON-NLS-1$ 
-		putValue(JAXBControlConstants.MPI_CMD, "mpiexec"); //$NON-NLS-1$ 
-		putValue(JAXBControlConstants.MPI_ARGS, "-np 8"); //$NON-NLS-1$ 
-		putValue(JAXBControlConstants.EXEC_PATH, "/u/ncsa/arossi/test/foo"); //$NON-NLS-1$ 
-		if (verbose) {
-			RMDataTest.print(rmVarMap);
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/Messages.java b/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/Messages.java
deleted file mode 100644
index a1864e3..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/Messages.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 University of Illinois 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: 
- * 	Albert L. Rossi - design and implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.jaxb.tests;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rm.jaxb.tests.messages"; //$NON-NLS-1$
-	public static String RMVariableTest_1;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/RMDataTest.java b/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/RMDataTest.java
deleted file mode 100644
index 957c603..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/RMDataTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 University of Illinois 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: 
- * 	Albert L. Rossi - design and implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.jaxb.tests;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ptp.rm.jaxb.control.internal.variables.RMVariableMap;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCoreConstants;
-import org.eclipse.ptp.rm.jaxb.core.JAXBInitializationUtils;
-import org.eclipse.ptp.rm.jaxb.core.data.AttributeType;
-import org.eclipse.ptp.rm.jaxb.core.data.CommandType;
-import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;
-import org.eclipse.ptp.rm.jaxb.core.data.ResourceManagerData;
-
-public class RMDataTest extends TestCase {
-
-	private static final String rmxml = JAXBCoreConstants.DATA + "test-pbs.xml"; //$NON-NLS-1$
-	private static final String tokxml = JAXBCoreConstants.DATA + "tokenizer-examples.xml"; //$NON-NLS-1$
-
-	@Override
-	public void setUp() {
-
-	}
-
-	@Override
-	public void tearDown() {
-
-	}
-
-	public void testJAXBRMInstantiation() {
-		ResourceManagerData rmdata = null;
-		try {
-			JAXBTestsPlugin.validate(rmxml);
-			rmdata = JAXBInitializationUtils.initializeRMData(JAXBTestsPlugin.getURL(rmxml));
-			if (rmdata != null) {
-				RMVariableMap map = new RMVariableMap();
-				JAXBInitializationUtils.initializeMap(rmdata, map);
-				print(map);
-				String exp = map.getString(null, "${rm:stagein#description}"); //$NON-NLS-1$
-				System.out.println(exp);
-				assertEquals(Messages.RMVariableTest_1, exp);
-			}
-		} catch (Throwable t) {
-			t.printStackTrace();
-			assert (t != null);
-		}
-	}
-
-	public void testJAXBTokenizerInstantiation() {
-		ResourceManagerData rmdata = null;
-		try {
-			JAXBTestsPlugin.validate(tokxml);
-			rmdata = JAXBInitializationUtils.initializeRMData(JAXBTestsPlugin.getURL(tokxml));
-			if (rmdata != null) {
-				List<CommandType> cmds = rmdata.getControlData().getStartUpCommand();
-				for (CommandType cmd : cmds) {
-					System.out.println(cmd.getName());
-				}
-			}
-		} catch (Throwable t) {
-			t.printStackTrace();
-			assert (t != null);
-		}
-	}
-
-	static void print(RMVariableMap map) {
-		StringBuffer buffer = new StringBuffer();
-		for (Iterator<Map.Entry<String, Object>> i = map.getVariables().entrySet().iterator(); i.hasNext();) {
-			Map.Entry<String, Object> e = i.next();
-			Object o = e.getValue();
-			if (o instanceof AttributeType) {
-				AttributeType ja = (AttributeType) o;
-				buffer.append(JAXBCoreConstants.LT).append(ja.getName()).append(JAXBCoreConstants.GTLT).append(ja.getType())
-						.append(JAXBCoreConstants.GTLT).append(ja.getDefault()).append(JAXBCoreConstants.GTLT).append(ja.getChoice())
-						.append(JAXBCoreConstants.GTLT).append(ja.getMax()).append(JAXBCoreConstants.GTLT).append(ja.getMin())
-						.append(JAXBCoreConstants.GTLT).append(ja.getValidator()).append(JAXBCoreConstants.GTLT)
-						.append(ja.getDescription()).append(JAXBCoreConstants.GTLT).append(ja.getTooltip()).append(ja.getValue())
-						.append(JAXBCoreConstants.GT).append(JAXBCoreConstants.LINE_SEP);
-			} else if (o instanceof PropertyType) {
-				PropertyType p = (PropertyType) o;
-				buffer.append(JAXBCoreConstants.LT).append(p.getName()).append(JAXBCoreConstants.GTLT).append(p.getValue())
-						.append(JAXBCoreConstants.GT).append(JAXBCoreConstants.LINE_SEP);
-			} else {
-				buffer.append(JAXBCoreConstants.LT).append(e.getKey()).append(JAXBCoreConstants.GTLT).append(e.getValue())
-						.append(JAXBCoreConstants.GT).append(JAXBCoreConstants.LINE_SEP);
-			}
-		}
-		System.out.println(buffer);
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/RMLaunchTest.java b/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/RMLaunchTest.java
deleted file mode 100644
index aff5ee9..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/RMLaunchTest.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 University of Illinois 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: 
- * 	Albert L. Rossi - design and implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.jaxb.tests;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-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.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchDelegate;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.IStreamListener;
-import org.eclipse.debug.core.model.IStreamMonitor;
-import org.eclipse.ptp.core.IPTPLaunchConfigurationConstants;
-import org.eclipse.ptp.core.PTPCorePlugin;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.IRemoteConnectionManager;
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
-import org.eclipse.ptp.rm.jaxb.control.JAXBControlConstants;
-import org.eclipse.ptp.rm.jaxb.control.JAXBResourceManagerConfiguration;
-import org.eclipse.ptp.rm.jaxb.control.JAXBResourceManagerControl;
-import org.eclipse.ptp.rm.jaxb.core.IVariableMap;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCoreConstants;
-import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;
-import org.eclipse.ptp.rm.lml.monitor.core.LMLResourceManagerMonitor;
-import org.eclipse.ptp.rm.lml_jaxb.core.LMLJAXBResourceManager;
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerConfiguration;
-import org.eclipse.ptp.rmsystem.IJobStatus;
-import org.eclipse.ptp.rmsystem.ResourceManagerServiceProvider;
-
-public class RMLaunchTest extends TestCase {
-
-	private class TestLaunchConfiguration implements ILaunchConfiguration {
-
-		private final Map<String, Object> store = new TreeMap<String, Object>();
-
-		public boolean contentsEqual(ILaunchConfiguration configuration) {
-			return false;
-		}
-
-		public ILaunchConfigurationWorkingCopy copy(String name) throws CoreException {
-			return null;
-		}
-
-		public void delete() throws CoreException {
-		}
-
-		public boolean exists() {
-			return false;
-		}
-
-		@SuppressWarnings("rawtypes")
-		public Object getAdapter(Class adapter) {
-			return null;
-		}
-
-		public boolean getAttribute(String attributeName, boolean defaultValue) throws CoreException {
-			Boolean value = (Boolean) store.get(attributeName);
-			if (value == null) {
-				value = defaultValue;
-			}
-			return value;
-		}
-
-		public int getAttribute(String attributeName, int defaultValue) throws CoreException {
-			Integer value = (Integer) store.get(attributeName);
-			if (value == null) {
-				value = defaultValue;
-			}
-			return value;
-		}
-
-		@SuppressWarnings("rawtypes")
-		public List getAttribute(String attributeName, List defaultValue) throws CoreException {
-			List value = (List) store.get(attributeName);
-			if (value == null) {
-				value = defaultValue;
-			}
-			return value;
-		}
-
-		@SuppressWarnings("rawtypes")
-		public Map getAttribute(String attributeName, Map defaultValue) throws CoreException {
-			Map value = (Map) store.get(attributeName);
-			if (value == null) {
-				value = defaultValue;
-			}
-			return value;
-		}
-
-		@SuppressWarnings("rawtypes")
-		public Set getAttribute(String attributeName, Set defaultValue) throws CoreException {
-			Set value = (Set) store.get(attributeName);
-			if (value == null) {
-				value = defaultValue;
-			}
-			return value;
-		}
-
-		public String getAttribute(String attributeName, String defaultValue) throws CoreException {
-			String value = (String) store.get(attributeName);
-			if (value == null) {
-				value = defaultValue;
-			}
-			return value;
-		}
-
-		@SuppressWarnings("rawtypes")
-		public Map getAttributes() throws CoreException {
-			return store;
-		}
-
-		public String getCategory() throws CoreException {
-			return null;
-		}
-
-		public IFile getFile() {
-			return null;
-		}
-
-		public IPath getLocation() {
-			return null;
-		}
-
-		public IResource[] getMappedResources() throws CoreException {
-			return null;
-		}
-
-		public String getMemento() throws CoreException {
-			return null;
-		}
-
-		@SuppressWarnings("rawtypes")
-		public Set getModes() throws CoreException {
-			return null;
-		}
-
-		public String getName() {
-			return null;
-		}
-
-		@SuppressWarnings("rawtypes")
-		public ILaunchDelegate getPreferredDelegate(Set modes) throws CoreException {
-			return null;
-		}
-
-		public ILaunchConfigurationType getType() throws CoreException {
-			return null;
-		}
-
-		public ILaunchConfigurationWorkingCopy getWorkingCopy() throws CoreException {
-			return null;
-		}
-
-		public boolean hasAttribute(String attributeName) throws CoreException {
-			return false;
-		}
-
-		public boolean isLocal() {
-			return false;
-		}
-
-		public boolean isMigrationCandidate() throws CoreException {
-			return false;
-		}
-
-		public boolean isReadOnly() {
-			return false;
-		}
-
-		public boolean isWorkingCopy() {
-			return false;
-		}
-
-		public ILaunch launch(String mode, IProgressMonitor monitor) throws CoreException {
-			return null;
-		}
-
-		public ILaunch launch(String mode, IProgressMonitor monitor, boolean build) throws CoreException {
-			return null;
-		}
-
-		public ILaunch launch(String mode, IProgressMonitor monitor, boolean build, boolean register) throws CoreException {
-			return null;
-		}
-
-		public void migrate() throws CoreException {
-
-		}
-
-		public boolean supportsMode(String mode) throws CoreException {
-			return false;
-		}
-	}
-
-	private static final String xml = JAXBCoreConstants.DATA + "test-pbs.xml"; //$NON-NLS-1$
-	private JAXBResourceManagerConfiguration rmConfig;
-	private LMLJAXBResourceManager rm;
-	private ILaunchConfiguration launchConfig;
-
-	@Override
-	public void setUp() {
-		/*
-		 * You will need to copy all the executables in the
-		 * org.eclipse.ptp.rm.jaxb.tests/data directory to you home; it seems
-		 * the JUnit plugin runner does not actually execute in the directory
-		 * indicated by the Run Configuration.
-		 */
-	}
-
-	@Override
-	public void tearDown() {
-	}
-
-	public void testResourceManager() {
-		Job j = new Job("testResourceManager") { //$NON-NLS-1$
-			@Override
-			protected IStatus run(IProgressMonitor monitor) {
-				try {
-					emulateConfigureWizard();
-					rm = new LMLJAXBResourceManager(rmConfig, new JAXBResourceManagerControl(rmConfig),
-							new LMLResourceManagerMonitor(rmConfig));
-					PTPCorePlugin.getDefault().getModelManager().addResourceManager(rm);
-					rm.start(monitor);
-					try {
-						Thread.sleep(2000);
-					} catch (InterruptedException ignored) {
-					}
-					emulateLaunchTab();
-					String jobId = rm.submitJob(launchConfig, ILaunchManager.RUN_MODE, monitor);
-					System.out.println("SUBMITTED: " + jobId); //$NON-NLS-1$
-					IJobStatus status = rm.getJobStatus(jobId, null);
-					System.out.println("STATUS: " + status.getState()); //$NON-NLS-1$
-					if (status != null) {
-						status.getStreamsProxy().getOutputStreamMonitor().addListener(new IStreamListener() {
-							public void streamAppended(String text, IStreamMonitor monitor) {
-								System.out.println(text);
-							}
-						});
-					}
-					rm.stop();
-				} catch (Throwable t) {
-					t.printStackTrace();
-					assertNotNull(t);
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		j.schedule();
-		try {
-			j.join();
-		} catch (InterruptedException ignored) {
-		}
-	}
-
-	/*
-	 * We do here what is done through the wizard.
-	 */
-	private void emulateConfigureWizard() throws Throwable {
-		rmConfig = new JAXBResourceManagerConfiguration(AbstractResourceManagerConfiguration.BASE,
-				new ResourceManagerServiceProvider());
-		// JAXBRMConfigurationSelectionWizardPage
-		rmConfig.setRMConfigurationURL(JAXBTestsPlugin.getURL(xml));
-		// JAXBRMControlConfigurationWizardPage
-		rmConfig.getResourceManagerData();
-		// use remote = local
-		IRemoteServices localServices = PTPRemoteCorePlugin.getDefault().getDefaultServices();
-		assert (localServices != null);
-		IRemoteConnectionManager localConnectionManager = localServices.getConnectionManager();
-		assert (localConnectionManager != null);
-		IRemoteConnection localConnection = localConnectionManager.getConnection(IRemoteConnectionManager.DEFAULT_CONNECTION_NAME);
-		assert (localConnection != null);
-		rmConfig.setRemoteServicesId(localServices.getId());
-		rmConfig.setConnectionName(localConnection.getName());
-	}
-
-	@SuppressWarnings("unchecked")
-	private void emulateLaunchTab() throws Throwable {
-		launchConfig = new TestLaunchConfiguration();
-		Map<Object, Object> env = launchConfig.getAttributes();
-		Map<String, String> live = new HashMap<String, String>();
-		live.put("FOO_VAR_1", "FOO_VALUE_1"); //$NON-NLS-1$ //$NON-NLS-2$
-		live.put("FOO_VAR_2", "FOO_VALUE_2"); //$NON-NLS-1$ //$NON-NLS-2$
-		live.put("FOO_VAR_3", "FOO_VALUE_3"); //$NON-NLS-1$ //$NON-NLS-2$
-		env.put(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, live);
-		env.put(ILaunchManager.ATTR_APPEND_ENVIRONMENT_VARIABLES, true);
-		env.put(IPTPLaunchConfigurationConstants.ATTR_WORKING_DIR, "/u/ncsa/arossi/test"); //$NON-NLS-1$
-		env.put(IPTPLaunchConfigurationConstants.ATTR_EXECUTABLE_PATH, "/u/ncsa/arossi/test/foo"); //$NON-NLS-1$
-		env.put(IPTPLaunchConfigurationConstants.ATTR_ARGUMENTS, "-v -f /u/ncsa/arossi/test/data"); //$NON-NLS-1$
-		env.put("Job_Name", "TestRMLaunch"); //$NON-NLS-1$ //$NON-NLS-2$
-		env.put("Resource_List.nodes", "1:ppn=8"); //$NON-NLS-1$ //$NON-NLS-2$
-		env.put("Resource_List.walltime", "00:10:00"); //$NON-NLS-1$ //$NON-NLS-2$
-		env.put("export_all", true); //$NON-NLS-1$
-		env.put(JAXBControlConstants.MPI_CMD, "mpiexec"); //$NON-NLS-1$ 
-		env.put(JAXBControlConstants.MPI_ARGS, "-machinefile $PBS_NODEFILE -np 8"); //$NON-NLS-1$ 
-		IVariableMap rmVarMap = rm.getJAXBConfiguration().getRMVariableMap();
-		PropertyType queues = (PropertyType) rmVarMap.getVariables().get("available_queues"); //$NON-NLS-1$ 
-		if (queues != null) {
-			List<String> q = (List<String>) queues.getValue();
-			env.put("destination", q.get(0)); //$NON-NLS-1$
-		}
-		env.put("directory", "/Users/arossi"); //$NON-NLS-1$//$NON-NLS-2$
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/StreamParserTest.java b/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/StreamParserTest.java
deleted file mode 100644
index a18d4d3..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/StreamParserTest.java
+++ /dev/null
@@ -1,519 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 University of Illinois 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: 
- * 	Albert L. Rossi - design and implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.jaxb.tests;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ptp.rm.jaxb.control.JAXBControlConstants;
-import org.eclipse.ptp.rm.jaxb.control.internal.IStreamParserTokenizer;
-import org.eclipse.ptp.rm.jaxb.control.internal.runnable.command.ConfigurableRegexTokenizer;
-import org.eclipse.ptp.rm.jaxb.control.internal.variables.RMVariableMap;
-import org.eclipse.ptp.rm.jaxb.core.JAXBInitializationUtils;
-import org.eclipse.ptp.rm.jaxb.core.data.AttributeType;
-import org.eclipse.ptp.rm.jaxb.core.data.CommandType;
-import org.eclipse.ptp.rm.jaxb.core.data.ControlType;
-import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;
-import org.eclipse.ptp.rm.jaxb.core.data.ResourceManagerData;
-import org.eclipse.ptp.rm.jaxb.core.data.TokenizerType;
-
-public class StreamParserTest extends TestCase {
-
-	protected class Range {
-
-		private final String expression;
-		private int[] from;
-		private int[] to;
-		private int len;
-
-		public Range(String expression) {
-			assert (null != rmVarMap);
-			this.expression = rmVarMap.getString(uuid, expression);
-		}
-
-		public List<Object> findInRange(String[] values) {
-			List<Object> found = new ArrayList<Object>();
-			for (int i = 0; i < from.length; i++) {
-				if (from[i] == to[i]) {
-					found.add(values[from[i]]);
-				} else {
-					for (int j = from[i]; j < to[i]; j++) {
-						found.add(values[j]);
-					}
-				}
-			}
-			return found;
-		}
-
-		public boolean isInRange(int line) {
-			for (int i = 0; i < from.length; i++) {
-				if ((from[i] == line && line <= to[i]) || (from[i] < line && line < to[i])) {
-					return true;
-				}
-			}
-			return false;
-		}
-
-		public void setLen(int len) {
-			this.len = len;
-			parse(expression);
-		}
-
-		private int maybeInterpretLength(String n) {
-			int i = -1;
-			if (n.indexOf(JAXBControlConstants.LEN) >= 0) {
-				String[] lenExp = n.split(JAXBControlConstants.HYPH);
-				if (lenExp.length == 2) {
-					i = len - Integer.parseInt(lenExp[1]);
-				} else {
-					i = len;
-				}
-			} else {
-				i = Integer.parseInt(n.trim());
-			}
-			return i;
-		}
-
-		private void parse(String expression) {
-			List<String> from = new ArrayList<String>();
-			List<String> to = new ArrayList<String>();
-			String[] commas = expression.split(JAXBControlConstants.CM);
-			for (int i = 0; i < commas.length; i++) {
-				String[] colon = commas[i].split(JAXBControlConstants.CO);
-				if (colon.length == 2) {
-					from.add(colon[0]);
-					to.add(colon[1]);
-				} else {
-					from.add(colon[0]);
-					to.add(colon[0]);
-				}
-			}
-
-			this.from = new int[from.size()];
-			this.to = new int[from.size()];
-
-			for (int i = 0; i < this.from.length; i++) {
-				this.from[i] = maybeInterpretLength(from.get(i).trim());
-				this.to[i] = maybeInterpretLength(to.get(i).trim());
-			}
-		}
-	}
-
-	private static final String tokxml = JAXBControlConstants.DATA + "tokenizer-examples.xml"; //$NON-NLS-1$
-
-	private String uuid;
-	private String lineRange;
-	private boolean[] oracle;
-	private String[] values;
-	private final boolean verbose = true;
-	private String target;
-	private List<CommandType> startup;
-	private CommandType getStatus;
-	private RMVariableMap rmVarMap;
-
-	@Override
-	public void setUp() {
-		rmVarMap = new RMVariableMap();
-		String name = getName();
-		if (name.equals("testRange")) { //$NON-NLS-1$
-			// the second number is <, not <=
-			lineRange = "3,8,12:15,21, 24:29,40:N-3"; //$NON-NLS-1$
-			oracle = new boolean[] { false, false, false, true, false, false, false, false, true, false, false, false, true, true,
-					true, false, false, false, false, false, false, true, false, false, true, true, true, true, true, false, false,
-					false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, false,
-					false, false };
-			values = new String[oracle.length];
-		} else {
-			try {
-				JAXBTestsPlugin.validate(tokxml);
-				ResourceManagerData rmdata = JAXBInitializationUtils.initializeRMData(JAXBTestsPlugin.getURL(tokxml));
-				if (rmdata != null) {
-					ControlType cd = rmdata.getControlData();
-					startup = cd.getStartUpCommand();
-					getStatus = cd.getGetJobStatus();
-				}
-			} catch (Throwable t) {
-				t.printStackTrace();
-				assert (t != null);
-			}
-		}
-	}
-
-	@Override
-	public void tearDown() {
-
-	}
-
-	public void test00ParseQstat() {
-		target = "available_queues"; //$NON-NLS-1$
-		PropertyType p = new PropertyType();
-		p.setName(target);
-		rmVarMap.getVariables().put(target, p);
-		runTokenizer(startup.get(0).getStdoutParser(), getQstatOut());
-		p = (PropertyType) rmVarMap.getVariables().get(target);
-		assertNotNull(p);
-		assertNotNull(p.getValue());
-		if (verbose) {
-			System.out.println(target + " = " + p.getValue()); //$NON-NLS-1$
-		}
-	}
-
-	public void test01JobId() {
-		uuid = UUID.randomUUID().toString();
-		target = uuid;
-		PropertyType p = new PropertyType();
-		p.setName(target);
-		p.setValue(target);
-		rmVarMap.getVariables().put(target, p);
-		runTokenizer(startup.get(1).getStdoutParser(), getNoiseBeforeJobId());
-		p = (PropertyType) rmVarMap.getVariables().get(target);
-		assertNotNull(p);
-		assertNotNull(p.getValue());
-		if (verbose) {
-			System.out.println(target + " = " + p.getValue()); //$NON-NLS-1$
-		}
-	}
-
-	public void test02OpenMPI() {
-		target = JAXBControlConstants.ATTRIBUTE;
-		runTokenizer(startup.get(2).getStdoutParser(), getOpenMPIOut());
-		Map<String, Object> d = rmVarMap.getDiscovered();
-		for (Object o : d.values()) {
-			AttributeType ja = (AttributeType) o;
-			if (verbose) {
-				System.out.println("DISCOVERED JAXBRMConstants.ATTRIBUTE:"); //$NON-NLS-1$
-				System.out.println("name " + ja.getName()); //$NON-NLS-1$
-				System.out.println("value " + ja.getValue()); //$NON-NLS-1$
-				System.out.println("tooltip " + ja.getTooltip()); //$NON-NLS-1$
-				System.out.println("status " + ja.getStatus()); //$NON-NLS-1$
-				System.out.println("readOnly " + ja.isReadOnly()); //$NON-NLS-1$
-				System.out.println("*********************************"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	public void test03ImplicitWithTags() {
-		runTokenizer(startup.get(3).getStdoutParser(), getImplicitWithTags());
-		Map<String, Object> d = rmVarMap.getDiscovered();
-		for (Object o : d.values()) {
-			if (o instanceof PropertyType) {
-				PropertyType p = (PropertyType) o;
-				if (verbose) {
-					System.out.println("DISCOVERED JAXBRMConstants.PROPERTY:"); //$NON-NLS-1$
-					System.out.println("name " + p.getName()); //$NON-NLS-1$
-					System.out.println("value " + p.getValue()); //$NON-NLS-1$
-					System.out.println("*********************************"); //$NON-NLS-1$
-				}
-			} else if (o instanceof AttributeType) {
-				AttributeType ja = (AttributeType) o;
-				if (verbose) {
-					System.out.println("DISCOVERED JAXBRMConstants.ATTRIBUTE:"); //$NON-NLS-1$
-					System.out.println("name " + ja.getName()); //$NON-NLS-1$
-					System.out.println("value " + ja.getValue()); //$NON-NLS-1$
-					System.out.println("*********************************"); //$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-	public void test04ImplicitOrdering() {
-		target = JAXBControlConstants.ATTRIBUTE;
-		runTokenizer(startup.get(4).getStdoutParser(), getImplicitOrdering());
-		Map<String, Object> d = rmVarMap.getDiscovered();
-		for (Object o : d.values()) {
-			AttributeType ja = (AttributeType) o;
-			if (verbose) {
-				System.out.println("DISCOVERED JAXBRMConstants.ATTRIBUTE:"); //$NON-NLS-1$
-				System.out.println("name " + ja.getName()); //$NON-NLS-1$
-				System.out.println("type " + ja.getType()); //$NON-NLS-1$
-				System.out.println("tooltip " + ja.getTooltip()); //$NON-NLS-1$
-				System.out.println("description " + ja.getDescription()); //$NON-NLS-1$
-				System.out.println("value " + ja.getValue()); //$NON-NLS-1$
-				System.out.println("*********************************"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	public void test05ImplicitWithTagsDotall() {
-		runTokenizer(startup.get(5).getStdoutParser(), getImplicitWithTags());
-		Map<String, Object> d = rmVarMap.getDiscovered();
-		for (Object o : d.values()) {
-			if (o instanceof PropertyType) {
-				PropertyType p = (PropertyType) o;
-				if (verbose) {
-					System.out.println("DISCOVERED JAXBRMConstants.PROPERTY:"); //$NON-NLS-1$
-					System.out.println("name " + p.getName()); //$NON-NLS-1$
-					System.out.println("value " + p.getValue()); //$NON-NLS-1$
-					System.out.println("*********************************"); //$NON-NLS-1$
-				}
-			} else if (o instanceof AttributeType) {
-				AttributeType ja = (AttributeType) o;
-				if (verbose) {
-					System.out.println("DISCOVERED JAXBRMConstants.ATTRIBUTE:"); //$NON-NLS-1$
-					System.out.println("name " + ja.getName()); //$NON-NLS-1$
-					System.out.println("value " + ja.getValue()); //$NON-NLS-1$
-					System.out.println("*********************************"); //$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-	public void test06PropertyDefsSingleLine() {
-		target = JAXBControlConstants.PROPERTY;
-		runTokenizer(startup.get(6).getStdoutParser(), getPropertyDefs());
-		Map<String, Object> d = rmVarMap.getDiscovered();
-		for (Object o : d.values()) {
-			PropertyType p = (PropertyType) o;
-			if (verbose) {
-				System.out.println("DISCOVERED JAXBRMConstants.PROPERTY:"); //$NON-NLS-1$
-				System.out.println("name " + p.getName()); //$NON-NLS-1$
-				System.out.println("value " + p.getValue()); //$NON-NLS-1$
-				System.out.println("*********************************"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	public void test07JobStates() {
-		target = "jobStates"; //$NON-NLS-1$
-		PropertyType p = new PropertyType();
-		p.setName(target);
-		rmVarMap.getVariables().put(target, p);
-		runTokenizer(startup.get(7).getStdoutParser(), getJobStates());
-		p = (PropertyType) rmVarMap.getVariables().get(target);
-		assertNotNull(p);
-		assertNotNull(p.getValue());
-		if (verbose) {
-			System.out.println(target + " = " + p.getValue()); //$NON-NLS-1$
-		}
-	}
-
-	public void test08Staggered() {
-		runTokenizer(startup.get(8).getStdoutParser(), getStaggered());
-		Map<String, Object> d = rmVarMap.getDiscovered();
-		for (Object o : d.values()) {
-			if (o instanceof PropertyType) {
-				PropertyType p = (PropertyType) o;
-				if (verbose) {
-					System.out.println("DISCOVERED JAXBRMConstants.PROPERTY:"); //$NON-NLS-1$
-					System.out.println("name " + p.getName()); //$NON-NLS-1$
-					System.out.println("value " + p.getValue()); //$NON-NLS-1$
-					System.out.println("*********************************"); //$NON-NLS-1$
-				}
-			} else if (o instanceof AttributeType) {
-				AttributeType ja = (AttributeType) o;
-				if (verbose) {
-					System.out.println("DISCOVERED JAXBRMConstants.ATTRIBUTE:"); //$NON-NLS-1$
-					System.out.println("name " + ja.getName()); //$NON-NLS-1$
-					System.out.println("value " + ja.getValue()); //$NON-NLS-1$
-					System.out.println("*********************************"); //$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-	public void test09Merged() {
-		target = JAXBControlConstants.PROPERTY;
-		runTokenizer(startup.get(9).getStdoutParser(), getMergedOrdering());
-		Map<String, Object> d = rmVarMap.getDiscovered();
-		for (Object o : d.values()) {
-			PropertyType p = (PropertyType) o;
-			if (verbose) {
-				System.out.println("DISCOVERED JAXBRMConstants.PROPERTY:"); //$NON-NLS-1$
-				System.out.println("name " + p.getName()); //$NON-NLS-1$
-				System.out.println("value " + p.getValue()); //$NON-NLS-1$
-				System.out.println("default " + p.getDefault()); //$NON-NLS-1$
-				System.out.println("*********************************"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	public void test10ExitOn() {
-		target = "jobStates"; //$NON-NLS-1$
-		PropertyType p = new PropertyType();
-		p.setName(target);
-		rmVarMap.getVariables().put(target, p);
-		runTokenizer(startup.get(10).getStdoutParser(), getJobStates());
-		p = (PropertyType) rmVarMap.getVariables().get(target);
-		assertNotNull(p);
-		assertNotNull(p.getValue());
-		if (verbose) {
-			System.out.println(target + " = " + p.getValue()); //$NON-NLS-1$
-		}
-	}
-
-	public void test11ExitAfter() {
-		target = "jobStates"; //$NON-NLS-1$
-		PropertyType p = new PropertyType();
-		p.setName(target);
-		rmVarMap.getVariables().put(target, p);
-		runTokenizer(startup.get(11).getStdoutParser(), getJobStates());
-		p = (PropertyType) rmVarMap.getVariables().get(target);
-		assertNotNull(p);
-		assertNotNull(p.getValue());
-		if (verbose) {
-			System.out.println(target + " = " + p.getValue()); //$NON-NLS-1$
-		}
-	}
-
-	public void test12GetStatus() {
-		target = "42226";//$NON-NLS-1$
-		uuid = target;
-		PropertyType p = new PropertyType();
-		p.setName(target);
-		rmVarMap.getVariables().put(target, p);
-		runTokenizer(getStatus.getStdoutParser(), getQstat());
-		p = (PropertyType) rmVarMap.getVariables().get(this.target);
-		assertNotNull(p);
-		System.out.println(p.getName() + JAXBControlConstants.CM + JAXBControlConstants.SP + p.getValue());
-	}
-
-	public void testRange() {
-		Range range = new Range(lineRange);
-		range.setLen(50);
-		int trues = 0;
-
-		for (int i = 0; i < 50; i++) {
-			boolean b = range.isInRange(i);
-			if (oracle[i]) {
-				trues++;
-			}
-			if (verbose) {
-				System.out.println(" line " + i + " in range: " + b + ", should be " + oracle[i]); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			assertEquals(oracle[i], b);
-			values[i] = "" + oracle[i]; //$NON-NLS-1$
-		}
-
-		List<Object> valid = range.findInRange(values);
-		for (Object o : valid) {
-			assertEquals("true", o); //$NON-NLS-1$
-			assertEquals(trues, valid.size());
-		}
-	}
-
-	private void runTokenizer(TokenizerType tokenizer, InputStream stream) {
-		IStreamParserTokenizer t = new ConfigurableRegexTokenizer(uuid, tokenizer, rmVarMap, null);
-		t.setInputStream(stream);
-		Thread thr = new Thread(t);
-		thr.start();
-		try {
-			thr.join();
-		} catch (InterruptedException ignored) {
-		}
-		Throwable throwable = t.getInternalError();
-		if (throwable != null) {
-			throwable.printStackTrace();
-		}
-		assertNull(throwable);
-	}
-
-	private static InputStream getImplicitOrdering() {
-		String content = "jobAttribute_1" + JAXBControlConstants.LINE_SEP + "java.lang.String" + JAXBControlConstants.LINE_SEP + JAXBControlConstants.LINE_SEP + JAXBControlConstants.LINE_SEP + "value_1" + JAXBControlConstants.LINE_SEP //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				+ "jobAttribute_2" + JAXBControlConstants.LINE_SEP + "java.lang.String" + JAXBControlConstants.LINE_SEP + "meaingless attribute" + JAXBControlConstants.LINE_SEP //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				+ "ignore this attribute" + JAXBControlConstants.LINE_SEP + "value_2" //$NON-NLS-1$ //$NON-NLS-2$
-				+ JAXBControlConstants.LINE_SEP;
-		return new ByteArrayInputStream(content.getBytes());
-	}
-
-	private static InputStream getImplicitWithTags() {
-		String content = "JAXBRMConstants.PROPERTY" + JAXBControlConstants.LINE_SEP + "value:423.4" + JAXBControlConstants.LINE_SEP + "name:x" + JAXBControlConstants.LINE_SEP + "JAXBRMConstants.ATTRIBUTE" + JAXBControlConstants.LINE_SEP + "name:y" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-				+ JAXBControlConstants.LINE_SEP
-				+ "value:-130.42" + JAXBControlConstants.LINE_SEP + "JAXBRMConstants.PROPERTY" + JAXBControlConstants.LINE_SEP + "name:z" + JAXBControlConstants.LINE_SEP + "value:-1.7" + JAXBControlConstants.LINE_SEP; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		return new ByteArrayInputStream(content.getBytes());
-	}
-
-	private static InputStream getJobStates() {
-		String content = "blah blah xxxx blah blah xxxx blah blah xxxx blah blah xx" //$NON-NLS-1$
-				+ "<job>304823:RUNNING</job>fooblah blah xxxx\n  blah blah xxxx blah blah xxxx blah " //$NON-NLS-1$
-				+ " blah x\nx<job>312042:DONE</job>blah xxxx blah blah xxxx blah b" //$NON-NLS-1$
-				+ "blah blah xxxx foobarfoobr 231028388 <job>338831:SUJAXBRMConstants.SPENDED" //$NON-NLS-1$
-				+ "</job>fooroiqEXIT\npoiewmr<job>318388:QUEUED</job>blah blah xxxx"; //$NON-NLS-1$
-		return new ByteArrayInputStream(content.getBytes());
-	}
-
-	private static InputStream getMergedOrdering() {
-		String content = "name:foo0;value:bar0" + JAXBControlConstants.LINE_SEP + "name:foo1;value:bar1" + JAXBControlConstants.LINE_SEP + "name:foo0;default:baz0" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				+ JAXBControlConstants.LINE_SEP;
-		return new ByteArrayInputStream(content.getBytes());
-	}
-
-	private static InputStream getNoiseBeforeJobId() {
-		String content = "abe and lincoln will be down for 3 hours Saturday May 14, 2013 from 00:00:00 to 03:00:00" + JAXBControlConstants.LINE_SEP //$NON-NLS-1$
-				+ "There is currently no way to know what your shell is.  Please look in /etc/passwd" + JAXBControlConstants.LINE_SEP //$NON-NLS-1$
-				+ "To get your default account, click your heels three times and say, 'There's no place like home!'" + JAXBControlConstants.LINE_SEP //$NON-NLS-1$
-				+ "429324.honest1" + JAXBControlConstants.LINE_SEP; //$NON-NLS-1$
-		return new ByteArrayInputStream(content.getBytes());
-	}
-
-	private static InputStream getOpenMPIOut() {
-		String content = "mca:mca:base:param:mca_component_disable_dlopen:status:writable" //$NON-NLS-1$
-				+ JAXBControlConstants.LINE_SEP
-				+ "mca:mca:base:param:mca_component_disable_dlopen:help:Whether to attempt to disable opening dynamic components or not" //$NON-NLS-1$
-				+ JAXBControlConstants.LINE_SEP
-				+ "mca:mca:base:param:mca_component_disable_dlopen:deprecated:no" //$NON-NLS-1$
-				+ JAXBControlConstants.LINE_SEP
-				+ "mca:mpi:base:param:mpi_param_check:value:1" //$NON-NLS-1$
-				+ JAXBControlConstants.LINE_SEP
-				+ "mca:mpi:base:param:mpi_param_check:data_source:default value" //$NON-NLS-1$
-				+ JAXBControlConstants.LINE_SEP
-				+ "mca:mpi:base:param:mpi_param_check:status:read-only" //$NON-NLS-1$
-				+ JAXBControlConstants.LINE_SEP
-				+ "mca:mpi:base:param:mpi_param_check:help:Whether you want MPI API parameters checked at run-time or not.  Possible values are 0 (no checking) and 1 (perform checking at run-time)" //$NON-NLS-1$
-				+ JAXBControlConstants.LINE_SEP
-				+ "mca:mpi:base:param:mpi_param_check:deprecated:no" //$NON-NLS-1$
-				+ JAXBControlConstants.LINE_SEP
-				+ "mca:mpi:base:param:mpi_yield_when_idle:value:-1" //$NON-NLS-1$
-				+ JAXBControlConstants.LINE_SEP
-				+ "mca:mpi:base:param:mpi_yield_when_idle:data_source:default value" //$NON-NLS-1$
-				+ JAXBControlConstants.LINE_SEP
-				+ "mca:mpi:base:param:mpi_yield_when_idle:status:writable" //$NON-NLS-1$
-				+ JAXBControlConstants.LINE_SEP
-				+ "mca:mpi:base:param:mpi_yield_when_idle:help:Yield the processor when waiting for MPI communication (for MPI processes, will default to 1 when oversubscribing nodes)" //$NON-NLS-1$
-				+ JAXBControlConstants.LINE_SEP
-				+ "mca:mpi:base:param:mpi_yield_when_idle:deprecated:no" + JAXBControlConstants.LINE_SEP //$NON-NLS-1$
-				+ "mca:mpi:base:param:mpi_event_tick_rate:value:-1" + JAXBControlConstants.LINE_SEP; //$NON-NLS-1$
-		return new ByteArrayInputStream(content.getBytes());
-	}
-
-	private static InputStream getPropertyDefs() {
-		String content = "<name>pnameA</name><value>pvalueA</value>" + JAXBControlConstants.LINE_SEP + "<name>pnameB</name><value>pvalueB</value>" //$NON-NLS-1$ //$NON-NLS-2$
-				+ JAXBControlConstants.LINE_SEP
-				+ "<name>pnameC</name><value>pvalueC</value>" + JAXBControlConstants.LINE_SEP + "<name>pnameD</name><value>pvalueD</value>" //$NON-NLS-1$ //$NON-NLS-2$
-				+ JAXBControlConstants.LINE_SEP + "<value>pvalueW</value><name>pnameW</name>" + JAXBControlConstants.LINE_SEP; //$NON-NLS-1$
-		return new ByteArrayInputStream(content.getBytes());
-	}
-
-	private static InputStream getQstat() {
-		String content = "42226.ember       g_zn_ph2         enoey             665:51:4 R normal  \n";//$NON-NLS-1$ 
-		return new ByteArrayInputStream(content.getBytes());
-	}
-
-	private static InputStream getQstatOut() {
-		String content = "normal" + JAXBControlConstants.LINE_SEP + "iacat2" + JAXBControlConstants.LINE_SEP + "indprio" + JAXBControlConstants.LINE_SEP + "lincoln_nomss" + JAXBControlConstants.LINE_SEP + "cap1" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-				+ JAXBControlConstants.LINE_SEP
-				+ "lincoln_debug" + JAXBControlConstants.LINE_SEP + "long" + JAXBControlConstants.LINE_SEP + "iacat" + JAXBControlConstants.LINE_SEP + "industrial" + JAXBControlConstants.LINE_SEP //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				+ "lincoln" + JAXBControlConstants.LINE_SEP + "wide" + JAXBControlConstants.LINE_SEP + "nomss" + JAXBControlConstants.LINE_SEP + "debug" + JAXBControlConstants.LINE_SEP + "iacat3" + JAXBControlConstants.LINE_SEP //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-				+ "lincoln_cuda3.2" + JAXBControlConstants.LINE_SEP + "fernsler" + JAXBControlConstants.LINE_SEP; //$NON-NLS-1$ //$NON-NLS-2$
-		return new ByteArrayInputStream(content.getBytes());
-	}
-
-	private static InputStream getStaggered() {
-		String content = "value:1" + JAXBControlConstants.LINE_SEP + "value:2" + JAXBControlConstants.LINE_SEP + "name:1" + JAXBControlConstants.LINE_SEP + "name:2" + JAXBControlConstants.LINE_SEP + "name:3" + JAXBControlConstants.LINE_SEP //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-				+ "name:4" + JAXBControlConstants.LINE_SEP + "value:3" + JAXBControlConstants.LINE_SEP + "value:4" + JAXBControlConstants.LINE_SEP; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return new ByteArrayInputStream(content.getBytes());
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/messages.properties b/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/messages.properties
deleted file mode 100644
index cceb691..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/messages.properties
+++ /dev/null
@@ -1 +0,0 @@
-RMVariableTest_1=The list of files to be staged in prior to job execution.
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/rms/org.eclipse.ptp.rm.smoa.core/.classpath b/rms/org.eclipse.ptp.rm.smoa.core/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/.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/rms/org.eclipse.ptp.rm.smoa.core/.project b/rms/org.eclipse.ptp.rm.smoa.core/.project
deleted file mode 100644
index 833a372..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rm.smoa.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<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/rms/org.eclipse.ptp.rm.smoa.core/META-INF/MANIFEST.MF b/rms/org.eclipse.ptp.rm.smoa.core/META-INF/MANIFEST.MF
deleted file mode 100644
index 28d9c06..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,64 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.rm.smoa.core;singleton:=true
-Bundle-Version: 4.0.0.qualifier
-Bundle-Activator: org.eclipse.ptp.rm.smoa.core.SMOACoreActivator
-Bundle-Vendor: %Bundle-Vendor
-Bundle-Localization: plugin
-Bundle-ClassPath: .
-Require-Bundle: com.smoa.comp,
- org.eclipse.core.runtime,
- org.eclipse.core.filesystem,
- org.eclipse.debug.core,
- org.eclipse.ptp;bundle-version="4.0.0",
- org.eclipse.ptp.core,
- org.eclipse.ptp.proxy.protocol,
- org.eclipse.ptp.remote.core,
- org.eclipse.ptp.rm.core,
- org.eclipse.ptp.services.core,
- org.eclipse.search,
- org.eclipse.ui
-Export-Package: org.eclipse.ptp.rm.smoa.core;
-  uses:="org.eclipse.core.runtime,
-   org.eclipse.ptp.remote.core,
-   org.eclipse.ptp.rm.core.rmsystem,
-   org.osgi.framework,
-   com.smoa.comp.stubs.factory,
-   org.eclipse.ptp.rm.smoa.core.rservices",
- org.eclipse.ptp.rm.smoa.core.attrib;uses:="org.eclipse.ptp.core.attributes",
- org.eclipse.ptp.rm.smoa.core.rmsystem;
-  uses:="org.eclipse.ptp.rtsystem,
-   com.smoa.comp.sdk.types,
-   org.eclipse.core.runtime,
-   com.smoa.comp.sdk,
-   org.eclipse.ptp.core.elements.attributes,
-   org.eclipse.ptp.rmsystem,
-   org.eclipse.ptp.rm.smoa.core,
-   org.eclipse.ptp.core.attributes,
-   org.eclipse.ptp.core.elementcontrols,
-   org.eclipse.ptp.rm.smoa.core.rtsystem,
-   org.eclipse.ptp.core.elements",
- org.eclipse.ptp.rm.smoa.core.rservices;
-  uses:="org.eclipse.core.filesystem.provider,
-   org.eclipse.core.runtime,
-   com.smoa.comp.sdk.types,
-   com.smoa.core.sdk.attachments,
-   com.smoa.comp.sdk,
-   org.eclipse.ptp.remote.core,
-   org.eclipse.ptp.rm.smoa.core,
-   org.eclipse.core.filesystem",
- org.eclipse.ptp.rm.smoa.core.rtsystem;
-  uses:="org.eclipse.ptp.rtsystem,
-   org.eclipse.core.runtime,
-   org.eclipse.ptp.rm.smoa.core,
-   org.eclipse.ptp.core.attributes,
-   org.eclipse.ptp.core.elements",
- org.eclipse.ptp.rm.smoa.core.util
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Import-Package: javax.xml.bind,
- org.eclipse.core.filesystem,
- org.eclipse.core.internal.filesystem,
- org.eclipse.equinox.security.storage,
- org.eclipse.ptp.utils.core
-Bundle-ActivationPolicy: lazy
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/NOTICE.txt b/rms/org.eclipse.ptp.rm.smoa.core/NOTICE.txt
deleted file mode 100644
index d4e7c4b..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/NOTICE.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Apache Geronimo JAX-WS 2.1 API
-Copyright 2003-2008 The Apache Software Foundation
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/about.html b/rms/org.eclipse.ptp.rm.smoa.core/about.html
deleted file mode 100644
index 061df82..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/about.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!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=UTF-8"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 5, 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</a>.</p>
-
-<h3>Acknowledgements</h3>
-
-<p>This work is sponsored by the UCOMS project (System rozproszonego
-przetwarzania i montorowania komputerowego stosowany w odkrywaniu nowych źródeł
-energii oraz zarządzania surowcami energetycznymi) under award number MNiSW Nr
-469/1/N - USA/2009 (z dnia 24 listopada 2009r.) in close collaboration with U.S.
-research institutions involved in the U.S. Department of Energy (DOE) funded
-grant under award number DE-FG02-04ER46136 and the Board of Regents, State of
-Louisiana, under contact no. DOE/LEQSF(2004-07).</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/build.properties b/rms/org.eclipse.ptp.rm.smoa.core/build.properties
deleted file mode 100644
index 0dc34f7..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin.properties
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/plugin.properties b/rms/org.eclipse.ptp.rm.smoa.core/plugin.properties
deleted file mode 100644
index d134e9e..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/plugin.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-pluginName=PTP SMOA Computing Core
-Bundle-Vendor = Poznan Supercomputing and Networking Center
-remoteServices.name = SMOA Computing
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/plugin.xml b/rms/org.eclipse.ptp.rm.smoa.core/plugin.xml
deleted file mode 100644
index 81490a3..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/plugin.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<plugin>
-	<extension
-         point="org.eclipse.ptp.remote.core.remoteServices">
-      <remoteServices
-            class="org.eclipse.ptp.rm.smoa.core.SMOARemoteServicesFactory"
-            id="org.eclipse.ptp.remote.SMOARemoteServices"
-            name="%remoteServices.name" scheme="smoa-comp">
-      </remoteServices>
-   </extension>
-   
-     <!-- needed for PTP -->
-  <extension
-    point="org.eclipse.ptp.services.core.providers"
-  >
-    <provider
-      class="org.eclipse.ptp.rm.smoa.core.rmsystem.SMOAResourceManagerConfiguration"
-      id="org.eclipse.ptp.rm.smoa.SMOAServiceProvider"
-      name="SMOA Computing"
-      serviceId="org.eclipse.ptp.core.LaunchService"
-    />
-  </extension>
-   <extension
-         point="org.eclipse.ptp.core.resourceManagers">
-      <resourceManager
-            class="org.eclipse.ptp.rm.smoa.core.rmsystem.SMOAResourceManagerFactory"
-            id="org.eclipse.ptp.rm.smoa.SMOAServiceProvider">
-         <resourceManagerControl
-             class="org.eclipse.ptp.rm.smoa.core.rmsystem.SMOAResourceManagerFactory"
-             id="org.eclipse.ptp.rm.smoa.control">
-         </resourceManagerControl>
-         <resourceManagerMonitor
-            class="org.eclipse.ptp.rm.smoa.core.rmsystem.SMOAResourceManagerFactory"
-            id="org.eclipse.ptp.rm.smoa.monitor">
-         </resourceManagerMonitor>
-      </resourceManager>
-   </extension>
-
-</plugin>
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/SMOAConfiguration.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/SMOAConfiguration.java
deleted file mode 100644
index 4ce3723..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/SMOAConfiguration.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core;
-
-import java.util.List;
-
-import org.eclipse.ptp.rm.core.rmsystem.IRemoteResourceManagerConfiguration;
-import org.eclipse.ptp.rm.smoa.core.rmsystem.SMOAResourceManager;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOAConnection;
-
-import com.smoa.comp.stubs.factory.ApplicationsType.Application;
-
-/**
- * Holds values needed by {@link SMOAResourceManager} to operate - that is RM
- * configuration and connection options.
- * 
- * Is also informed by {@link SMOAResourceManager} about the available
- * applications.
- * 
- * Implemented by {@link SMOAServiceProvider}
- */
-public interface SMOAConfiguration extends IRemoteResourceManagerConfiguration {
-
-	/** Authentication mechanisms used to connect to SMOA Computing */
-	enum AuthType {
-		Anonymous, UsernamePassword, GSI
-	}
-
-	/** Returns application for given name */
-	Application getAppForName(String name);
-
-	/** Returns the method of authentication */
-	AuthType getAuthType();
-
-	/** List of predefined applications on the host */
-	List<String> getAvailableAppList();
-
-	/** Path to CA certificate */
-	String getCaCertPath();
-
-	/* If the authentication type needs no <insert name here>, result undefined. */
-
-	/** For convenience, returns the associated connection */
-	SMOAConnection getConnection();
-
-	/** Returns the password. */
-	String getPassword();
-
-	/** port number for the SMOA computing */
-	Integer getPort();
-
-	/** Service designed name */
-	String getServiceDN();
-
-	/* Managing available applications */
-
-	/** must return SMOA computing URL - host name */
-	String getUrl();
-
-	/** Returns the user name. */
-	String getUser();
-
-	/** Sets predefined application list */
-	void setAvailableAppList(List<Application> apps);
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/SMOACoreActivator.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/SMOACoreActivator.java
deleted file mode 100644
index f21100e..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/SMOACoreActivator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core;
-
-import org.eclipse.core.runtime.Plugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The plug-in activator.
- */
-public class SMOACoreActivator extends Plugin {
-
-	public static final String PLUGIN_ID = "org.eclipse.ptp.rm.smoa.core"; //$NON-NLS-1$
-
-	private static SMOACoreActivator plugin;
-
-	public static SMOACoreActivator getDefault() {
-		return plugin;
-	}
-
-	public SMOACoreActivator() {
-		plugin = this;
-	}
-
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/SMOARemoteServicesFactory.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/SMOARemoteServicesFactory.java
deleted file mode 100644
index a07a8a0..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/SMOARemoteServicesFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core;
-
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.core.IRemoteServicesDescriptor;
-import org.eclipse.ptp.remote.core.IRemoteServicesFactory;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOARemoteServices;
-
-/**
- * Passed to proper extension point (in plugin.xml) adds
- * {@link SMOARemoteServices} to the public list of {@link IRemoteSrvices}
- */
-public class SMOARemoteServicesFactory implements IRemoteServicesFactory {
-
-	public static final String ID = SMOARemoteServices.class.getName();
-	private SMOARemoteServices services;
-
-	public IRemoteServices getServices(IRemoteServicesDescriptor descriptor) {
-
-		if (services == null) {
-			services = new SMOARemoteServices(ID, "SMOA Computing"); //$NON-NLS-1$
-		}
-
-		return services;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/Messages.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/Messages.java
deleted file mode 100644
index a4138a5..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/Messages.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.attrib;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rm.smoa.core.attrib.messages"; //$NON-NLS-1$
-	public static String SMOAJobAttributes_0;
-	public static String SMOAJobAttributes_Application;
-	public static String SMOAJobAttributes_CustomApplication;
-	public static String SMOAJobAttributes_CustomMakeCommand;
-	public static String SMOAJobAttributes_JobDescription;
-	public static String SMOAJobAttributes_JobNativeSpec;
-	public static String SMOAJobAttributes_MaxCpus;
-	public static String SMOAJobAttributes_MinCpus;
-	public static String SMOAJobAttributes_PreferredMachines;
-	public static String SMOAJobAttributes_QueueName;
-	public static String SMOAJobAttributes_RunDirectly;
-	public static String SMOAJobAttributes_SmoaUUID;
-	public static String SMOANodeAttributes_CpuArch;
-	public static String SMOANodeAttributes_CpuCount;
-	public static String SMOANodeAttributes_PhysicalMemory;
-	public static String SMOARMAttributes_AcceptsNewActvities;
-	public static String SMOARMAttributes_CommonName;
-	public static String SMOARMAttributes_QueueingSystem;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOAJobAttributes.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOAJobAttributes.java
deleted file mode 100644
index 84c89b2..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOAJobAttributes.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.attrib;
-
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.ptp.core.attributes.ArrayAttributeDefinition;
-import org.eclipse.ptp.core.attributes.AttributeManager;
-import org.eclipse.ptp.core.attributes.BooleanAttributeDefinition;
-import org.eclipse.ptp.core.attributes.IAttributeDefinition;
-import org.eclipse.ptp.core.attributes.IntegerAttributeDefinition;
-import org.eclipse.ptp.core.attributes.StringAttributeDefinition;
-import org.eclipse.ptp.core.elements.attributes.ElementAttributes;
-import org.eclipse.ptp.core.elements.attributes.JobAttributes;
-
-/**
- * Keeps attributes specific for SMOA Jobs.
- * 
- * Also keeps environmental variables
- */
-public class SMOAJobAttributes extends AttributeManager {
-
-	/** Variable name requesting to run 'make' before starting task */
-	public static final String ENV_IF_MAKE = "SMOA_COMP_PTP_RUN_MAKE"; //$NON-NLS-1$
-	/** Variable name requesting to run 'make' before starting task */
-	public static final String ENV_MAKE_COMMAND = "SMOA_COMP_PTP_MAKE_COMMAND"; //$NON-NLS-1$
-	/** Environment variable containing file name for stdout */
-	public static final String ENV_STDOUT = "SMOA_COMP_PTP_STDOUT"; //$NON-NLS-1$
-	/** Environment variable containing file name for stderr */
-	public static final String ENV_STDERR = "SMOA_COMP_PTP_STDERR"; //$NON-NLS-1$
-	/** Environment variable containing for all processes their node names */
-	public static final String ENV_MACHINEFILE = "SMOA_COMP_PTP_MACHINEFILE"; //$NON-NLS-1$
-
-	/** Text displayed in GUI launch configuration for no wrapper script */
-	public static final String NO_WRAPPER_SCRIPT = Messages.SMOAJobAttributes_RunDirectly;
-
-	public final static StringAttributeDefinition getAppNameDef() {
-		return new StringAttributeDefinition("applicationName", Messages.SMOAJobAttributes_Application, //$NON-NLS-1$
-				Messages.SMOAJobAttributes_Application, true, Messages.SMOAJobAttributes_CustomApplication);
-	}
-
-	public final static StringAttributeDefinition getCustomMakeCommandDef() {
-		return new StringAttributeDefinition("customMakeCommand", //$NON-NLS-1$
-				Messages.SMOAJobAttributes_CustomMakeCommand, Messages.SMOAJobAttributes_CustomMakeCommand, true, null);
-	}
-
-	public final static StringAttributeDefinition getDescDef() {
-		return new StringAttributeDefinition("job_desc", Messages.SMOAJobAttributes_JobDescription, //$NON-NLS-1$
-				Messages.SMOAJobAttributes_JobDescription, true, ""); //$NON-NLS-1$
-	}
-
-	public final static StringMapAttributeDefinition getEnvDef() {
-		return new StringMapAttributeDefinition("org.eclipse.debug.core.environmentVariables", //$NON-NLS-1$
-				"Enviornment vars", "Enviornment vars", false); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	public final static BooleanAttributeDefinition getIfCustomMakeDef() {
-		return new BooleanAttributeDefinition("ifCustomMakeCommand", //$NON-NLS-1$
-				"ifCustomMakeCommand", "ifCustomMakeCommand", false, false); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Returns set of possible SMOA Activity attributes.
-	 * 
-	 * Used in LaunchConfiguration for filtering attributes.
-	 */
-	public static Map<String, IAttributeDefinition<?, ?, ?>> getLaunchAttributes() {
-		final Map<String, IAttributeDefinition<?, ?, ?>> map = new TreeMap<String, IAttributeDefinition<?, ?, ?>>();
-
-		putFromDef(map, ElementAttributes.getNameAttributeDefinition());
-
-		putFromDef(map, JobAttributes.getWorkingDirectoryAttributeDefinition());
-		putFromDef(map, JobAttributes.getQueueIdAttributeDefinition());
-
-		putFromDef(map, JobAttributes.getDebugFlagAttributeDefinition());
-		putFromDef(map, JobAttributes.getDebuggerArgumentsAttributeDefinition());
-		putFromDef(map,
-				JobAttributes.getDebuggerExecutableNameAttributeDefinition());
-		putFromDef(map,
-				JobAttributes.getDebuggerExecutablePathAttributeDefinition());
-		putFromDef(map, JobAttributes.getDebuggerIdAttributeDefinition());
-		putFromDef(map,
-				JobAttributes.getDebuggerStopInMainFlagAttributeDefinition());
-
-		putFromDef(map, getMinCpuDef());
-		putFromDef(map, getMaxCpuDef());
-		putFromDef(map, getDescDef());
-		putFromDef(map, getNativeSpecDef());
-		putFromDef(map, getPrefferedDef());
-		putFromDef(map, getEnvDef());
-		putFromDef(map, getAppNameDef());
-		putFromDef(map, getMakeDef());
-		putFromDef(map, getIfCustomMakeDef());
-		putFromDef(map, getCustomMakeCommandDef());
-		putFromDef(map, getQueueNameDef());
-
-		return map;
-	}
-
-	public final static BooleanAttributeDefinition getMakeDef() {
-		return new BooleanAttributeDefinition("runMake", Messages.SMOAJobAttributes_0, "runMake", //$NON-NLS-1$ //$NON-NLS-2$
-				false, false);
-	}
-
-	public final static IntegerAttributeDefinition getMaxCpuDef() {
-		return new IntegerAttributeDefinition("cpu_max", Messages.SMOAJobAttributes_MaxCpus, //$NON-NLS-1$
-				Messages.SMOAJobAttributes_MaxCpus, true, 1);
-	}
-
-	public final static IntegerAttributeDefinition getMinCpuDef() {
-		return new IntegerAttributeDefinition("cpu_min", Messages.SMOAJobAttributes_MinCpus, //$NON-NLS-1$
-				Messages.SMOAJobAttributes_MinCpus, true, 1);
-	}
-
-	public final static StringAttributeDefinition getNativeSpecDef() {
-		return new StringAttributeDefinition("job_native_spec", //$NON-NLS-1$
-				Messages.SMOAJobAttributes_JobNativeSpec, Messages.SMOAJobAttributes_JobNativeSpec, true, ""); //$NON-NLS-1$
-	}
-
-	public final static ArrayAttributeDefinition<String> getPrefferedDef() {
-		return new ArrayAttributeDefinition<String>("preffered_machines", //$NON-NLS-1$
-				Messages.SMOAJobAttributes_PreferredMachines, Messages.SMOAJobAttributes_PreferredMachines, true, new String[0]);
-	}
-
-	public final static StringAttributeDefinition getQueueNameDef() {
-		return new StringAttributeDefinition("queue_name", Messages.SMOAJobAttributes_QueueName, //$NON-NLS-1$
-				Messages.SMOAJobAttributes_QueueName, true, null);
-	}
-
-	public final static StringAttributeDefinition getSmoaUuidDef() {
-		return new StringAttributeDefinition("smoa_uid", Messages.SMOAJobAttributes_SmoaUUID, //$NON-NLS-1$
-				Messages.SMOAJobAttributes_SmoaUUID, true, null);
-	}
-
-	private static void putFromDef(
-			Map<String, IAttributeDefinition<?, ?, ?>> map,
-			IAttributeDefinition<?, ?, ?> def) {
-		map.put(def.getId(), def);
-	}
-
-	public SMOAJobAttributes() {
-		addAttribute(JobAttributes.getJobIdAttributeDefinition().create());
-		addAttribute(JobAttributes.getStateAttributeDefinition().create());
-		addAttribute(JobAttributes.getUserIdAttributeDefinition().create());
-		addAttribute(ElementAttributes.getNameAttributeDefinition().create());
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOAMachineAttributes.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOAMachineAttributes.java
deleted file mode 100644
index a86810e..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOAMachineAttributes.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.attrib;
-
-import org.eclipse.ptp.core.attributes.AttributeManager;
-import org.eclipse.ptp.core.attributes.IllegalValueException;
-import org.eclipse.ptp.core.elements.attributes.ElementAttributes;
-import org.eclipse.ptp.core.elements.attributes.MachineAttributes;
-
-/**
- * Keeps attributes specific for SMOA Machines
- */
-public class SMOAMachineAttributes extends AttributeManager {
-
-	public SMOAMachineAttributes() {
-		try {
-			addAttribute(MachineAttributes.getNumNodesAttributeDefinition()
-					.create());
-			addAttribute(MachineAttributes.getStateAttributeDefinition()
-					.create(MachineAttributes.State.UP));
-		} catch (final IllegalValueException e) {
-			throw new RuntimeException("This will never hapen", e); //$NON-NLS-1$
-		}
-		addAttribute(ElementAttributes.getNameAttributeDefinition().create());
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOANodeAttributes.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOANodeAttributes.java
deleted file mode 100644
index 9f0d95f..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOANodeAttributes.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.attrib;
-
-import org.eclipse.ptp.core.attributes.AttributeManager;
-import org.eclipse.ptp.core.attributes.IntegerAttributeDefinition;
-import org.eclipse.ptp.core.attributes.StringAttributeDefinition;
-import org.eclipse.ptp.core.elements.attributes.ElementAttributes;
-
-/**
- * Keeps attributes specific for SMOA Node
- */
-
-public class SMOANodeAttributes extends AttributeManager {
-
-	private static final IntegerAttributeDefinition cpuCount = new IntegerAttributeDefinition(
-			"cpu_count", Messages.SMOANodeAttributes_CpuCount, Messages.SMOANodeAttributes_CpuCount, true, 1); //$NON-NLS-1$
-
-	private static final StringAttributeDefinition cpuArch = new StringAttributeDefinition(
-			"cpu_arch", Messages.SMOANodeAttributes_CpuArch, Messages.SMOANodeAttributes_CpuArch, true, ""); //$NON-NLS-1$ //$NON-NLS-2$
-
-	private static final StringAttributeDefinition memorySize = new StringAttributeDefinition(
-			"phys_mem", Messages.SMOANodeAttributes_PhysicalMemory, Messages.SMOANodeAttributes_PhysicalMemory, true, null); //$NON-NLS-1$
-
-	public static StringAttributeDefinition getCpuArchDef() {
-		return cpuArch;
-	}
-
-	public static IntegerAttributeDefinition getCpuCountDef() {
-		return cpuCount;
-	}
-
-	public static StringAttributeDefinition getMemorySizeDef() {
-		return memorySize;
-	}
-
-	public SMOANodeAttributes() {
-		addAttribute(ElementAttributes.getNameAttributeDefinition().create());
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOAQueueAttributes.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOAQueueAttributes.java
deleted file mode 100644
index cfe3034..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOAQueueAttributes.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.attrib;
-
-import org.eclipse.ptp.core.attributes.AttributeManager;
-import org.eclipse.ptp.core.elements.attributes.ElementAttributes;
-import org.eclipse.ptp.core.elements.attributes.QueueAttributes;
-
-/**
- * Keeps attributes specific for SMOA Queues
- */
-
-public class SMOAQueueAttributes extends AttributeManager {
-	public SMOAQueueAttributes() {
-		addAttribute(QueueAttributes.getStateAttributeDefinition().create());
-		addAttribute(ElementAttributes.getNameAttributeDefinition().create());
-		addAttribute(ElementAttributes.getIdAttributeDefinition().create());
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOARMAttributes.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOARMAttributes.java
deleted file mode 100644
index 95c64f4..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/SMOARMAttributes.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.attrib;
-
-import org.eclipse.ptp.core.attributes.AttributeManager;
-import org.eclipse.ptp.core.attributes.BooleanAttributeDefinition;
-import org.eclipse.ptp.core.attributes.StringAttributeDefinition;
-
-/**
- * Keeps attributes specific for SMOA ResourceManager
- */
-
-public class SMOARMAttributes extends AttributeManager {
-
-	static private StringAttributeDefinition queuingSystem = new StringAttributeDefinition(
-			"queuingSystem", Messages.SMOARMAttributes_QueueingSystem, Messages.SMOARMAttributes_QueueingSystem, true, null); //$NON-NLS-1$
-	static private StringAttributeDefinition commonName = new StringAttributeDefinition(
-			"commonName", Messages.SMOARMAttributes_CommonName, Messages.SMOARMAttributes_CommonName, true, null); //$NON-NLS-1$
-
-	static private BooleanAttributeDefinition acceptsActivities = new BooleanAttributeDefinition(
-			"isIsAcceptingNewActivities", Messages.SMOARMAttributes_AcceptsNewActvities, //$NON-NLS-1$
-			Messages.SMOARMAttributes_AcceptsNewActvities, true, null);
-
-	static public final BooleanAttributeDefinition getAcceptsActivitiesDef() {
-		return acceptsActivities;
-	}
-
-	static public final StringAttributeDefinition getCommonNameDef() {
-		return commonName;
-	}
-
-	static public final StringAttributeDefinition getQueuingSystemDef() {
-		return queuingSystem;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/StringMapAttribute.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/StringMapAttribute.java
deleted file mode 100644
index 4666b16..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/StringMapAttribute.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.attrib;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.ptp.core.attributes.AbstractAttribute;
-import org.eclipse.ptp.core.attributes.IllegalValueException;
-
-/**
- * A {@link AbstractAttribute} that holds string-to-string map.
- * 
- * For the definition, see {@link StringMapAttributeDefinition}.
- */
-public class StringMapAttribute
-		extends
-		AbstractAttribute<Map<String, String>, StringMapAttribute, StringMapAttributeDefinition> {
-
-	Map<String, String> value = new HashMap<String, String>();
-
-	public StringMapAttribute(
-			StringMapAttributeDefinition mapAttributeDefinition,
-			Map<String, String> value) {
-		super(mapAttributeDefinition);
-
-		this.value.putAll(value);
-	}
-
-	public StringMapAttribute(
-			StringMapAttributeDefinition mapAttributeDefinition, String value)
-			throws IllegalValueException {
-		super(mapAttributeDefinition);
-		setValueAsString(value);
-	}
-
-	@Override
-	protected int doCompareTo(StringMapAttribute other) {
-		return getDefinition().getName().compareToIgnoreCase(
-				other.getDefinition().getName());
-	}
-
-	@Override
-	protected StringMapAttribute doCopy() {
-		return new StringMapAttribute(getDefinition(), value);
-	}
-
-	@Override
-	protected boolean doEquals(StringMapAttribute other) {
-		return value.equals(other.value);
-	}
-
-	@Override
-	protected int doHashCode() {
-		return value.hashCode();
-	}
-
-	public Map<String, String> getValue() {
-		return Collections.unmodifiableMap(value);
-	}
-
-	public String getValueAsString() {
-		final StringBuilder result = new StringBuilder();
-		for (final Entry<String, String> element : value.entrySet()) {
-			result.append(element.getKey().replaceAll(" = ", " \\= ") //$NON-NLS-1$ //$NON-NLS-2$
-					.replaceAll(" ; ", " \\; ")); //$NON-NLS-1$ //$NON-NLS-2$
-			result.append(" = "); //$NON-NLS-1$
-			result.append(element.getValue().replaceAll(" ; ", " \\; ")); //$NON-NLS-1$ //$NON-NLS-2$
-			result.append(" ; "); //$NON-NLS-1$
-		}
-		result.delete(result.length() - 3, result.length() - 1);
-		return result.toString();
-	}
-
-	public boolean isValid(String string) {
-		final String[] pairs = string.split(" ; "); //$NON-NLS-1$
-		for (final String pair : pairs) {
-			final String[] keyVal = pair.split(" = ", 2); //$NON-NLS-1$
-			if (keyVal.length != 2) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	public void setValue(Map<String, String> value)
-			throws IllegalValueException {
-		this.value.clear();
-		this.value.putAll(value);
-
-	}
-
-	public void setValueAsString(String string) throws IllegalValueException {
-		final Map<String, String> newVal = new HashMap<String, String>();
-
-		final String[] pairs = string.split(" ; "); //$NON-NLS-1$
-
-		for (final String pair : pairs) {
-			final String[] keyVal = pair.replaceAll(" \\; ", " ; ").split(" = ", 2); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			if (keyVal.length != 2) {
-				throw new IllegalValueException("Bad format"); //$NON-NLS-1$
-			}
-			newVal.put(keyVal[0].replaceAll(" \\= ", " = "), keyVal[1]); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		value = newVal;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/StringMapAttributeDefinition.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/StringMapAttributeDefinition.java
deleted file mode 100644
index dbcd3bd..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/StringMapAttributeDefinition.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.attrib;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.ptp.core.attributes.AbstractAttributeDefinition;
-import org.eclipse.ptp.core.attributes.IllegalValueException;
-
-/**
- * A {@link AbstractAttributeDefinition} for storing a string-to-string map.
- * 
- * The attribute is called {@link StringMapAttribute}.
- */
-
-public class StringMapAttributeDefinition
-		extends
-		AbstractAttributeDefinition<Map<String, String>, StringMapAttribute, StringMapAttributeDefinition> {
-
-	private final Map<String, String> defaultValue;
-
-	public StringMapAttributeDefinition(String uniqueId, String name,
-			String description, boolean display) {
-		this(uniqueId, name, description, display,
-				new HashMap<String, String>());
-	}
-
-	public StringMapAttributeDefinition(String uniqueId, String name,
-			String description, boolean display,
-			final Map<String, String> defaultValue) {
-		super(uniqueId, name, description, display);
-		this.defaultValue = defaultValue;
-	}
-
-	public StringMapAttribute create() throws IllegalValueException {
-		return new StringMapAttribute(this, defaultValue);
-	}
-
-	public StringMapAttribute create(Map<String, String> value)
-			throws IllegalValueException {
-		return new StringMapAttribute(this, value);
-	}
-
-	public StringMapAttribute create(String value) throws IllegalValueException {
-		return new StringMapAttribute(this, value);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/messages.properties b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/messages.properties
deleted file mode 100644
index cc8c9c3..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/attrib/messages.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-SMOAJobAttributes_0=runMake
-SMOAJobAttributes_Application=Application
-SMOAJobAttributes_CustomApplication=Custom
-SMOAJobAttributes_CustomMakeCommand=Custom make command
-SMOAJobAttributes_JobDescription=Job description
-SMOAJobAttributes_JobNativeSpec=Job native specification
-SMOAJobAttributes_MaxCpus=Max CPU-s
-SMOAJobAttributes_MinCpus=Min CPU-s
-SMOAJobAttributes_PreferredMachines=Preffered machines
-SMOAJobAttributes_QueueName=Queue name
-SMOAJobAttributes_RunDirectly=Run directly
-SMOAJobAttributes_SmoaUUID=SMOA Comp Job UUID
-SMOANodeAttributes_CpuArch=CPU architecture
-SMOANodeAttributes_CpuCount=CPU count
-SMOANodeAttributes_PhysicalMemory=Physical Memory
-SMOARMAttributes_AcceptsNewActvities=Accepts new activities
-SMOARMAttributes_CommonName=Common name
-SMOARMAttributes_QueueingSystem=Queuing System
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/JobThread.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/JobThread.java
deleted file mode 100644
index 95ce6ca..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/JobThread.java
+++ /dev/null
@@ -1,442 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rmsystem;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.BitSet;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ptp.core.attributes.AttributeManager;
-import org.eclipse.ptp.core.elements.IPJob;
-import org.eclipse.ptp.core.elements.IPMachine;
-import org.eclipse.ptp.core.elements.IPNode;
-import org.eclipse.ptp.core.elements.IPResourceManager;
-import org.eclipse.ptp.core.elements.attributes.JobAttributes;
-import org.eclipse.ptp.core.elements.attributes.ProcessAttributes;
-import org.eclipse.ptp.remote.core.IRemoteFileManager;
-import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
-import org.eclipse.ptp.rm.smoa.core.rmsystem.PoolingIntervalsAndStatic.SMOAJobState;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOAFileStore;
-import org.eclipse.ptp.rm.smoa.core.util.NotifyShell;
-
-import com.smoa.comp.sdk.SMOAFactory;
-import com.smoa.comp.sdk.exceptions.FileNotFoundException;
-import com.smoa.comp.sdk.exceptions.NotAuthorizedException;
-import com.smoa.comp.sdk.exceptions.UnknownActivityIdentifierException;
-import com.smoa.comp.sdk.types.ActivityEndpointReference;
-import com.smoa.comp.sdk.types.SMOAActivityStatus;
-
-/**
- * Thread for monitoring a single job - checks state and transfers standard
- * output. Allows job's termination.
- */
-class JobThread extends Thread {
-	// The RM that created the job
-	private final SMOAResourceManager rm;
-	private final IPResourceManager pRM;
-
-	// The eclipse job control object
-	private final IPJob jobControl;
-
-	// The SMOA job control object
-	private final ActivityEndpointReference activityIdentifier;
-
-	private final SMOAFactory factory;
-	private final IRemoteFileManager fileManager;
-
-	// Remote files used by launch
-	private final IFileStore out;
-	private final IFileStore err;
-	private final IFileStore sh;
-	private final IFileStore machinefile;
-
-	// Offsets for the output files
-	private int stdOutOffset = 0;
-	private int stdErrOffset = 0;
-
-	/**
-	 * Constructs the job thread for monitoring a single job
-	 */
-	public JobThread(SMOAResourceManager rm, SMOAFactory factory, ActivityEndpointReference activityEndpointReference,
-			IPJob jobControl, String out, String err, String sh, String machinefile) {
-		this.rm = rm;
-		this.pRM = (IPResourceManager) rm.getAdapter(IPResourceManager.class);
-		this.factory = factory;
-		this.activityIdentifier = activityEndpointReference;
-		this.jobControl = jobControl;
-
-		this.setPriority(MIN_PRIORITY);
-		this.setName("JobListener for " + activityIdentifier.getActivityUUID()); //$NON-NLS-1$
-
-		final IRemoteFileManager fileManager_t = PTPRemoteCorePlugin.getDefault()
-				.getRemoteServices(rm.getControlConfiguration().getRemoteServicesId())
-				.getFileManager(rm.getControlConfiguration().getConnection());
-
-		fileManager = fileManager_t;
-
-		this.out = fileManager.getResource(out);
-		this.err = fileManager.getResource(err);
-		if (sh != null) {
-			this.sh = fileManager.getResource(sh);
-		} else {
-			this.sh = null;
-		}
-		if (machinefile != null) {
-			this.machinefile = fileManager.getResource(machinefile);
-		} else {
-			this.machinefile = null;
-		}
-
-	}
-
-	/** Adds given text to standard error, and makes it appear on console */
-	void appendStdErr(String stderr) {
-		final AttributeManager outManager = new AttributeManager();
-		outManager.addAttribute(ProcessAttributes.getStderrAttributeDefinition().create(stderr));
-		final BitSet bs = new BitSet();
-		bs.set(jobControl.getProcessJobRanks().nextSetBit(0));
-		jobControl.addProcessAttributes(bs, outManager);
-	}
-
-	/** Adds given text to standard output, and makes it appear on console */
-	void appendStdOut(String stdout) {
-		final AttributeManager outManager = new AttributeManager();
-		outManager.addAttribute(ProcessAttributes.getStdoutAttributeDefinition().create(stdout));
-		final BitSet bs = new BitSet();
-		bs.set(jobControl.getProcessJobRanks().nextSetBit(0));
-		jobControl.addProcessAttributes(bs, outManager);
-	}
-
-	/**
-	 * Changes job state
-	 */
-	void changeState(JobAttributes.State newState) {
-		if (JobAttributes.State.RUNNING.equals(newState)) {
-			enteredRunPhase();
-		}
-
-		final AttributeManager am = new AttributeManager();
-		am.addAttribute(JobAttributes.getStateAttributeDefinition().create(newState));
-		rm.getMonitor().getRuntimeSystem().changeJob(jobControl.getID(), am);
-	}
-
-	/**
-	 * Called when the process state becomes RUNNING.
-	 * 
-	 * This is the proper moment for identifying where the processes are
-	 * located, so that debug routing files may be written.
-	 */
-	private void enteredRunPhase() {
-		if (machinefile != null) {
-			try {
-				final BufferedReader reader = new BufferedReader(new InputStreamReader(machinefile.openInputStream(0, null)));
-
-				final IPMachine machine = pRM.getMachines()[0];
-
-				final Map<String, String> nodesByName = new HashMap<String, String>();
-				for (final IPNode ipNode : machine.getNodes()) {
-					nodesByName.put(ipNode.getName(), ipNode.getID());
-				}
-
-				String line;
-				int i = 0;
-				while ((line = reader.readLine()) != null) {
-					final BitSet bs = new BitSet();
-					bs.set(i++);
-					final AttributeManager attrs = new AttributeManager();
-
-					if (!nodesByName.containsKey(line)) {
-						rm.getMonitor().getRuntimeSystem().addUnknownNode(machine, line);
-						nodesByName.put(line, ((Integer) nodesByName.size()).toString());
-						NotifyShell.open(Messages.JobThread_UnknownNode_title, Messages.JobThread_UnknownNode_text_1 + line
-								+ Messages.JobThread_UnknownNode_text_2);
-						attrs.addAttribute(ProcessAttributes.getNodeIdAttributeDefinition().create(nodesByName.get(line)));
-					} else {
-						attrs.addAttribute(ProcessAttributes.getNodeIdAttributeDefinition().create(nodesByName.get(line)));
-					}
-					jobControl.addProcessesByJobRanks(bs, attrs);
-				}
-				return;
-			} catch (final CoreException e) {
-				NotifyShell.open(Messages.JobThread_ErrorOpeningRemote, e.toString());
-
-				final BitSet bs = new BitSet(1);
-				bs.set(0);
-				final AttributeManager jam = new AttributeManager();
-				jam.addAttribute(ProcessAttributes.getNodeIdAttributeDefinition().create("0")); //$NON-NLS-1$
-				jobControl.addProcessesByJobRanks(bs, jam);
-			} catch (final IOException e) {
-				NotifyShell.open(Messages.JobThread_ErrorReadingRemote, e.toString());
-
-				if (jobControl.getProcessJobRanks() != null && !jobControl.getProcessJobRanks().isEmpty()) {
-					return;
-				}
-
-				final BitSet bs = new BitSet(1);
-				bs.set(0);
-				final AttributeManager jam = new AttributeManager();
-				jam.addAttribute(ProcessAttributes.getNodeIdAttributeDefinition().create("0")); //$NON-NLS-1$
-				jobControl.addProcessesByJobRanks(bs, jam);
-			}
-		} else {
-			final BitSet bs = new BitSet(1);
-			bs.set(0);
-			final AttributeManager jam = new AttributeManager();
-			jam.addAttribute(ProcessAttributes.getNodeIdAttributeDefinition().create("0")); //$NON-NLS-1$
-			jobControl.addProcessesByJobRanks(bs, jam);
-		}
-	}
-
-	/**
-	 * Called if an exception has been thrown while monitoring job
-	 */
-	void exceptionCaught(Exception e) {
-		final AttributeManager am = new AttributeManager();
-
-		am.addAttribute(JobAttributes.getStatusAttributeDefinition().create(Messages.JobThread_ExceptionByMonitoring));
-
-		am.addAttribute(JobAttributes.getStateAttributeDefinition().create(JobAttributes.State.COMPLETED));
-
-		am.addAttribute(PoolingIntervalsAndStatic.exceptionAttrDef.create(e.getLocalizedMessage()));
-
-		NotifyShell.open(Messages.JobThread_ExceptionByMonitoring, e.getLocalizedMessage());
-
-		rm.getMonitor().getRuntimeSystem().changeJob(jobControl.getID(), am);
-	}
-
-	/** Executed after the job reached terminal state */
-	private void jobFinished(SMOAActivityStatus status) {
-
-		try {
-			// If the job jumped from queued to finished state, we didn't
-			// add any processes yet
-			if (jobControl.getProcessJobRanks() == null || jobControl.getProcessJobRanks().isEmpty()) {
-				final BitSet bs = new BitSet(1);
-				bs.set(0);
-				final AttributeManager jam = new AttributeManager();
-				jam.addAttribute(ProcessAttributes.getNodeIdAttributeDefinition().create("0")); //$NON-NLS-1$
-				jobControl.addProcessesByJobRanks(bs, jam);
-			}
-
-			processOutAndErr();
-
-			try {
-				out.delete(0, null);
-				err.delete(0, null);
-				if (sh != null) {
-					sh.delete(0, null);
-				}
-				if (machinefile != null) {
-					machinefile.delete(0, null);
-				}
-			} catch (final CoreException e) {
-				NotifyShell.open(Messages.JobThread_ErrorDeletingTempFiles_title, Messages.JobThread_ErrorDeletingTempFiles_text
-						+ e.getLocalizedMessage());
-				e.printStackTrace();
-			}
-		} catch (final RuntimeException e) {
-			// Happens if there is a problem with stdout/err file
-		}
-
-		final AttributeManager am = new AttributeManager();
-
-		String jobStatus = null;
-
-		switch (PoolingIntervalsAndStatic.getEquivalentJobState(status)) {
-		case Finished:
-			jobStatus = Messages.JobThread_JobStateFinisedWithStatus + status.getEndStatus().getExitStatus();
-			break;
-		case Failed:
-			jobStatus = Messages.JobThread_JobStateFailed;
-			break;
-		case Cancelled:
-			jobStatus = Messages.JobThread_JobStateCancelled;
-			break;
-		default:
-			jobStatus = Messages.JobThread_JobStateUnknown;
-		}
-
-		am.addAttribute(JobAttributes.getStatusAttributeDefinition().create(jobStatus));
-
-		JobAttributes.State state;
-		state = JobAttributes.State.COMPLETED;
-		am.addAttribute(JobAttributes.getStateAttributeDefinition().create(state));
-
-		rm.getMonitor().getRuntimeSystem().changeJob(jobControl.getID(), am);
-	}
-
-	/**
-	 * Takes care about reading out and err streams and forwards them on console
-	 */
-	private void processOutAndErr() {
-
-		/* Out */
-		InputStream is;
-		try {
-			if (out instanceof SMOAFileStore) {
-				is = ((SMOAFileStore) out).openInputStream(0, null, stdOutOffset);
-			} else {
-				is = out.openInputStream(0, null);
-				is.skip(stdOutOffset);
-			}
-
-			final byte[] buffer = new byte[512];
-
-			for (int count = is.read(buffer); count > 0; count = is.read(buffer)) {
-				stdOutOffset += count;
-				appendStdOut(new String(buffer).substring(0, count));
-			}
-		} catch (final CoreException e) {
-			if (e.getCause() instanceof FileNotFoundException) {
-				return;
-			}
-			throw new RuntimeException(e);
-		} catch (final IOException e) {
-			NotifyShell.open(Messages.JobThread_ErrorOut, e.getLocalizedMessage());
-		}
-
-		/* Err */
-
-		try {
-			if (err instanceof SMOAFileStore) {
-				is = ((SMOAFileStore) err).openInputStream(0, null, stdErrOffset);
-			} else {
-				is = err.openInputStream(0, null);
-				is.skip(stdErrOffset);
-			}
-
-			final byte[] buffer = new byte[512];
-
-			for (int count = is.read(buffer); count > 0; count = is.read(buffer)) {
-				stdErrOffset += count;
-				if (count == buffer.length) {
-					appendStdErr(new String(buffer));
-				} else {
-					appendStdErr(new String(buffer).substring(0, count));
-				}
-			}
-		} catch (final CoreException e) {
-			if (e.getCause() instanceof FileNotFoundException) {
-				return;
-			}
-			throw new RuntimeException(e);
-		} catch (final IOException e) {
-			NotifyShell.open(Messages.JobThread_ErrorErr, e.getLocalizedMessage());
-		}
-	}
-
-	/** Loop for monitoring task */
-	@Override
-	public void run() {
-		try {
-
-			SMOAActivityStatus status = factory.getActivityStatus(activityIdentifier);
-
-			SMOAActivityStatus prevStatus = null;
-
-			long nextStateCheck = System.currentTimeMillis();
-			long nextOutCheck = nextStateCheck;
-
-			// Till the state is not final, we pool the job and out streams
-			while (true) {
-
-				// Status
-				if (nextStateCheck <= System.currentTimeMillis()) {
-					nextStateCheck = System.currentTimeMillis() + PoolingIntervalsAndStatic.getPoolingIntervalTask();
-
-					final SMOAJobState statusS = PoolingIntervalsAndStatic.getEquivalentJobState(status);
-
-					SMOAJobState prevstatusS = null;
-
-					if (prevStatus != null) {
-						prevstatusS = PoolingIntervalsAndStatic.getEquivalentJobState(prevStatus);
-					}
-
-					if (prevStatus == null || !statusS.equals(prevstatusS)) {
-						switch (statusS) {
-						case Stage_in:
-						case Held:
-						case Queued:
-							changeState(JobAttributes.State.STARTING);
-							break;
-						case Stage_out:
-						case Executing:
-							changeState(JobAttributes.State.RUNNING);
-							break;
-						case Suspended:
-							changeState(JobAttributes.State.SUSPENDED);
-							break;
-
-						case Cancelled:
-							break;
-						case Failed:
-							break;
-						case Finished:
-							break;
-						}
-						prevStatus = status;
-					}
-					status = factory.getActivityStatus(activityIdentifier);
-
-					if (status.isFinalState()) {
-						break;
-					}
-				}
-
-				// Out
-				final JobAttributes.State state = jobControl.getAttribute(JobAttributes.getStateAttributeDefinition()).getValue();
-				if (state == JobAttributes.State.RUNNING && nextOutCheck <= System.currentTimeMillis()) {
-					nextOutCheck = System.currentTimeMillis() + PoolingIntervalsAndStatic.getPoolingIntervalOut();
-
-					processOutAndErr();
-				}
-				try {
-					final long nextCheck = Math.min(nextOutCheck - System.currentTimeMillis(),
-							nextStateCheck - System.currentTimeMillis());
-					if (nextCheck > 0) {
-						sleep(nextCheck);
-					}
-				} catch (final InterruptedException e) {
-					// The job has been terminated, ignore
-				}
-			}
-
-			jobFinished(status);
-
-		} catch (final NotAuthorizedException e) {
-			exceptionCaught(e);
-		} catch (final UnknownActivityIdentifierException e) {
-			exceptionCaught(e);
-		}
-
-		rm.removeJobThread(jobControl.getID());
-	}
-
-	/**
-	 * Terminates the monitored job
-	 */
-	public boolean terminate() {
-		try {
-			factory.terminateActivity(activityIdentifier);
-			this.interrupt();
-		} catch (final Exception e) {
-			return false;
-		}
-		return true;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/Messages.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/Messages.java
deleted file mode 100644
index b4e7b88..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/Messages.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rmsystem;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rm.smoa.core.rmsystem.messages"; //$NON-NLS-1$
-	public static String JobThread_ErrorDeletingTempFiles_text;
-	public static String JobThread_ErrorDeletingTempFiles_title;
-	public static String JobThread_ErrorErr;
-	public static String JobThread_ErrorOpeningRemote;
-	public static String JobThread_ErrorOut;
-	public static String JobThread_ErrorReadingRemote;
-	public static String JobThread_ExceptionByMonitoring;
-	public static String JobThread_JobStateCancelled;
-	public static String JobThread_JobStateFailed;
-	public static String JobThread_JobStateFinisedWithStatus;
-	public static String JobThread_JobStateUnknown;
-	public static String JobThread_UnknownNode_text_1;
-	public static String JobThread_UnknownNode_text_2;
-	public static String JobThread_UnknownNode_title;
-	public static String PoolingIntervalsAndStatic_JobSubmissionFailed;
-	public static String SMOAResourceManager_7;
-	public static String SMOAResourceManager_8;
-	public static String SMOAResourceManager_JobSubmissionFailed;
-	public static String SMOAResourceManager_PortForwardingFailed_text;
-	public static String SMOAResourceManager_PortForwardingFailed_title;
-	public static String SMOAResourceManagerConfiguration_AdditionalConnectionNotAvailable_text;
-	public static String SMOAResourceManagerConfiguration_AdditionalConnectionNotAvailable_title;
-	public static String SMOAResourceManagerConfiguration_CouldNotRetreivePassword;
-	public static String SMOAResourceManagerConfiguration_CouldNotStorePassword;
-	public static String SMOAResourceManagerConfiguration_PrefixAnonymous;
-	public static String SMOAResourceManagerConfiguration_PrefixGsi;
-	public static String SMOAResourceManagerConfiguration_ReusingConnection;
-	public static String SMOAResourceManagerConfiguration_SmoaRmDescription;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/PoolingIntervals.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/PoolingIntervals.java
deleted file mode 100644
index 367c747..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/PoolingIntervals.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rmsystem;
-
-/**
- * Static class holding information about pooling intervals of task and output
- * status.
- */
-
-/*
- * When this functionality has been part of SMOAResourceManager class, a
- * ClassCircularityExcepthion has been thrown under certain circumstances.
- */
-public class PoolingIntervals {
-
-	/** Default interval for checking job state. */
-	public static final int DEFAULT_POOLING_STATE = 10000;
-	/** Default interval for checking job out and err state. */
-	public static final int DEFAULT_POOLING_OUT = 15000;
-
-	/** Interval for checking job state. Global for all jobs. */
-	private static int PoolingIntervalState = DEFAULT_POOLING_STATE;
-	/** Interval for checking job out and err state. Global for all jobs. */
-	private static int PoolingIntervalOut = DEFAULT_POOLING_OUT;
-
-	/** Retrieves value of the output checking interval */
-	public static int getPoolingIntervalOut() {
-		return PoolingIntervalOut;
-	}
-
-	/** Retrieves value of the job state checking interval */
-	public static int getPoolingIntervalTask() {
-		return PoolingIntervalState;
-	}
-
-	/** How often the output will be checked (but not less than 0.1s) */
-	public static void setPoolingIntervalOut(int newVal) {
-		if (newVal >= 100) {
-			PoolingIntervalOut = newVal;
-		}
-	}
-
-	/** How often the job state will be checked (but not less than 0.1s) */
-	public static void setPoolingIntervalTask(int newVal) {
-		if (newVal >= 100) {
-			PoolingIntervalState = newVal;
-		}
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/PoolingIntervalsAndStatic.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/PoolingIntervalsAndStatic.java
deleted file mode 100644
index 7bf20cb..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/PoolingIntervalsAndStatic.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rmsystem;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.ptp.core.attributes.StringAttributeDefinition;
-
-import com.smoa.comp.sdk.types.SMOAActivityStatus;
-
-/**
- * Static class holding information about pooling intervals of task and output
- * status.
- * 
- * This class also holds some static methods i order to make
- * {@link SMOAResourceManager} thinner.
- */
-
-/*
- * When this functionality has been part of SMOAResourceManager class, a
- * ClassCircularityExcepthion has been thrown under certain circumstances.
- */
-public class PoolingIntervalsAndStatic {
-
-	/** All possible states returned by getBESState and getBESSubState */
-	public static enum SMOAJobState {
-		Cancelled, Finished, Failed, Executing, Stage_in, Stage_out, Queued, Held, Suspended
-	}
-
-	/** Default interval for checking job state. */
-	public static final int DEFAULT_POOLING_STATE = 10000;
-
-	/** Default interval for checking job out and err state. */
-	public static final int DEFAULT_POOLING_OUT = 15000;
-	/** Interval for checking job state. Global for all jobs. */
-	private static int PoolingIntervalState = DEFAULT_POOLING_STATE;
-
-	/** Interval for checking job out and err state. Global for all jobs. */
-	private static int PoolingIntervalOut = DEFAULT_POOLING_OUT;
-
-	/** Definition of a attribute holding error message */
-	public static StringAttributeDefinition exceptionAttrDef = new StringAttributeDefinition(
-			"exception", Messages.PoolingIntervalsAndStatic_JobSubmissionFailed, Messages.PoolingIntervalsAndStatic_JobSubmissionFailed, //$NON-NLS-1$
-			true, ""); //$NON-NLS-1$
-
-	private static final Map<String, SMOAJobState> besStateNameToEnum = new HashMap<String, SMOAJobState>();
-
-	private static final Map<String, SMOAJobState> besSubStateNameToEnum = new HashMap<String, SMOAJobState>();
-
-	static {
-		besStateNameToEnum.put(
-				SMOAActivityStatus.SMOA_ACTIVITY_STATE_CANCELLED,
-				SMOAJobState.Cancelled);
-		besStateNameToEnum.put(SMOAActivityStatus.SMOA_ACTIVITY_STATE_FAILED,
-				SMOAJobState.Failed);
-		besStateNameToEnum.put(SMOAActivityStatus.SMOA_ACTIVITY_STATE_FINISHED,
-				SMOAJobState.Finished);
-	}
-
-	static {
-		besSubStateNameToEnum.put(
-				SMOAActivityStatus.SMOA_ACTIVITY_STATE_EXECUTING,
-				SMOAJobState.Executing);
-		besSubStateNameToEnum.put(SMOAActivityStatus.SMOA_ACTIVITY_STATE_HELD,
-				SMOAJobState.Held);
-		besSubStateNameToEnum.put(
-				SMOAActivityStatus.SMOA_ACTIVITY_STATE_QUEUED,
-				SMOAJobState.Queued);
-		besSubStateNameToEnum.put(
-				SMOAActivityStatus.SMOA_ACTIVITY_STATE_STAGE_IN,
-				SMOAJobState.Stage_in);
-		besSubStateNameToEnum.put(
-				SMOAActivityStatus.SMOA_ACTIVITY_STATE_STAGE_OUT,
-				SMOAJobState.Stage_out);
-		besSubStateNameToEnum.put(
-				SMOAActivityStatus.SMOA_ACTIVITY_STATE_SUSPENDED,
-				SMOAJobState.Suspended);
-	}
-
-	/** Maps BES state name to SMOA JobState */
-	public static SMOAJobState getEquivalentJobState(SMOAActivityStatus status) {
-		final SMOAJobState result = besStateNameToEnum.get(status.getBESStateName());
-		if (result != null) {
-			return result;
-		}
-		return besSubStateNameToEnum.get(status.getBESSubStateName());
-	}
-
-	/** Retrieves value of the output checking interval */
-	public static int getPoolingIntervalOut() {
-		return PoolingIntervalOut;
-	}
-
-	/** Retrieves value of the job state checking interval */
-	public static int getPoolingIntervalTask() {
-		return PoolingIntervalState;
-	}
-
-	/** How often the output will be checked (but not less than 0.1s) */
-	public static void setPoolingIntervalOut(int newVal) {
-		if (newVal >= 100) {
-			PoolingIntervalOut = newVal;
-		}
-	}
-
-	/** How often the job state will be checked (but not less than 0.1s) */
-	public static void setPoolingIntervalTask(int newVal) {
-		if (newVal >= 100) {
-			PoolingIntervalState = newVal;
-		}
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManager.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManager.java
deleted file mode 100644
index c60c942..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManager.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rmsystem;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.ptp.rtsystem.AbstractRuntimeResourceManager;
-
-public class SMOAResourceManager extends AbstractRuntimeResourceManager {
-
-	/**
-	 * Holds JobThread for each running job (identified by JobID), so that RM
-	 * can inform JobThread to terminate the job
-	 */
-	private final Map<String, JobThread> jobThreadForID = new HashMap<String, JobThread>();
-
-	public SMOAResourceManager(SMOAResourceManagerConfiguration config, SMOAResourceManagerControl control,
-			SMOAResourceManagerMonitor monitor) {
-		super(config, control, monitor);
-	}
-
-	@Override
-	public SMOAResourceManagerControl getControl() {
-		return (SMOAResourceManagerControl) super.getControl();
-	}
-
-	@Override
-	public SMOAResourceManagerConfiguration getControlConfiguration() {
-		return (SMOAResourceManagerConfiguration) super.getControlConfiguration();
-	}
-
-	@Override
-	public SMOAResourceManagerMonitor getMonitor() {
-		return (SMOAResourceManagerMonitor) super.getMonitor();
-	}
-
-	@Override
-	public SMOAResourceManagerConfiguration getMonitorConfiguration() {
-		return (SMOAResourceManagerConfiguration) super.getMonitorConfiguration();
-	}
-
-	protected void addJobThread(String jobId, JobThread job) {
-		jobThreadForID.put(jobId, job);
-	}
-
-	protected JobThread getJobThread(String jobId) {
-		return jobThreadForID.get(jobId);
-	}
-
-	protected void removeJobThread(String jobId) {
-		jobThreadForID.remove(jobId);
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManagerConfiguration.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManagerConfiguration.java
deleted file mode 100644
index b2576e0..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManagerConfiguration.java
+++ /dev/null
@@ -1,412 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rmsystem;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.eclipse.equinox.security.storage.ISecurePreferences;
-import org.eclipse.equinox.security.storage.SecurePreferencesFactory;
-import org.eclipse.equinox.security.storage.StorageException;
-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.core.exception.RemoteConnectionException;
-import org.eclipse.ptp.rm.core.rmsystem.AbstractRemoteResourceManagerConfiguration;
-import org.eclipse.ptp.rm.smoa.core.SMOAConfiguration;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOAConnection;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOARemoteServices;
-import org.eclipse.ptp.rm.smoa.core.util.NotifyShell;
-import org.eclipse.ptp.services.core.IServiceProvider;
-
-import com.smoa.comp.stubs.factory.ApplicationsType.Application;
-
-/**
- * Persistently keeps data about one {@link SMOAResourceManager} configuration,
- * i.e. connection data, authentication methods
- * 
- * Keeps also other things related to the RM, like available applications or the
- * connection
- */
-public class SMOAResourceManagerConfiguration extends AbstractRemoteResourceManagerConfiguration implements SMOAConfiguration {
-
-	// Keys used for storing persistent data
-	private final static String URL_KEY = "url"; //$NON-NLS-1$
-	private final static String PORT_KEY = "port"; //$NON-NLS-1$
-	private static final String AUTH_KEY = "auth"; //$NON-NLS-1$
-	private static final String USER_KEY = "user"; //$NON-NLS-1$
-	private static final String CACERT_KEY = "cacert"; //$NON-NLS-1$
-	private static final String DN_KEY = "dn"; //$NON-NLS-1$
-	private static final String RS_ID_KEY = "rs_id"; //$NON-NLS-1$
-
-	private static final String RS_CONN_KEY = "rs_conn"; //$NON-NLS-1$
-
-	// Place for passwords
-	ISecurePreferences securePrefs = SecurePreferencesFactory.getDefault().node("smoa"); //$NON-NLS-1$
-	// Made to differentiate connections with same name, but different data
-	private static int nextConnectionId = 0;
-
-	private static Object nextConnectionIdLock = new Object();
-	private boolean isConectionInitialized = false;
-	private SMOAConnection connection = null;
-	private final SMOAResourceManager resourceManager = null;
-
-	private Map<String, Application> apps;
-
-	boolean notifiedAboutConnLoss = true;
-
-	public SMOAResourceManagerConfiguration() {
-		super();
-	}
-
-	protected SMOAResourceManagerConfiguration(String namespace, IServiceProvider provider) {
-		super(namespace, provider);
-		setDescription(Messages.SMOAResourceManagerConfiguration_SmoaRmDescription);
-		setRemoteServicesId("org.eclipse.ptp.remote.SMOARemoteServices"); //$NON-NLS-1$
-	}
-
-	public Application getAppForName(String name) {
-		if (apps == null) {
-			return null;
-		}
-		return apps.get(name);
-	}
-
-	public AuthType getAuthType() {
-		final String auth = getString(AUTH_KEY, AuthType.Anonymous.toString());
-		return AuthType.valueOf(auth);
-	}
-
-	// SettersAndGetters
-
-	public List<String> getAvailableAppList() {
-		final Vector<String> _ = new Vector<String>();
-		if (apps != null) {
-			_.addAll(apps.keySet());
-		}
-		return _;
-	}
-
-	public String getCaCertPath() {
-		return getString(CACERT_KEY, null);
-	}
-
-	public SMOAConnection getConnection() {
-		return connection;
-	}
-
-	@Override
-	public String getConnectionName() {
-		if (!isConectionInitialized) {
-			initConnection();
-		}
-		return super.getConnectionName();
-	}
-
-	public IRemoteConnection getFileRemoteConnection() {
-		IRemoteConnection fileRemoteConnection = null;
-		final String id = getString(RS_ID_KEY, null);
-		final String name = getString(RS_CONN_KEY, null);
-		if (id != null && name != null) {
-			final IRemoteServices rs = PTPRemoteCorePlugin.getDefault().getRemoteServices(id);
-			if (rs != null) {
-				fileRemoteConnection = rs.getConnectionManager().getConnection(name);
-			}
-
-			if (fileRemoteConnection == null) {
-				notifyConnLoss();
-			}
-		}
-		return fileRemoteConnection;
-	}
-
-	public String getPassword() {
-		if (getUrl() == null) {
-			return null;
-		}
-		String pass = null;
-		try {
-			pass = securePrefs.get(getUrl(), null);
-		} catch (final StorageException e) {
-			Logger.getLogger(getClass().getCanonicalName()).log(Level.SEVERE,
-					Messages.SMOAResourceManagerConfiguration_CouldNotRetreivePassword, e);
-		}
-		return pass;
-	}
-
-	public Integer getPort() {
-		final int port = getInt(PORT_KEY, -1);
-		return port == -1 ? null : port;
-	}
-
-	@Override
-	public String getResourceManagerId() {
-		return getId();
-	}
-
-	public String getServiceDN() {
-		return getString(DN_KEY, null);
-	}
-
-	public String getUrl() {
-		return getString(URL_KEY, null);
-	}
-
-	public String getUser() {
-		return getString(USER_KEY, null);
-	}
-
-	/**
-	 * Creates a connection in the SMOAConnectionManager
-	 */
-	private void initConnection() {
-
-		final SMOARemoteServices remoteServices = (SMOARemoteServices) PTPRemoteCorePlugin.getDefault().getRemoteServices(
-				getRemoteServicesId());
-
-		final IRemoteConnection existingConnection = remoteServices.getConnectionManager().getConnection(super.getConnectionName());
-		if (existingConnection != null) {
-			connection = (SMOAConnection) existingConnection;
-			Logger.getLogger(getClass().getName()).info(Messages.SMOAResourceManagerConfiguration_ReusingConnection);
-			return;
-		}
-
-		try {
-			final SMOAConnection c = remoteServices.getConnectionManager().newConnection(super.getConnectionName());
-			c.setAddress(getUrl());
-			c.setFileConnection(getFileRemoteConnection());
-			c.setRMName(this.getName());
-
-			if (getAuthType() == AuthType.UsernamePassword) {
-				c.setUsername(getUser());
-				c.setPassword(getPassword());
-			}
-
-			c.setPort(getPort());
-			c.setAuthType(getAuthType());
-
-			if (getCaCertPath() != null && !getCaCertPath().isEmpty()) {
-				c.setCaCert(getCaCertPath());
-				if (getServiceDN() != null && !getServiceDN().isEmpty()) {
-					c.setDN(getServiceDN());
-				}
-			}
-			connection = c;
-		} catch (final RemoteConnectionException e) {
-			// should never happen
-			throw new RuntimeException(e);
-		}
-
-		isConectionInitialized = true;
-	}
-
-	@Override
-	public boolean isConfigured() {
-		return true;
-	}
-
-	@Override
-	public boolean needsDebuggerLaunchHelp() {
-		return true;
-	}
-
-	private void notifyConnLoss() {
-		if (notifiedAboutConnLoss) {
-			notifiedAboutConnLoss = false;
-			NotifyShell.open(Messages.SMOAResourceManagerConfiguration_AdditionalConnectionNotAvailable_title,
-					Messages.SMOAResourceManagerConfiguration_AdditionalConnectionNotAvailable_text);
-		}
-	}
-
-	public void setAuthType(AuthType type) {
-		putString(AUTH_KEY, type.toString());
-	}
-
-	public void setAvailableAppList(List<Application> appList) {
-		apps = new HashMap<String, Application>();
-		for (final Application a : appList) {
-			final String version = a.getVersion() == null ? "" : (" " + a //$NON-NLS-1$ //$NON-NLS-2$
-					.getVersion());
-			apps.put(a.getName() + version, a);
-		}
-	}
-
-	public void setCacertPath(String cacert) {
-		if (cacert == null) {
-			return;
-		}
-		if (cacert.equals(getCaCertPath())) {
-			return;
-		}
-		putString(CACERT_KEY, cacert);
-
-		updateConnectionName();
-	}
-
-	public void setDefaultNameAndDesc() {
-
-		final StringBuilder name = new StringBuilder("SMOA Comp"); //$NON-NLS-1$
-		if (getUrl() != null) {
-			name.append(" - "); //$NON-NLS-1$
-
-			switch (getAuthType()) {
-			case Anonymous:
-				name.append(Messages.SMOAResourceManagerConfiguration_PrefixAnonymous);
-				break;
-			case GSI:
-				name.append(Messages.SMOAResourceManagerConfiguration_PrefixGsi);
-				break;
-			case UsernamePassword:
-				if (getUser() != null) {
-					name.append(getUser());
-				}
-				name.append("@"); //$NON-NLS-1$
-				break;
-			}
-
-			if (getUrl() != null) {
-				name.append(getUrl());
-			}
-			name.append(":"); //$NON-NLS-1$
-			if (getPort() != null) {
-				name.append(getPort());
-			}
-		}
-
-		setName(name.toString());
-
-		setDescription("SMOA Computing Resource Manager"); //$NON-NLS-1$
-	}
-
-	public void setFileRemoteConnection(IRemoteConnection rconn) {
-		if (rconn != null) {
-			putString(RS_ID_KEY, rconn.getRemoteServices().getId());
-			putString(RS_CONN_KEY, rconn.getName());
-		} else {
-			putString(RS_ID_KEY, null);
-			putString(RS_CONN_KEY, null);
-		}
-	}
-
-	@Override
-	public void setName(String name) {
-		if (connection != null) {
-			connection.setRMName(name);
-		}
-		super.setName(name);
-	}
-
-	public void setPassword(String passwd) {
-		if (passwd == null) {
-			return;
-		}
-		if (passwd.equals(getPassword())) {
-			return;
-		}
-		if (getUrl() == null) {
-			return;
-		}
-
-		try {
-			securePrefs.put(getUrl(), passwd, true);
-		} catch (final StorageException e) {
-			Logger.getLogger(getClass().getCanonicalName()).log(Level.SEVERE,
-					Messages.SMOAResourceManagerConfiguration_CouldNotStorePassword, e);
-		}
-
-		updateConnectionName();
-	}
-
-	public void setPort(Integer port) {
-		if (port == getPort()) {
-			return;
-		}
-		putInt(PORT_KEY, port);
-		updateConnectionName();
-	}
-
-	public void setServiceDn(String dn) {
-		if (dn == null) {
-			return;
-		}
-		if (dn.equals(getServiceDN())) {
-			return;
-		}
-		putString(DN_KEY, dn);
-
-		updateConnectionName();
-	}
-
-	public void setUrl(String url) {
-		if (url.equals(getUrl())) {
-			return;
-		}
-
-		final String pass = getPassword();
-		if (getUrl() != null) {
-			securePrefs.remove(getUrl());
-		}
-
-		putString(URL_KEY, url);
-
-		if (pass == null) {
-			setPassword(pass);
-		}
-
-		updateConnectionName();
-	}
-
-	public void setUser(String user) {
-		if (user == null) {
-			return;
-		}
-		if (user.equals(getUser())) {
-			return;
-		}
-		putString(USER_KEY, user);
-
-		updateConnectionName();
-	}
-
-	public void trigerSecureStorage() throws StorageException {
-		// Just do something in order to force asking for password
-		securePrefs.put("How should I init the storage without using put method?", //$NON-NLS-1$
-				"No idea.", true); //$NON-NLS-1$
-	}
-
-	private void updateConnectionName() {
-
-		synchronized (nextConnectionIdLock) {
-			setConnectionName(getUrl() + nextConnectionId);
-			nextConnectionId++;
-		}
-
-		if (resourceManager != null) {
-			resourceManager.setConfiguration(this);
-		}
-
-		if (connection == null) {
-			return;
-		}
-
-		final SMOARemoteServices smoaRemoteServices = (SMOARemoteServices) PTPRemoteCorePlugin.getDefault().getRemoteServices(
-				getRemoteServicesId());
-
-		smoaRemoteServices.getConnectionManager().removeConnection(connection);
-		connection = null;
-		isConectionInitialized = false;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManagerControl.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManagerControl.java
deleted file mode 100644
index a00bdd5..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManagerControl.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rmsystem;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ptp.rm.smoa.core.SMOAConfiguration;
-import org.eclipse.ptp.rm.smoa.core.rtsystem.SMOARuntimeSystem;
-import org.eclipse.ptp.rtsystem.AbstractRuntimeResourceManagerControl;
-import org.eclipse.ptp.rtsystem.IRuntimeSystem;
-
-public class SMOAResourceManagerControl extends AbstractRuntimeResourceManagerControl {
-	/** Current configuration of this RM */
-	/* package access */SMOAConfiguration configuration;
-
-	public SMOAResourceManagerControl(SMOAResourceManagerConfiguration config) {
-		super(config);
-		configuration = config;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rtsystem.AbstractRuntimeResourceManagerControl#doControlJob
-	 * (java.lang.String, java.lang.String,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	@Override
-	protected void doControlJob(String jobId, String operation, IProgressMonitor monitor) throws CoreException {
-		if (operation.equals(TERMINATE_OPERATION)) {
-			JobThread job = getResourceManager().getJobThread(jobId);
-			if (job != null) {
-				job.terminate();
-			}
-		}
-		super.doControlJob(jobId, operation, monitor);
-	}
-
-	@Override
-	protected SMOAResourceManager getResourceManager() {
-		return (SMOAResourceManager) super.getResourceManager();
-	}
-
-	@Override
-	protected SMOARuntimeSystem getRuntimeSystem() {
-		final IRuntimeSystem rs = super.getRuntimeSystem();
-		if (rs instanceof SMOARuntimeSystem) {
-			return (SMOARuntimeSystem) rs;
-		}
-		throw new RuntimeException();
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManagerFactory.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManagerFactory.java
deleted file mode 100644
index 88c5537..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManagerFactory.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 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.rm.smoa.core.rmsystem;
-
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory;
-import org.eclipse.ptp.rmsystem.IResourceManager;
-import org.eclipse.ptp.rmsystem.IResourceManagerComponentConfiguration;
-import org.eclipse.ptp.rmsystem.IResourceManagerConfiguration;
-import org.eclipse.ptp.rmsystem.IResourceManagerControl;
-import org.eclipse.ptp.rmsystem.IResourceManagerMonitor;
-import org.eclipse.ptp.services.core.IServiceProvider;
-
-/**
- * @since 5.0
- */
-public class SMOAResourceManagerFactory extends AbstractResourceManagerFactory {
-	private SMOAResourceManagerConfiguration fConfiguration;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory#create(org.eclipse
-	 * .ptp.rmsystem.IResourceManagerConfiguration,
-	 * org.eclipse.ptp.rmsystem.IResourceManagerControl,
-	 * org.eclipse.ptp.rmsystem.IResourceManagerMonitor)
-	 */
-	@Override
-	public IResourceManager create(IResourceManagerConfiguration configuration, IResourceManagerControl control,
-			IResourceManagerMonitor monitor) {
-		return new SMOAResourceManager((SMOAResourceManagerConfiguration) configuration, (SMOAResourceManagerControl) control,
-				(SMOAResourceManagerMonitor) monitor);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory#createConfiguration
-	 * (org.eclipse.ptp.services.core.IServiceProvider)
-	 */
-	@Override
-	public IResourceManagerConfiguration createConfiguration(IServiceProvider provider) {
-		return createCommonConfiguration(provider);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory#createControl
-	 * (org.eclipse.ptp.rmsystem.IResourceManagerComponentConfiguration)
-	 */
-	@Override
-	public IResourceManagerControl createControl(IResourceManagerComponentConfiguration configuration) {
-		return new SMOAResourceManagerControl((SMOAResourceManagerConfiguration) configuration);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory#
-	 * createControlConfiguration
-	 * (org.eclipse.ptp.services.core.IServiceProvider)
-	 */
-	@Override
-	public IResourceManagerComponentConfiguration createControlConfiguration(IServiceProvider provider) {
-		return createCommonConfiguration(provider);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory#createMonitor
-	 * (org.eclipse.ptp.rmsystem.IResourceManagerComponentConfiguration)
-	 */
-	@Override
-	public IResourceManagerMonitor createMonitor(IResourceManagerComponentConfiguration configuration) {
-		return new SMOAResourceManagerMonitor((SMOAResourceManagerConfiguration) configuration);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory#
-	 * createMonitorConfiguration
-	 * (org.eclipse.ptp.services.core.IServiceProvider)
-	 */
-	@Override
-	public IResourceManagerComponentConfiguration createMonitorConfiguration(IServiceProvider provider) {
-		return createCommonConfiguration(provider);
-	}
-
-	private SMOAResourceManagerConfiguration createCommonConfiguration(IServiceProvider provider) {
-		if (fConfiguration == null) {
-			fConfiguration = new SMOAResourceManagerConfiguration(SMOAResourceManagerConfiguration.BASE, provider);
-		}
-		return fConfiguration;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManagerMonitor.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManagerMonitor.java
deleted file mode 100644
index f8fcf9d..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/SMOAResourceManagerMonitor.java
+++ /dev/null
@@ -1,468 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rmsystem;
-
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ptp.core.attributes.ArrayAttribute;
-import org.eclipse.ptp.core.attributes.AttributeManager;
-import org.eclipse.ptp.core.attributes.BooleanAttribute;
-import org.eclipse.ptp.core.attributes.IntegerAttribute;
-import org.eclipse.ptp.core.attributes.StringAttribute;
-import org.eclipse.ptp.core.elements.IPJob;
-import org.eclipse.ptp.core.elements.attributes.ElementAttributes;
-import org.eclipse.ptp.core.elements.attributes.JobAttributes;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
-import org.eclipse.ptp.remote.core.exception.RemoteConnectionException;
-import org.eclipse.ptp.rm.smoa.core.SMOAConfiguration;
-import org.eclipse.ptp.rm.smoa.core.attrib.SMOAJobAttributes;
-import org.eclipse.ptp.rm.smoa.core.attrib.StringMapAttribute;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOAConnection;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOARemoteServices;
-import org.eclipse.ptp.rm.smoa.core.rtsystem.SMOARuntimeSystem;
-import org.eclipse.ptp.rm.smoa.core.util.NotifyShell;
-import org.eclipse.ptp.rtsystem.AbstractRuntimeResourceManagerMonitor;
-import org.eclipse.ptp.rtsystem.IRuntimeSystem;
-
-import com.smoa.comp.sdk.SMOAFactory;
-import com.smoa.comp.sdk.exceptions.InvalidRequestMessageException;
-import com.smoa.comp.sdk.exceptions.NotAuthorizedException;
-import com.smoa.comp.sdk.exceptions.UnsupportedFeatureException;
-import com.smoa.comp.sdk.jsdl.JSDL;
-import com.smoa.comp.sdk.types.ActivityEndpointReference;
-import com.smoa.comp.stubs.factory.ApplicationsType.Application;
-
-public class SMOAResourceManagerMonitor extends AbstractRuntimeResourceManagerMonitor {
-
-	/**
-	 * Extracts from the {@link AttributeManager} proper executable name and
-	 * arguments
-	 * 
-	 * Returns the list containing program path and executable (as first
-	 * element) and all arguments (as next arguments)
-	 */
-	private static List<String> getExecAndArgs(AttributeManager attrs, IRemoteConnection conn, Application app) {
-		final List<String> result = new Vector<String>();
-
-		final BooleanAttribute debug = attrs.getAttribute(JobAttributes.getDebugFlagAttributeDefinition());
-
-		// // // // // // // //
-		// // // debug // // //
-
-		if (debug != null && debug.getValue() == true) {
-			String execPath = attrs.getAttribute(JobAttributes.getDebuggerExecutablePathAttributeDefinition()).getValue();
-
-			if (execPath == null || execPath.isEmpty()) {
-				execPath = "."; //$NON-NLS-1$
-			}
-
-			final String execName = attrs.getAttribute(JobAttributes.getDebuggerExecutableNameAttributeDefinition()).getValue();
-
-			final String execPathAndName = execPath + "/" + execName; //$NON-NLS-1$
-
-			result.add(execPathAndName);
-
-			/* Arguments */
-
-			final List<String> appArguments = attrs.getAttribute(JobAttributes.getDebuggerArgumentsAttributeDefinition())
-					.getValue();
-
-			if (conn.supportsTCPPortForwarding()) {
-				final Pattern portRegex = Pattern.compile("^--port=(\\d+)$"); //$NON-NLS-1$
-				final Pattern hostRegex = Pattern.compile("^--host=(.+)$"); //$NON-NLS-1$
-
-				Integer port = null;
-				String host = null;
-
-				for (final String arg : appArguments) {
-					Matcher m = portRegex.matcher(arg);
-					if (m.matches()) {
-						port = Integer.parseInt(m.group(1));
-					}
-					m = hostRegex.matcher(arg);
-					if (m.matches()) {
-						host = m.group(1);
-					}
-				}
-				if (port != null && host != null) {
-					try {
-						conn.forwardRemotePort(port, host, port);
-					} catch (final RemoteConnectionException e) {
-						NotifyShell.open(Messages.SMOAResourceManager_PortForwardingFailed_title,
-								Messages.SMOAResourceManager_PortForwardingFailed_text + e.getLocalizedMessage());
-					}
-				}
-			}
-
-			result.addAll(appArguments);
-
-			final String appString = attrs.getAttribute(SMOAJobAttributes.getAppNameDef()).getValue();
-			if (SMOAJobAttributes.NO_WRAPPER_SCRIPT.equals(appString) || app == null) {
-				result.add("--server=0"); //$NON-NLS-1$
-			}
-		}
-
-		// // // // // // // //
-		// // / / run / / // //
-		else {
-			String execPath = attrs.getAttribute(JobAttributes.getExecutablePathAttributeDefinition()).getValue();
-
-			if (execPath == null || execPath.isEmpty()) {
-				execPath = "."; //$NON-NLS-1$
-			}
-
-			final String execName = attrs.getAttribute(JobAttributes.getExecutableNameAttributeDefinition()).getValue();
-
-			final String execPathAndName = execPath + "/" + execName; //$NON-NLS-1$
-
-			result.add(execPathAndName);
-
-			/* Arguments */
-
-			final List<String> appArguments = attrs.getAttribute(JobAttributes.getProgramArgumentsAttributeDefinition()).getValue();
-			result.addAll(appArguments);
-		}
-
-		return result;
-	}
-
-	/** Current configuration of this RM */
-	/* package access */SMOAConfiguration configuration;
-
-	/** Assigns sequential run number for each configuration */
-	private final Map<String, Integer> executeCount = new HashMap<String, Integer>();
-
-	public SMOAResourceManagerMonitor(SMOAResourceManagerConfiguration config) {
-		super(config);
-		configuration = config;
-	}
-
-	/**
-	 * Creates script if the user selected an application only.
-	 * 
-	 * @param args
-	 *            - user arguments
-	 * @param app
-	 *            - user application
-	 * @param out
-	 *            - file name for stdout
-	 * @param err
-	 *            - file name for stderr
-	 * @param os
-	 *            - output stream for the script
-	 * @param make
-	 *            - if the user wants us to run 'make'
-	 * @param customMakeCommand
-	 *            - non-null if user wants to use custom run command
-	 */
-	private void createScript(List<String> args, String app, String out, String err, DataOutputStream os, boolean make,
-			String customMakeCommand) throws IOException {
-		os.writeBytes("rm -f " + out + " " + err + "\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-		final StringBuilder redirect = new StringBuilder();
-		redirect.append(" >> "); //$NON-NLS-1$
-		redirect.append(out);
-		redirect.append(" 2>> "); //$NON-NLS-1$
-		redirect.append(err);
-
-		if (make) {
-			os.writeBytes("echo $(date)   Running make >> " + err + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			os.writeBytes("{ "); //$NON-NLS-1$
-			if (customMakeCommand != null) {
-				os.writeBytes(customMakeCommand);
-			} else {
-				os.writeBytes("make clean && make"); //$NON-NLS-1$
-			}
-			os.writeBytes(" ; } "); //$NON-NLS-1$
-			os.writeBytes(redirect.toString());
-			os.writeBytes("\n"); //$NON-NLS-1$
-			os.writeBytes("MAKEOUT=$?\n"); //$NON-NLS-1$
-			os.writeBytes("if [ ${MAKEOUT} -ne 0 ]\n"); //$NON-NLS-1$
-			os.writeBytes("then\n"); //$NON-NLS-1$
-			os.writeBytes("  echo $(date)   Make failed! Quitting. >> " + err //$NON-NLS-1$
-					+ "\n"); //$NON-NLS-1$
-			os.writeBytes("  exit ${MAKEOUT}\n"); //$NON-NLS-1$
-			os.writeBytes("fi\n"); //$NON-NLS-1$
-		}
-
-		os.writeBytes("STDBUF=$(which stdbuf)\n"); //$NON-NLS-1$
-		os.writeBytes("if [ \"${STDBUF}\" ]\n"); //$NON-NLS-1$
-		os.writeBytes("then\n"); //$NON-NLS-1$
-		os.writeBytes("  STDBUF=\"${STDBUF} -oL -eL \"\n"); //$NON-NLS-1$
-		os.writeBytes("fi\n"); //$NON-NLS-1$
-		os.writeBytes("echo $(date)   Starting task >> " + err + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		os.writeBytes("{ time ${STDBUF}"); //$NON-NLS-1$
-
-		// app
-		os.writeBytes(app);
-
-		// arguments
-		for (final String arg : args) {
-			os.write(' ');
-			os.writeBytes(arg);
-		}
-
-		os.writeBytes(" ; }"); //$NON-NLS-1$
-
-		os.writeBytes(redirect.toString());
-		os.write('\n');
-
-		os.writeBytes("OUT=$?\n"); //$NON-NLS-1$
-		os.writeBytes("echo $(date)   Finished! >> " + err + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		os.writeBytes("exit ${OUT}\n"); //$NON-NLS-1$
-
-	}
-
-	/**
-	 * In case the submission failed, we set the job state and forward error
-	 */
-	private IPJob jobControlFromJobException(Exception e, String jobId, AttributeManager attrs) {
-		final String subId = attrs.getAttribute(JobAttributes.getSubIdAttributeDefinition()).getValue();
-
-		attrs.addAttribute(PoolingIntervalsAndStatic.exceptionAttrDef.create(e.getLocalizedMessage()));
-		attrs.addAttribute(JobAttributes.getStateAttributeDefinition().create(JobAttributes.State.COMPLETED));
-		attrs.addAttribute(JobAttributes.getStatusAttributeDefinition().create(Messages.SMOAResourceManager_JobSubmissionFailed));
-
-		getRuntimeSystem().addJobSubmissionError(subId, e);
-
-		final IPJob newJob = super.doCreateJob(jobId, attrs);
-		return newJob;
-	}
-
-	/**
-	 * Adds the SMOA UUID of the activity to job properties
-	 */
-	private void setSmoaUid(String smoaUid, IPJob newJob) {
-		final AttributeManager am = new AttributeManager();
-
-		final Collection<IPJob> jc = new Vector<IPJob>();
-		jc.add(newJob);
-
-		am.addAttribute(SMOAJobAttributes.getSmoaUuidDef().create(smoaUid));
-
-		doUpdateJobs(jc, am);
-	}
-
-	/**
-	 * Triggered by fireCreateJobEvent by {@link SMOARuntimeSystem}, creates the
-	 * job and submits it to the SMOA Computing service.
-	 */
-	@Override
-	protected IPJob doCreateJob(String jobId, AttributeManager attrs) {
-
-		// all temporary files are timestamped with the time generated below:
-		final long time = System.currentTimeMillis();
-
-		final SMOAConnection connection = configuration.getConnection();
-		final SMOAFactory factory = connection.getFactory();
-
-		final String originalName = attrs.getAttribute(ElementAttributes.getNameAttributeDefinition()).getValueAsString();
-
-		// Name for SMOA Computing
-		final JSDL jsdl = new JSDL(originalName);
-		final List<String> arguments = jsdl.getArguments();
-
-		Integer count = executeCount.get(originalName);
-		if (count == null) {
-			executeCount.put(originalName, 0);
-			count = 0;
-		}
-
-		// Label for Eclipse
-		attrs.addAttribute(ElementAttributes.getNameAttributeDefinition().create(originalName + " (" + count + ")")); //$NON-NLS-1$ //$NON-NLS-2$
-
-		executeCount.put(originalName, ++count);
-
-		// Working directory
-		final String workDir = attrs.getAttribute(JobAttributes.getWorkingDirectoryAttributeDefinition()).getValue();
-		if (workDir != null) {
-			jsdl.setWorkingDirectory(workDir);
-		}
-
-		// Setting program
-		final SMOARemoteServices remoteServices = (SMOARemoteServices) PTPRemoteCorePlugin.getDefault().getRemoteServices(
-				configuration.getRemoteServicesId());
-
-		final String appString = attrs.getAttribute(SMOAJobAttributes.getAppNameDef()).getValue();
-		final Application app = configuration.getAppForName(appString);
-
-		final List<String> execArgsAndPath = getExecAndArgs(attrs, connection, app);
-
-		final String execPathAndName = execArgsAndPath.get(0);
-		final List<String> appArguments = execArgsAndPath.subList(1, execArgsAndPath.size());
-
-		jsdl.setOutput("stdout"); //$NON-NLS-1$
-		jsdl.setError("stderr"); //$NON-NLS-1$
-
-		// filenames for out and err, and filename for shell script to be
-		// executed or for the machine file
-		final String out = connection.getHomeDir() + "/.ptp_smoa_out_" + time; //$NON-NLS-1$
-		final String err = connection.getHomeDir() + "/.ptp_smoa_err_" + time; //$NON-NLS-1$
-		String machinefile = null;
-		String sh = null;
-
-		// Custom Make command
-		String customMakeCommand = null;
-
-		final BooleanAttribute ifCustomMake = attrs.getAttribute(SMOAJobAttributes.getIfCustomMakeDef());
-		if (ifCustomMake != null && ifCustomMake.getValue() != null && ifCustomMake.getValue()) {
-			final StringAttribute makeCommand = attrs.getAttribute(SMOAJobAttributes.getCustomMakeCommandDef());
-			if (makeCommand != null && makeCommand.getValue() != null && !makeCommand.getValue().isEmpty()) {
-				customMakeCommand = makeCommand.getValue();
-			}
-		}
-
-		// If wrapper script has to be used
-		if (SMOAJobAttributes.NO_WRAPPER_SCRIPT.equals(appString) || app == null) {
-
-			sh = connection.getHomeDir() + "/.ptp_smoa_sh_" + time; //$NON-NLS-1$
-
-			final BooleanAttribute makeAttr = attrs.getAttribute(SMOAJobAttributes.getMakeDef());
-			final boolean make = (makeAttr == null ? false : makeAttr.getValue());
-
-			// Creating script
-			try {
-				final DataOutputStream os = new DataOutputStream(remoteServices.getFileManager(connection).getResource(sh)
-						.openOutputStream(0, null));
-				createScript(appArguments, execPathAndName, out, err, os, make, customMakeCommand);
-				os.close();
-			} catch (final IOException e) {
-				NotifyShell.open(Messages.SMOAResourceManager_7, e.getLocalizedMessage());
-				return jobControlFromJobException(e, jobId, attrs);
-			} catch (final CoreException e) {
-				NotifyShell.open(Messages.SMOAResourceManager_8, e.getLocalizedMessage());
-				return jobControlFromJobException(e, jobId, attrs);
-			}
-
-			jsdl.setExecutable("/bin/sh"); //$NON-NLS-1$
-			arguments.add(sh);
-		}
-		// If the built-in application has to be used
-		else {
-			machinefile = connection.getHomeDir() + "/.ptp_smoa_machinefile_" //$NON-NLS-1$
-					+ time;
-
-			jsdl.setApplicationName(app.getName());
-			jsdl.setApplicationVersion(app.getVersion());
-
-			arguments.add(execPathAndName);
-			arguments.addAll(appArguments);
-
-			jsdl.getEnvironment().put(SMOAJobAttributes.ENV_STDOUT, out);
-			jsdl.getEnvironment().put(SMOAJobAttributes.ENV_STDERR, err);
-			jsdl.getEnvironment().put(SMOAJobAttributes.ENV_MACHINEFILE, machinefile);
-
-			if (customMakeCommand != null) {
-				jsdl.getEnvironment().put(SMOAJobAttributes.ENV_MAKE_COMMAND, customMakeCommand);
-			}
-
-		}
-
-		// Others
-
-		final StringAttribute attribute1 = attrs.getAttribute(SMOAJobAttributes.getDescDef());
-		if (attribute1 != null && attribute1.getValue() != null && (!attribute1.getValue().isEmpty())) {
-			jsdl.setJobDescription(attribute1.getValue());
-		}
-
-		final StringAttribute attribute2 = attrs.getAttribute(SMOAJobAttributes.getNativeSpecDef());
-		if (attribute2 != null && attribute2.getValue() != null && (!attribute2.getValue().isEmpty())) {
-			jsdl.setNativeSpecification(attribute2.getValue());
-		}
-
-		final IntegerAttribute attribute3 = attrs.getAttribute(SMOAJobAttributes.getMinCpuDef());
-		if (attribute3 != null && attribute3.getValue() != null) {
-			jsdl.setMinCpu(attribute3.getValue());
-		}
-
-		final IntegerAttribute attribute4 = attrs.getAttribute(SMOAJobAttributes.getMaxCpuDef());
-		if (attribute4 != null && attribute4.getValue() != null) {
-			jsdl.setMaxCpu(attribute4.getValue());
-		}
-
-		final ArrayAttribute<String> attribute5 = attrs.getAttribute(SMOAJobAttributes.getPrefferedDef());
-		if (attribute5 != null && attribute5.getValue() != null) {
-			for (final String machineName : attribute5.getValue()) {
-				jsdl.getCandidateHosts().add(machineName);
-			}
-		}
-
-		final StringMapAttribute attribute6 = attrs.getAttribute(SMOAJobAttributes.getEnvDef());
-		if (attribute6 != null && (!attribute6.getValue().isEmpty())) {
-			jsdl.getEnvironment().putAll(attribute6.getValue());
-		}
-
-		final BooleanAttribute attribute7 = attrs.getAttribute(SMOAJobAttributes.getMakeDef());
-		if (attribute7 != null && attribute7.getValue()) {
-			jsdl.getEnvironment().put(SMOAJobAttributes.ENV_IF_MAKE, "1"); //$NON-NLS-1$
-		} else {
-			jsdl.getEnvironment().remove(SMOAJobAttributes.ENV_IF_MAKE);
-		}
-
-		final StringAttribute attribute8 = attrs.getAttribute(SMOAJobAttributes.getQueueNameDef());
-		if (attribute8 != null && attribute8.getValue() != null && (!attribute8.getValue().isEmpty())) {
-			jsdl.setQueueName(attribute8.getValue());
-		}
-
-		ActivityEndpointReference activityReference;
-
-		// Submitting the job
-		try {
-			activityReference = factory.createActivity(jsdl);
-		} catch (final InvalidRequestMessageException e) {
-			return jobControlFromJobException(e, jobId, attrs);
-		} catch (final NotAuthorizedException e) {
-			return jobControlFromJobException(e, jobId, attrs);
-		} catch (final UnsupportedFeatureException e) {
-			return jobControlFromJobException(e, jobId, attrs);
-		} catch (final Throwable t) {
-			throw new RuntimeException(t);
-		}
-
-		final IPJob jobControl = super.doCreateJob(jobId, attrs);
-
-		setSmoaUid(activityReference.getActivityUUID(), jobControl);
-
-		// Starting job monitoring thread
-		final JobThread jobThread = new JobThread(getResourceManager(), factory, activityReference, jobControl, out, err, sh,
-				machinefile);
-		getResourceManager().addJobThread(jobControl.getID(), jobThread);
-		jobThread.start();
-
-		return jobControl;
-	}
-
-	@Override
-	protected SMOAResourceManager getResourceManager() {
-		return (SMOAResourceManager) super.getResourceManager();
-	}
-
-	@Override
-	protected SMOARuntimeSystem getRuntimeSystem() {
-		final IRuntimeSystem rs = super.getRuntimeSystem();
-		if (rs instanceof SMOARuntimeSystem) {
-			return (SMOARuntimeSystem) rs;
-		}
-		throw new RuntimeException();
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/messages.properties b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/messages.properties
deleted file mode 100644
index 689915e..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rmsystem/messages.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-JobThread_ErrorDeletingTempFiles_text=Could not remove temporary files\n
-JobThread_ErrorDeletingTempFiles_title=Clean-up problem
-JobThread_ErrorErr=Error occured while retreiving stderr
-JobThread_ErrorOpeningRemote=Error by opening remote file\!
-JobThread_ErrorOut=Error occured while retreiving stdout
-JobThread_ErrorReadingRemote=Error by reading remote file\!
-JobThread_ExceptionByMonitoring=Exception occured by monitoring job
-JobThread_JobStateCancelled=Job was cancelled
-JobThread_JobStateFailed=Job failed
-JobThread_JobStateFinisedWithStatus=Job finished with exit status: 
-JobThread_JobStateUnknown=Unknown
-JobThread_UnknownNode_text_1=Reported process on an unknown node:\n
-JobThread_UnknownNode_text_2=\n The node has been added to node list.
-JobThread_UnknownNode_title=Error\!
-PoolingIntervalsAndStatic_JobSubmissionFailed=Job submission failed
-SMOAResourceManager_7=Failed to write the run script on remote host
-SMOAResourceManager_8=Failed to create run script on remote host
-SMOAResourceManager_JobSubmissionFailed=Exception by submitting occured
-SMOAResourceManager_PortForwardingFailed_text=Continuing without port forwarding.\nError:\n
-SMOAResourceManager_PortForwardingFailed_title=Port forwarding problem
-SMOAResourceManagerConfiguration_AdditionalConnectionNotAvailable_text=Specified connection no longer exists, falling back to SMOA built-ins. Please update the configuration.
-SMOAResourceManagerConfiguration_AdditionalConnectionNotAvailable_title=Configuration error
-SMOAResourceManagerConfiguration_CouldNotRetreivePassword=Coud not retreive password\!\!
-SMOAResourceManagerConfiguration_CouldNotStorePassword=Coud not store password\!\!
-SMOAResourceManagerConfiguration_PrefixAnonymous=[anonymous] 
-SMOAResourceManagerConfiguration_PrefixGsi=[GSI] 
-SMOAResourceManagerConfiguration_ReusingConnection=Reusing existing SMOA connection
-SMOAResourceManagerConfiguration_SmoaRmDescription=SMOA Computing Resource Manager
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/Messages.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/Messages.java
deleted file mode 100644
index 608a93d..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/Messages.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rservices;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rm.smoa.core.rservices.messages"; //$NON-NLS-1$
-	public static String SMOAConnection_CannotModifyOpenConnection;
-	public static String SMOAConnection_UnsupportedAuthType;
-	public static String SMOAConnectionManager_DuplicatedConnection;
-	public static String SMOAFileStore_ChmodFailed;
-	public static String SMOAFileStore_InputStreamForFileNotReceived;
-	public static String SMOAFileStore_MkdirOverAnExistingFile;
-	public static String SMOAFileStore_RequestedListingUnexistingDirOrFile;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAConnection.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAConnection.java
deleted file mode 100644
index c6f1aaa..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAConnection.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rservices;
-
-import java.io.IOException;
-import java.security.GeneralSecurityException;
-import java.util.Map;
-
-import javax.xml.bind.JAXBException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.IRemoteConnectionChangeListener;
-import org.eclipse.ptp.remote.core.IRemoteFileManager;
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.core.exception.RemoteConnectionException;
-import org.eclipse.ptp.rm.smoa.core.SMOAConfiguration.AuthType;
-
-import com.smoa.comp.sdk.SMOAFactory;
-import com.smoa.comp.sdk.SMOARsync;
-import com.smoa.comp.sdk.SMOAStaging;
-import com.smoa.comp.sdk.jsdl.JSDL;
-import com.smoa.comp.stubs.staging.FileNotFoundFault;
-import com.smoa.comp.stubs.staging.NotAuthorizedFault;
-import com.smoa.core.sdk.attachments.FileStagingHandler;
-import com.smoa.core.sdk.security.AuthenticationModule;
-import com.smoa.core.sdk.security.anonymous.AnonymousAuthentication;
-import com.smoa.core.sdk.security.gsi.GSIAuthentication;
-import com.smoa.core.sdk.security.ssl.SSLAuthentication;
-import com.smoa.core.sdk.security.wsse.WSSEAuthentication;
-import com.smoa.core.sdk.security.wsse.username.UsernameToken;
-
-/**
- * Main class for maintaining the real connection with SMOA Computing.
- * 
- * Keeps the SMOAFactory, SMOAStaging and SMOARsync objects.
- */
-public class SMOAConnection implements IRemoteConnection {
-
-	// Keys for map used to transfer connection attributes
-	public static final String TAG_ADDRESS = "address"; //$NON-NLS-1$
-	public static final String TAG_PORT = "port"; //$NON-NLS-1$
-	public static final String TAG_AUTHTYPE = "auth"; //$NON-NLS-1$
-	public static final String TAG_USERNAME = "user"; //$NON-NLS-1$
-	public static final String TAG_PASSWORD = "pass"; //$NON-NLS-1$
-	public static final String TAG_CACERT = "cacert"; //$NON-NLS-1$
-	public static final String TAG_DN = "dn"; //$NON-NLS-1$
-
-	// parent RemoteServices
-	private final SMOARemoteServices remoteServices;
-
-	// Connection state
-	private boolean connectionIsOpen = false;
-
-	// Crucial objects
-	private SMOAFactory besFactory;
-	private SMOAStaging smoaStaging;
-	private SMOARsync rsync;
-
-	// Connection info
-	private String name = null;
-	private String url = null;
-	private int port = 0;
-	private String resourceManagerName;
-
-	// Authentication info
-	private AuthType auth;
-	private String username;
-	private String password;
-	private String dn;
-	private String cacert;
-
-	// Others
-	private IRemoteFileManager fileManager = null;
-	private String workDir = "."; //$NON-NLS-1$
-	private String homeDir = null;
-	private IRemoteConnection fileRemoteConnection = null;
-
-	public SMOAConnection(SMOARemoteServices remoteServices, String name) {
-		this.remoteServices = remoteServices;
-		this.name = name;
-	}
-
-	public void addConnectionChangeListener(IRemoteConnectionChangeListener listener) {
-		if (fileRemoteConnection != null) {
-			fileRemoteConnection.addConnectionChangeListener(listener);
-		}
-
-	}
-
-	public void close() {
-		if (fileRemoteConnection != null) {
-			fileRemoteConnection.close();
-		}
-	}
-
-	public void forwardLocalPort(int localPort, String fwdAddress, int fwdPort) throws RemoteConnectionException {
-		if (fileRemoteConnection != null) {
-			fileRemoteConnection.forwardLocalPort(localPort, fwdAddress, fwdPort);
-		}
-
-	}
-
-	public int forwardLocalPort(String fwdAddress, int fwdPort, IProgressMonitor monitor) throws RemoteConnectionException {
-		if (fileRemoteConnection != null) {
-			return fileRemoteConnection.forwardLocalPort(fwdAddress, fwdPort, monitor);
-		}
-		return 0;
-	}
-
-	public void forwardRemotePort(int remotePort, String fwdAddress, int fwdPort) throws RemoteConnectionException {
-		if (fileRemoteConnection != null) {
-			fileRemoteConnection.forwardRemotePort(remotePort, fwdAddress, fwdPort);
-		}
-
-	}
-
-	public int forwardRemotePort(String fwdAddress, int fwdPort, IProgressMonitor monitor) throws RemoteConnectionException {
-		if (fileRemoteConnection != null) {
-			return fileRemoteConnection.forwardRemotePort(fwdAddress, fwdPort, monitor);
-		}
-		return 0;
-	}
-
-	public String getAddress() {
-		return url;
-	}
-
-	public Map<String, String> getAttributes() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public Map<String, String> getEnv() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public String getEnv(String name) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public SMOAFactory getFactory() {
-		return besFactory;
-	}
-
-	public IRemoteConnection getFileConnection() {
-		return fileRemoteConnection;
-	}
-
-	public IRemoteFileManager getFileManager() {
-		return fileManager;
-	}
-
-	public String getHomeDir() {
-		if (homeDir != null) {
-			return homeDir;
-		}
-
-		if (!isOpen()) {
-			return "."; //$NON-NLS-1$
-		}
-
-		JSDL jsdl;
-		try {
-			jsdl = smoaStaging.listDirectory(".", null); //$NON-NLS-1$
-		} catch (final FileNotFoundFault e) {
-			throw new RuntimeException();
-		} catch (final NotAuthorizedFault e) {
-			throw new RuntimeException();
-		}
-		homeDir = jsdl.getWorkingDirectory();
-		return homeDir;
-
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public int getPort() {
-		return port;
-	}
-
-	public String getProperty(String key) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public IRemoteServices getRemoteServices() {
-		return remoteServices;
-	}
-
-	public String getRMName() {
-		return resourceManagerName;
-	}
-
-	public SMOARsync getRsync() {
-		return rsync;
-	}
-
-	public SMOAStaging getSMOAStaging() {
-		return smoaStaging;
-	}
-
-	public String getUsername() {
-		return username;
-	}
-
-	public String getWorkingDirectory() {
-		if (workDir.equals(".")) { //$NON-NLS-1$
-			getHomeDir();
-			if (homeDir != null) {
-				workDir = getHomeDir();
-			} else {
-				return "."; //$NON-NLS-1$
-			}
-		}
-		if (fileRemoteConnection != null) {
-			fileRemoteConnection.setWorkingDirectory(workDir);
-		}
-		return workDir;
-	}
-
-	public boolean isOpen() {
-		if (fileRemoteConnection != null && !fileRemoteConnection.isOpen()) {
-			return false;
-		}
-		return connectionIsOpen;
-	}
-
-	public void open(IProgressMonitor monitor) throws RemoteConnectionException {
-		try {
-			final AnonymousAuthentication anonAuth = new AnonymousAuthentication();
-			final FileStagingHandler fileStagingHandler = new SMOAFileStagingHandler();
-
-			switch (auth) {
-			case Anonymous:
-				besFactory = new SMOAFactory(url, port, anonAuth, true);
-				smoaStaging = new SMOAStaging(url, port, anonAuth, true, fileStagingHandler);
-				rsync = new SMOARsync(url, port, anonAuth, true);
-				break;
-			case GSI:
-				final GSIAuthentication gsi = new GSIAuthentication(dn != null && !dn.isEmpty() ? dn : null);
-				besFactory = new SMOAFactory(url, port, gsi, true);
-				smoaStaging = new SMOAStaging(url, port, gsi, true, fileStagingHandler);
-				rsync = new SMOARsync(url, port, gsi, true);
-
-				break;
-			case UsernamePassword: {
-
-				final WSSEAuthentication wsseAuth = new WSSEAuthentication(new UsernameToken(username, password, false, false));
-
-				AuthenticationModule am;
-
-				if (cacert == null) {
-					am = anonAuth;
-				} else {
-					am = new SSLAuthentication(cacert, null, dn != null && !dn.isEmpty() ? dn : null);
-
-				}
-
-				rsync = new SMOARsync(url, port, am, wsseAuth);
-				besFactory = new SMOAFactory(url, port, am, wsseAuth);
-				smoaStaging = new SMOAStaging(url, port, am, wsseAuth, true, fileStagingHandler);
-
-				break;
-			}
-			default:
-				throw new RuntimeException(Messages.SMOAConnection_UnsupportedAuthType);
-			}
-			connectionIsOpen = true;
-
-		} catch (final JAXBException e) {
-			throw new RemoteConnectionException(e);
-		} catch (final IOException e) {
-			throw new RemoteConnectionException(e);
-		} catch (final GeneralSecurityException e) {
-			throw new RemoteConnectionException(e);
-		}
-		if (fileRemoteConnection != null) {
-			fileRemoteConnection.open(monitor);
-		}
-	}
-
-	public void removeConnectionChangeListener(IRemoteConnectionChangeListener listener) {
-		if (fileRemoteConnection != null) {
-			fileRemoteConnection.removeConnectionChangeListener(listener);
-		}
-
-	}
-
-	public void setAddress(String address) {
-		if (address == null) {
-			return;
-		}
-		if (address.equals(url)) {
-			return;
-		}
-		if (isOpen()) {
-			throw new RuntimeException(Messages.SMOAConnection_CannotModifyOpenConnection);
-		}
-		url = address;
-	}
-
-	public void setAuthType(AuthType auth) {
-		if (this.auth == auth) {
-			return;
-		}
-		if (isOpen()) {
-			throw new RuntimeException(Messages.SMOAConnection_CannotModifyOpenConnection);
-		}
-		this.auth = auth;
-	}
-
-	public void setCaCert(String string) {
-		cacert = string;
-	}
-
-	public void setDN(String string) {
-		dn = string;
-	}
-
-	public void setFileConnection(IRemoteConnection fileRemoteConnection) {
-		if (isOpen()) {
-			throw new RuntimeException(Messages.SMOAConnection_CannotModifyOpenConnection);
-		}
-		this.fileRemoteConnection = fileRemoteConnection;
-	}
-
-	public void setFileManager(IRemoteFileManager fileManager) {
-		this.fileManager = fileManager;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public void setPort(int port) {
-		if (this.port == port) {
-			return;
-		}
-		if (isOpen()) {
-			throw new RuntimeException(Messages.SMOAConnection_CannotModifyOpenConnection);
-		}
-		this.port = port;
-	}
-
-	public void setRMName(String rMName) {
-		resourceManagerName = rMName;
-	}
-
-	public void setUsername(String username) {
-		if (isOpen()) {
-			throw new RuntimeException();
-		}
-		this.username = username;
-	}
-
-	public void setWorkingDirectory(String path) {
-		workDir = path;
-		if (fileRemoteConnection != null) {
-			fileRemoteConnection.setWorkingDirectory(path);
-		}
-
-	}
-
-	public boolean supportsTCPPortForwarding() {
-		if (fileRemoteConnection != null) {
-			return fileRemoteConnection.supportsTCPPortForwarding();
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.remote.core.IRemoteConnection#setAttribute(java.lang.
-	 * String, java.lang.String)
-	 */
-	public void setAttribute(String key, String value) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.remote.core.IRemoteConnection#setPassword(java.lang.String
-	 * )
-	 */
-	public void setPassword(String password) {
-		if (isOpen()) {
-			throw new RuntimeException(Messages.SMOAConnection_CannotModifyOpenConnection);
-		}
-		this.password = password;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAConnectionManager.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAConnectionManager.java
deleted file mode 100644
index b9475ee..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAConnectionManager.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rservices;
-
-import java.net.URI;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.TreeMap;
-
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.IRemoteConnectionManager;
-import org.eclipse.ptp.remote.core.exception.RemoteConnectionException;
-
-/**
- * Manages existing SMOA connections
- */
-public class SMOAConnectionManager implements IRemoteConnectionManager {
-
-	/** Parent Remote Services */
-	private final SMOARemoteServices remoteServices;
-
-	/** Map keeping connection under it's name */
-	private final Map<String, SMOAConnection> connections = new HashMap<String, SMOAConnection>();
-
-	public SMOAConnectionManager(SMOARemoteServices remoteServices) {
-		this.remoteServices = remoteServices;
-	}
-
-	public SMOAConnection getConnection(String name) {
-		return connections.get(name);
-	}
-
-	public SMOAConnection getConnection(URI uri) {
-		return getConnection(uri.toString());
-	}
-
-	/**
-	 * In order to prevent using this Remote Services in other RM's, the
-	 * official connection list is always empty
-	 */
-	public SMOAConnection[] getConnections() {
-		// return connections.values().toArray(new
-		// SMOAConnection[connections.size()]);
-		return new SMOAConnection[0];
-	}
-
-	/**
-	 * Retrieves all successful connections
-	 */
-	public Map<String, SMOAConnection> getOpenConnections() {
-		final Map<String, SMOAConnection> map = new TreeMap<String, SMOAConnection>();
-		for (final Entry<String, SMOAConnection> entry : connections.entrySet()) {
-			if (entry.getValue().isOpen()) {
-				map.put(entry.getKey(), entry.getValue());
-			}
-		}
-		return map;
-	}
-
-	/**
-	 * Creates a connection, does not open it.
-	 */
-	public SMOAConnection newConnection(String name) throws RemoteConnectionException {
-
-		if (connections.containsKey(name)) {
-			throw new RemoteConnectionException(Messages.SMOAConnectionManager_DuplicatedConnection);
-		}
-
-		final SMOAConnection connection = new SMOAConnection(remoteServices, name);
-
-		connections.put(name, connection);
-
-		return connection;
-	}
-
-	public void removeConnection(IRemoteConnection connection) {
-		connection.close();
-		connections.remove(connection.getName());
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAFileManager.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAFileManager.java
deleted file mode 100644
index c591cf8..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAFileManager.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rservices;
-
-import java.net.URI;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.ptp.remote.core.IRemoteFileManager;
-
-import com.smoa.comp.sdk.SMOAStaging;
-
-public class SMOAFileManager implements IRemoteFileManager {
-
-	final private SMOAStaging staging;
-	private final SMOAConnection connection;
-
-	public SMOAFileManager(SMOAConnection c) {
-		this.connection = c;
-		staging = c.getSMOAStaging();
-	}
-
-	public String getDirectorySeparator() {
-		return "/"; //$NON-NLS-1$
-	}
-
-	public SMOAFileStore getResource(String path) {
-		return new SMOAFileStore(path, staging, connection, null);
-	}
-
-	public String toPath(URI uri) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public URI toURI(IPath path) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public URI toURI(String path) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAFileStagingHandler.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAFileStagingHandler.java
deleted file mode 100644
index 80f7ebe..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAFileStagingHandler.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rservices;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-
-import com.smoa.core.sdk.attachments.FileStagingHandler;
-
-/**
- * Staging handler working in cooperation with {@link SMOAFileStore} class.
- */
-public class SMOAFileStagingHandler implements FileStagingHandler {
-
-	public synchronized InputStream stageIn(String arg0) throws IOException {
-		final TransferStream ts = new TransferStream();
-
-		final SMOAFileStore fileStore = SMOAFileStore.fileStoresWaitingForStaging
-				.get(arg0);
-		SMOAFileStore.fileStoresWaitingForOutputStream.put(arg0, ts.os);
-
-		synchronized (fileStore) {
-			fileStore.notify();
-		}
-
-		return ts.is;
-	}
-
-	public synchronized void stageOut(String arg0, InputStream arg1)
-			throws IOException {
-
-		SMOAFileStore.fileStoresWaitingForInputStream.put(arg0, arg1);
-	}
-}
-
-/**
- * Two connected Pipe(I/O)Streams. Needed when library has: Input method() and
- * user wants: method(Output)
- */
-class TransferStream {
-	PipedInputStream is = new PipedInputStream();
-	PipedOutputStream os = new PipedOutputStream();
-	{
-		try {
-			is.connect(os);
-		} catch (final IOException e) {
-			throw new RuntimeException(e);
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAFileStore.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAFileStore.java
deleted file mode 100644
index 38a5695..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOAFileStore.java
+++ /dev/null
@@ -1,615 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rservices;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.provider.FileStore;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ptp.rm.smoa.core.SMOACoreActivator;
-
-import com.smoa.comp.sdk.SMOAStaging;
-import com.smoa.comp.sdk.exceptions.DeleteOnTerminationException;
-import com.smoa.comp.sdk.exceptions.FileNotFoundException;
-import com.smoa.comp.sdk.exceptions.NotAuthorizedException;
-import com.smoa.comp.sdk.exceptions.StagingException;
-import com.smoa.comp.sdk.jsdl.JSDL;
-import com.smoa.comp.sdk.jsdl.JSDLDataStaging;
-import com.smoa.comp.sdk.types.FileInfo;
-import com.smoa.comp.stubs.staging.FileNotFoundFault;
-import com.smoa.comp.stubs.staging.NotAuthorizedFault;
-import com.smoa.comp.stubs.staging.StagingFault;
-
-/**
- * Represents a potential file or directory. {@see
- * http://help.eclipse.org/helios
- * /index.jsp?topic=/org.eclipse.platform.doc.isv/reference
- * /api/org/eclipse/core/filesystem/package-summary.html}
- */
-public class SMOAFileStore extends FileStore {
-
-	private final SMOAStaging staging;
-	private final SMOAConnection connection;
-
-	/** Absolute path to file */
-	private final String path;
-
-	/** If file exists */
-	boolean exists = true;
-
-	private FileInfo info;
-
-	/** Parent file store (i.e. "../") */
-	private final SMOAFileStore parent;
-
-	// Maps used to co-operate with {@link SMOAFileStagingHandler}
-	static public Map<String, SMOAFileStore> fileStoresWaitingForStaging = new ConcurrentHashMap<String, SMOAFileStore>();
-	static public Map<String, InputStream> fileStoresWaitingForInputStream = new ConcurrentHashMap<String, InputStream>();
-	static public Map<String, OutputStream> fileStoresWaitingForOutputStream = new ConcurrentHashMap<String, OutputStream>();
-
-	// File info used in case of an error
-	static final FileInfo errorFileInfo = new FileInfo(0, 0, null, null, 0,
-			null, null, null);
-
-	private static int counter = 0;
-
-	private static Object ctr_lock = new Object();
-
-	private static String chmodAttributesFromFileInfo(IFileInfo fileInfo) {
-		int rights = 0;
-
-		if (fileInfo.getAttribute(EFS.ATTRIBUTE_OTHER_EXECUTE)) {
-			rights |= 01;
-		}
-		if (fileInfo.getAttribute(EFS.ATTRIBUTE_OTHER_WRITE)) {
-			rights |= 02;
-		}
-		if (fileInfo.getAttribute(EFS.ATTRIBUTE_OTHER_READ)) {
-			rights |= 04;
-		}
-
-		if (fileInfo.getAttribute(EFS.ATTRIBUTE_GROUP_EXECUTE)) {
-			rights |= 010;
-		}
-		if (fileInfo.getAttribute(EFS.ATTRIBUTE_GROUP_WRITE)) {
-			rights |= 020;
-		}
-		if (fileInfo.getAttribute(EFS.ATTRIBUTE_GROUP_READ)) {
-			rights |= 040;
-		}
-
-		if (fileInfo.getAttribute(EFS.ATTRIBUTE_OWNER_EXECUTE)) {
-			rights |= 0100;
-		}
-		if (fileInfo.getAttribute(EFS.ATTRIBUTE_OWNER_WRITE)) {
-			rights |= 0200;
-		}
-		if (fileInfo.getAttribute(EFS.ATTRIBUTE_OWNER_READ)) {
-			rights |= 0400;
-		}
-
-		return Integer.toString(rights, 8);
-	}
-
-	/**
-	 * Constructs new SMOAFileStore, does not fetch the info
-	 * 
-	 * @param path
-	 *            - may be relative
-	 * @param parent
-	 *            - parent directory store
-	 */
-	public SMOAFileStore(String path, SMOAStaging staging,
-			SMOAConnection connection, SMOAFileStore parent) {
-		super();
-
-		while (path.endsWith("/") && path.length() > 1) { //$NON-NLS-1$
-			path = path.substring(0, path.length() - 1);
-		}
-
-		while (path.startsWith("./")) { //$NON-NLS-1$
-			path = path.substring(2);
-		}
-
-		if (path.equals(".") || path.equals("")) { //$NON-NLS-1$ //$NON-NLS-2$
-			path = connection.getHomeDir();
-		}
-
-		if (!path.startsWith("/")) { //$NON-NLS-1$
-			path = connection.getHomeDir() + "/" + path; //$NON-NLS-1$
-		}
-
-		this.path = path;
-		this.connection = connection;
-		this.staging = staging;
-		this.parent = parent;
-	}
-
-	/**
-	 * Returns last fetched IFileInfo, or null if no info has been fetched yet.
-	 */
-	public IFileInfo cachedInfo() throws CoreException {
-
-		org.eclipse.core.filesystem.provider.FileInfo fileInfo;
-		fileInfo = new org.eclipse.core.filesystem.provider.FileInfo(path);
-
-		fileInfo.setExists(exists);
-
-		if (!exists) {
-			return fileInfo;
-		}
-
-		if (info == null) {
-			return null;
-		}
-		
-		fileInfo.setDirectory((info.getMode() & FileInfo.S_IFDIR) != 0);
-
-		fileInfo.setLastModified(info.getModificationTime().getTime());
-
-		fileInfo.setLength(info.getSize());
-
-		fileInfo.setAttribute(EFS.ATTRIBUTE_EXECUTABLE,
-				(info.getMode() & 0111) != 0);
-		fileInfo.setAttribute(EFS.ATTRIBUTE_HIDDEN, getName().matches("^.")); //$NON-NLS-1$
-		fileInfo.setAttribute(EFS.ATTRIBUTE_READ_ONLY,
-				(info.getMode() & 0444) == 0);
-		fileInfo.setAttribute(EFS.ATTRIBUTE_SYMLINK,
-				(info.getMode() & FileInfo.S_IFLNK) != 0);
-		fileInfo.setAttribute(EFS.ATTRIBUTE_OWNER_EXECUTE,
-				(info.getMode() & 0100) != 0);
-		fileInfo.setAttribute(EFS.ATTRIBUTE_OWNER_READ,
-				(info.getMode() & 0400) != 0);
-		fileInfo.setAttribute(EFS.ATTRIBUTE_OWNER_WRITE,
-				(info.getMode() & 0200) != 0);
-		fileInfo.setAttribute(EFS.ATTRIBUTE_GROUP_EXECUTE,
-				(info.getMode() & 010) != 0);
-		fileInfo.setAttribute(EFS.ATTRIBUTE_GROUP_READ,
-				(info.getMode() & 040) != 0);
-		fileInfo.setAttribute(EFS.ATTRIBUTE_GROUP_WRITE,
-				(info.getMode() & 020) != 0);
-		fileInfo.setAttribute(EFS.ATTRIBUTE_OTHER_EXECUTE,
-				(info.getMode() & 01) != 0);
-		fileInfo.setAttribute(EFS.ATTRIBUTE_OTHER_READ,
-				(info.getMode() & 04) != 0);
-		fileInfo.setAttribute(EFS.ATTRIBUTE_OTHER_WRITE,
-				(info.getMode() & 02) != 0);
-
-		if ((info.getMode() & FileInfo.S_IFLNK) != 0) {
-			fileInfo.setStringAttribute(EFS.ATTRIBUTE_LINK_TARGET, path);
-		}
-
-		return fileInfo;
-	}
-
-	/**
-	 * Returns IFileInfos for all children in this directory. Uses one call for
-	 * all files instead of a call for every file. If fails, falls back to
-	 * default implementation.
-	 */
-	@Override
-	public IFileInfo[] childInfos(int options, IProgressMonitor monitor)
-			throws CoreException {
-
-		final List<String> fileNames = new Vector<String>();
-		final String[] childNames = childNames(options, monitor);
-
-		if (childNames.length == 0) {
-			return new IFileInfo[0];
-		}
-
-		for (final String childName : childNames) {
-			fileNames.add(path + "/" + childName); //$NON-NLS-1$
-		}
-
-		FileInfo[] infos;
-		try {
-			infos = staging.statFile(fileNames, null);
-		} catch (final FileNotFoundFault e) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					SMOACoreActivator.PLUGIN_ID, e.getLocalizedMessage(), e));
-		} catch (final NotAuthorizedFault e) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					SMOACoreActivator.PLUGIN_ID, e.getLocalizedMessage(), e));
-		} catch (final StagingFault e) {
-			return super.childInfos(options, monitor);
-		}
-
-		final SMOAFileStore[] stores = new SMOAFileStore[fileNames.size()];
-		final IFileInfo[] smoaInfos = new IFileInfo[fileNames.size()];
-		for (int i = 0; i < infos.length; i++) {
-			stores[i] = fromChildInfo(infos[i], fileNames.get(i));
-			smoaInfos[i] = stores[i].cachedInfo();
-		}
-
-		return smoaInfos;
-	}
-
-	/**
-	 * Returns the directory listing (like <tt>ls -1</tt>)
-	 */
-	@Override
-	public String[] childNames(int arg0, IProgressMonitor arg1)
-			throws CoreException {
-
-		fetchInfo(arg0, arg1);
-
-		if (!exists) {
-			throw new CoreException(new Status(IStatus.WARNING,
-					SMOACoreActivator.PLUGIN_ID,
-					Messages.SMOAFileStore_RequestedListingUnexistingDirOrFile));
-		}
-
-		if ((info.getMode() & FileInfo.S_IFDIR) == 0) {
-			return new String[0];
-		}
-
-		JSDL jsdl;
-
-		try {
-			jsdl = staging.listDirectory(path, null);
-		} catch (final FileNotFoundFault e) {
-			throw new RuntimeException(e);
-		} catch (final NotAuthorizedFault e) {
-			throw new RuntimeException(e);
-		}
-
-		final Vector<String> names = new Vector<String>();
-		for (final JSDLDataStaging ds : jsdl.getDataStaging()) {
-			if (ds.getFileName().equals(".") || ds.getFileName().equals("..")) { //$NON-NLS-1$ //$NON-NLS-2$
-				continue;
-			}
-			names.add(ds.getFileName());
-		}
-		return names.toArray(new String[names.size()]);
-	}
-
-	@Override
-	public void delete(int options, IProgressMonitor monitor)
-			throws CoreException {
-		try {
-			staging.delete(path, null);
-		} catch (final FileNotFoundFault e) {
-		} catch (final NotAuthorizedFault e) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					SMOACoreActivator.PLUGIN_ID, e.getLocalizedMessage(), e));
-		} catch (final StagingFault e) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					SMOACoreActivator.PLUGIN_ID, e.getLocalizedMessage(), e));
-		}
-	}
-
-	/**
-	 * Fetches info for a single file
-	 */
-	@Override
-	public IFileInfo fetchInfo(int arg0, IProgressMonitor arg1)
-			throws CoreException {
-		try {
-			final List<String> l = new Vector<String>();
-			l.add(path);
-			info = staging.statFile(l, null)[0];
-			exists = true;
-		} catch (final FileNotFoundFault e) {
-			exists = false;
-		} catch (final NotAuthorizedFault e) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					SMOACoreActivator.PLUGIN_ID, e.getLocalizedMessage(), e));
-		} catch (final StagingFault e) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					SMOACoreActivator.PLUGIN_ID, e.getLocalizedMessage(), e));
-		}
-
-		return cachedInfo();
-
-	}
-
-	/**
-	 * If one has a FileInfo of a child, one may create FileStore with it
-	 */
-	protected SMOAFileStore fromChildInfo(FileInfo info, String path) {
-		final SMOAFileStore store = new SMOAFileStore(path, staging, connection, this);
-		store.info = info;
-		store.exists = true;
-		return store;
-	}
-
-	/**
-	 * Returns a file from this directory
-	 * 
-	 * @param name
-	 *            - name, relative to this directory
-	 */
-	@Override
-	public SMOAFileStore getChild(String name) {
-
-		if (name == null || name.isEmpty()) {
-			return null;
-		}
-
-		if (name.equals(".")) { //$NON-NLS-1$
-			return this;
-		}
-
-		if (name.startsWith("/")) { //$NON-NLS-1$
-			if (name.startsWith(path) && !name.equals(path)) {
-				return new SMOAFileStore(name, staging, getConnection(), this);
-			}
-
-			return new SMOAFileStore(name, staging, getConnection(), null);
-		}
-
-		if (name.equals("..") || name.contains("/")) { //$NON-NLS-1$ //$NON-NLS-2$
-			return new SMOAFileStore(path + "/" + name, staging, //$NON-NLS-1$
-					getConnection(), null);
-		}
-
-		return new SMOAFileStore(path + "/" + name, staging, //$NON-NLS-1$
-				getConnection(), this);
-	}
-
-	public SMOAConnection getConnection() {
-		return connection;
-	}
-
-	/**
-	 * Returns file name
-	 */
-	@Override
-	public String getName() {
-		if (path.endsWith("/") && path.length() > 1) { //$NON-NLS-1$
-			final String p = path.substring(0, path.length() - 1);
-			return p.substring(p.lastIndexOf('/') + 1);
-		}
-		return path.substring(path.lastIndexOf('/') + 1);
-	}
-
-	/**
-	 * Returns (creating if needed) parent store
-	 */
-	@Override
-	public SMOAFileStore getParent() {
-		if (parent != null) {
-			return parent;
-		}
-
-		if (path.indexOf('/') == -1) {
-			return null;
-		}
-
-		if (path.equals("/")) { //$NON-NLS-1$
-			return null;
-		}
-
-		final String parentPath = path.substring(0, path.lastIndexOf('/'));
-		return new SMOAFileStore(parentPath, staging, getConnection(), null);
-	}
-
-	public String getPath() {
-		return path;
-	}
-
-	@Override
-	public SMOAFileStore mkdir(int options, IProgressMonitor monitor)
-			throws CoreException {
-
-		if (this.fetchInfo().isDirectory()) {
-			return this;
-		}
-
-		if (exists) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					SMOACoreActivator.PLUGIN_ID,
-					Messages.SMOAFileStore_MkdirOverAnExistingFile));
-		}
-
-		final IFileStore par = getParent();
-		if (!par.fetchInfo().isDirectory()) {
-			par.mkdir(options, monitor);
-		}
-
-		try {
-			staging.mkdir(path, null, null);
-		} catch (final FileNotFoundFault e) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					SMOACoreActivator.PLUGIN_ID, e.getLocalizedMessage(), e));
-		} catch (final NotAuthorizedFault e) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					SMOACoreActivator.PLUGIN_ID, e.getLocalizedMessage(), e));
-		} catch (final StagingFault e) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					SMOACoreActivator.PLUGIN_ID, e.getLocalizedMessage(), e));
-		}
-
-		fetchInfo();
-		return this;
-	}
-
-	/**
-	 * Co-working with {@link SMOAStagingHandler} gets the {@link InputStream}
-	 * from the file
-	 */
-	@Override
-	public InputStream openInputStream(int arg0, IProgressMonitor arg1)
-			throws CoreException {
-		return openInputStream(arg0, arg1, 0);
-	}
-
-	/**
-	 * Co-working with {@link SMOAStagingHandler} gets the {@link InputStream}
-	 * from the file, from specified offset (in bytes) on
-	 */
-	public InputStream openInputStream(int arg0, IProgressMonitor arg1,
-			Integer offset) throws CoreException {
-
-		int lcounter;
-		synchronized (ctr_lock) {
-			lcounter = counter;
-			counter++;
-		}
-
-		final JSDL jsdl = new JSDL("openInputStream_" + path); //$NON-NLS-1$
-		final JSDLDataStaging dataStaging = new JSDLDataStaging(path, null, path
-				+ " " + lcounter); //$NON-NLS-1$
-
-		dataStaging.setOffset(offset);
-
-		jsdl.getDataStaging().add(dataStaging);
-		Throwable t;
-
-		try {
-			staging.stageOutFiles(jsdl);
-
-			final InputStream is = fileStoresWaitingForInputStream.remove(path
-					+ " " + lcounter); //$NON-NLS-1$
-
-			// FIXME:
-			if (is == null) {
-				throw new CoreException(new Status(IStatus.ERROR,
-						SMOACoreActivator.PLUGIN_ID,
-						Messages.SMOAFileStore_InputStreamForFileNotReceived));
-			}
-
-			return is;
-
-		} catch (final DeleteOnTerminationException e) {
-			t = e;
-		} catch (final FileNotFoundException e) {
-			t = e;
-		} catch (final NotAuthorizedException e) {
-			t = e;
-		} catch (final StagingException e) {
-			t = e;
-		} catch (final IOException e) {
-			t = e;
-		}
-		throw new CoreException(new Status(IStatus.ERROR,
-				SMOACoreActivator.PLUGIN_ID, t.getLocalizedMessage(), t));
-	}
-
-	/**
-	 * Opens {@link OutputStream} for the file. Overwrites if file exists.
-	 * 
-	 * If the file doesn't exist, the file is created.
-	 * 
-	 * If the parent directory doesn't exist, it's also created.
-	 */
-	@Override
-	public OutputStream openOutputStream(int options, IProgressMonitor monitor)
-			throws CoreException {
-
-		// Ensure that the parent dir exists
-		getParent().mkdir(options, monitor);
-
-		int lcounter;
-		synchronized (ctr_lock) {
-			lcounter = counter;
-			counter++;
-		}
-
-		final JSDL jsdl = new JSDL("openOutputStream_" + path); //$NON-NLS-1$
-		jsdl.getDataStaging().add(
-				new JSDLDataStaging(path, path + " " + lcounter, //$NON-NLS-1$
-						null));
-		final Throwable[] t = new Throwable[1];
-		t[0] = null;
-
-		fileStoresWaitingForStaging.put(path + " " + lcounter, this); //$NON-NLS-1$
-
-		synchronized (this) {
-			new Thread() {
-				@Override
-				public void run() {
-					setName("stageIn_" + path); //$NON-NLS-1$
-					try {
-						staging.stageInFiles(jsdl);
-					} catch (final FileNotFoundException e) {
-						t[0] = e;
-					} catch (final NotAuthorizedException e) {
-						t[0] = e;
-					} catch (final StagingException e) {
-						t[0] = e;
-					} catch (final IOException e) {
-						t[0] = e;
-					}
-				}
-			}.start();
-
-			try {
-				this.wait();
-			} catch (final InterruptedException e) {
-			}
-		}
-
-		fileStoresWaitingForStaging.remove(path + " " + lcounter); //$NON-NLS-1$
-
-		final OutputStream os = fileStoresWaitingForOutputStream.remove(path
-				+ " " + lcounter); //$NON-NLS-1$
-
-		if (t[0] == null) {
-			return os;
-		}
-
-		throw new CoreException(new Status(IStatus.ERROR,
-				SMOACoreActivator.PLUGIN_ID, t[0].getLocalizedMessage(), t[0]));
-	}
-
-	/**
-	 * Changes file properties - in SMOA case, only chmod is supported
-	 */
-	@Override
-	public void putInfo(IFileInfo arg0, int arg1, IProgressMonitor arg2)
-			throws CoreException {
-		try {
-			staging.chmod(path, chmodAttributesFromFileInfo(arg0), null);
-		} catch (final FileNotFoundFault e) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					SMOACoreActivator.PLUGIN_ID,
-					Messages.SMOAFileStore_ChmodFailed
-							+ e.getLocalizedMessage(), e));
-		} catch (final NotAuthorizedFault e) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					SMOACoreActivator.PLUGIN_ID,
-					Messages.SMOAFileStore_ChmodFailed
-							+ e.getLocalizedMessage(), e));
-		} catch (final StagingFault e) {
-			throw new CoreException(new Status(IStatus.ERROR,
-					SMOACoreActivator.PLUGIN_ID,
-					Messages.SMOAFileStore_ChmodFailed
-							+ e.getLocalizedMessage(), e));
-		}
-	}
-
-	@Override
-	public URI toURI() {
-		try {
-			return new URI(path);
-		} catch (final URISyntaxException e) {
-			throw new RuntimeException(e);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOARemoteServices.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOARemoteServices.java
deleted file mode 100644
index 232971f..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/SMOARemoteServices.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rservices;
-
-import java.util.List;
-
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.IRemoteFileManager;
-import org.eclipse.ptp.remote.core.IRemoteProcessBuilder;
-import org.eclipse.ptp.remote.core.IRemoteServices;
-
-/**
- * SMOARemoteServices provide services for managing connection and files, as
- * well as hold SMOA objects need for task submission.
- * 
- * But for file managing and creating remote processes one may supply any other
- * services, in this case SMOARemoteService will just serve as proxy.
- */
-public class SMOARemoteServices implements IRemoteServices {
-
-	private final String remoteServices_ID;
-	private final String remoteServices_NAME;
-	private final String remoteServices_SCHEME;
-
-	private SMOAConnectionManager connectionManager = null;
-
-	public SMOARemoteServices(String id, String name) {
-		remoteServices_ID = id;
-		remoteServices_NAME = name;
-		remoteServices_SCHEME = "scheme"; //$NON-NLS-1$
-	}
-
-	public SMOAConnectionManager getConnectionManager() {
-		if (connectionManager == null) {
-			connectionManager = new SMOAConnectionManager(this);
-		}
-		return connectionManager;
-	}
-
-	public IRemoteFileManager getFileManager(IRemoteConnection conn) {
-		if (!(conn instanceof SMOAConnection)) {
-			throw new IllegalArgumentException("SMOA got a " //$NON-NLS-1$
-					+ conn.getClass().getCanonicalName() + " connection"); //$NON-NLS-1$
-		}
-		final SMOAConnection c = (SMOAConnection) conn;
-
-		if (!c.isOpen()) {
-			return null;
-		}
-
-		final IRemoteConnection fileServices = c.getFileConnection();
-		if (fileServices != null) {
-			return fileServices.getRemoteServices()
-					.getFileManager(fileServices);
-		}
-
-		IRemoteFileManager fileManager = c.getFileManager();
-
-		if (fileManager == null) {
-			fileManager = new SMOAFileManager(c);
-			c.setFileManager(fileManager);
-		}
-
-		return fileManager;
-	}
-
-	public String getId() {
-		return remoteServices_ID;
-	}
-
-	public String getName() {
-		return remoteServices_NAME;
-	}
-
-	public IRemoteProcessBuilder getProcessBuilder(IRemoteConnection conn,
-			List<String> command) {
-
-		if (!(conn instanceof SMOAConnection)) {
-			throw new IllegalArgumentException("SMOA got a " //$NON-NLS-1$
-					+ conn.getClass().getCanonicalName() + " connection"); //$NON-NLS-1$
-		}
-		final SMOAConnection c = (SMOAConnection) conn;
-		final IRemoteConnection fileServices = c.getFileConnection();
-		if (fileServices != null) {
-			return fileServices.getRemoteServices().getProcessBuilder(
-					fileServices, command);
-		}
-
-		return null;
-	}
-
-	public IRemoteProcessBuilder getProcessBuilder(IRemoteConnection conn,
-			String... command) {
-
-		if (!(conn instanceof SMOAConnection)) {
-			throw new IllegalArgumentException("SMOA got a " //$NON-NLS-1$
-					+ conn.getClass().getCanonicalName() + " connection"); //$NON-NLS-1$
-		}
-		final SMOAConnection c = (SMOAConnection) conn;
-		final IRemoteConnection fileServices = c.getFileConnection();
-		if (fileServices != null) {
-			return fileServices.getRemoteServices().getProcessBuilder(
-					fileServices, command);
-		}
-
-		return null;
-	}
-
-	public String getScheme() {
-		return remoteServices_SCHEME;
-	}
-
-	public void initialize() {
-	}
-
-	public boolean isInitialized() {
-		return true;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/messages.properties b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/messages.properties
deleted file mode 100644
index bbe4cf9..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rservices/messages.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-SMOAConnection_CannotModifyOpenConnection=Cannot change an already opened connection
-SMOAConnection_UnsupportedAuthType=Unsupported authentication type forced\!\!\!
-SMOAConnectionManager_DuplicatedConnection=Trying to add an already existing connection
-SMOAFileStore_ChmodFailed=Chmod failed: 
-SMOAFileStore_InputStreamForFileNotReceived=Receiving InputStream for a file failed
-SMOAFileStore_MkdirOverAnExistingFile=Cannot create dir, because the path describes a file
-SMOAFileStore_RequestedListingUnexistingDirOrFile=Store does no exist
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rtsystem/SMOARuntimeSystem.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rtsystem/SMOARuntimeSystem.java
deleted file mode 100644
index bcb9923..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rtsystem/SMOARuntimeSystem.java
+++ /dev/null
@@ -1,457 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.rtsystem;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.ptp.core.IPTPLaunchConfigurationConstants;
-import org.eclipse.ptp.core.attributes.AttributeDefinitionManager;
-import org.eclipse.ptp.core.attributes.AttributeManager;
-import org.eclipse.ptp.core.attributes.IAttribute;
-import org.eclipse.ptp.core.attributes.IllegalValueException;
-import org.eclipse.ptp.core.elements.IPElement;
-import org.eclipse.ptp.core.elements.IPMachine;
-import org.eclipse.ptp.core.elements.attributes.ElementAttributeManager;
-import org.eclipse.ptp.core.elements.attributes.ElementAttributes;
-import org.eclipse.ptp.core.elements.attributes.ErrorAttributes;
-import org.eclipse.ptp.core.elements.attributes.FilterAttributes;
-import org.eclipse.ptp.core.elements.attributes.JobAttributes;
-import org.eclipse.ptp.core.elements.attributes.MachineAttributes;
-import org.eclipse.ptp.core.elements.attributes.MessageAttributes;
-import org.eclipse.ptp.core.elements.attributes.NodeAttributes;
-import org.eclipse.ptp.core.elements.attributes.ProcessAttributes;
-import org.eclipse.ptp.core.elements.attributes.QueueAttributes;
-import org.eclipse.ptp.core.elements.attributes.ResourceManagerAttributes;
-import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
-import org.eclipse.ptp.remote.core.exception.RemoteConnectionException;
-import org.eclipse.ptp.rm.smoa.core.SMOAConfiguration;
-import org.eclipse.ptp.rm.smoa.core.SMOACoreActivator;
-import org.eclipse.ptp.rm.smoa.core.attrib.SMOAMachineAttributes;
-import org.eclipse.ptp.rm.smoa.core.attrib.SMOANodeAttributes;
-import org.eclipse.ptp.rm.smoa.core.attrib.SMOAQueueAttributes;
-import org.eclipse.ptp.rm.smoa.core.attrib.SMOARMAttributes;
-import org.eclipse.ptp.rm.smoa.core.rmsystem.SMOAResourceManager;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOAConnection;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOARemoteServices;
-import org.eclipse.ptp.rtsystem.AbstractRuntimeSystem;
-import org.eclipse.ptp.rtsystem.events.IRuntimeEventFactory;
-import org.eclipse.ptp.rtsystem.events.IRuntimeJobChangeEvent;
-import org.eclipse.ptp.rtsystem.events.IRuntimeNewJobEvent;
-import org.eclipse.ptp.rtsystem.events.IRuntimeNewMachineEvent;
-import org.eclipse.ptp.rtsystem.events.IRuntimeNewNodeEvent;
-import org.eclipse.ptp.rtsystem.events.IRuntimeNewQueueEvent;
-import org.eclipse.ptp.rtsystem.events.IRuntimeRMChangeEvent;
-import org.eclipse.ptp.rtsystem.events.RuntimeEventFactory;
-import org.eclipse.ptp.utils.core.ArgumentParser;
-import org.eclipse.ptp.utils.core.RangeSet;
-
-import com.smoa.comp.sdk.SMOAFactory;
-import com.smoa.comp.stubs.bes.factory.BasicResourceAttributesDocumentType;
-import com.smoa.comp.stubs.bes.factory.FactoryResourceAttributesDocumentType;
-import com.smoa.comp.stubs.factory.ApplicationsType.Application;
-
-/**
- * Co-works with {@link SMOAResourceManager} in order to manage ResourceManager
- * and jobs. Is created by {@link SMOAResourceManager}.
- * 
- * Methods from this class are called by Eclipse in order to start and terminate
- * a job
- */
-public class SMOARuntimeSystem extends AbstractRuntimeSystem {
-
-	private final SMOAConfiguration configuration;
-	private int nextJobNumber = 0;
-
-	/** Creates events for the ResourceManager */
-	private final IRuntimeEventFactory eventFactory = new RuntimeEventFactory();
-
-	/** Caches errors from {@link SMOAResourceManager} by submitting jobs */
-	private final Map<String, Exception> jobSbmissionErrors = new HashMap<String, Exception>();
-
-	/** Resource Manager ID (needed for RM change events) */
-	private final String rmId;
-
-	/** Attribute definitions for the RTS. */
-	protected AttributeDefinitionManager attrMgr = new AttributeDefinitionManager();
-
-	public SMOARuntimeSystem(SMOAConfiguration configuration, String rmId) {
-		super();
-		this.configuration = configuration;
-		this.rmId = rmId;
-	}
-
-	public void addJobSubmissionError(String subId, Exception e) {
-		jobSbmissionErrors.put(subId, e);
-	}
-
-	public void addUnknownNode(IPMachine machine, String name) {
-		final AttributeManager am = new SMOANodeAttributes();
-
-		am.addAttribute(ElementAttributes.getNameAttributeDefinition().create(name));
-		am.addAttribute(ProcessAttributes.getNodeIdAttributeDefinition().create(name));
-
-		final ElementAttributeManager eam = new ElementAttributeManager();
-		eam.setAttributeManager(new RangeSet(machine.getNodes().length), am);
-
-		final IRuntimeNewNodeEvent irnne = eventFactory.newRuntimeNewNodeEvent(machine.getID(), eam);
-
-		fireRuntimeNewNodeEvent(irnne);
-	}
-
-	public void filterEvents(IPElement element, boolean filterChildren, AttributeManager filterAttributes) throws CoreException {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rtsystem.IControlSystem#getAttributeDefinitionManager()
-	 */
-	public AttributeDefinitionManager getAttributeDefinitionManager() {
-		return attrMgr;
-	}
-
-	public void shutdown() throws CoreException {
-
-	}
-
-	public void startEvents() throws CoreException {
-	}
-
-	/**
-	 * Opens the connection and retrieves basic information about RM, machine
-	 * and nodes. Creates the default queue
-	 */
-	public void startup(IProgressMonitor monitor) throws CoreException {
-
-		initialize();
-
-		final SMOARemoteServices remoteServices = (SMOARemoteServices) PTPRemoteCorePlugin.getDefault().getRemoteServices(
-				configuration.getRemoteServicesId());
-
-		final SMOAConnection connection = remoteServices.getConnectionManager().getConnection(configuration.getConnectionName());
-
-		if (!connection.isOpen()) {
-			try {
-				connection.open(monitor);
-			} catch (final RemoteConnectionException e1) {
-				throw new CoreException(new Status(IStatus.ERROR, SMOACoreActivator.PLUGIN_ID, e1.getLocalizedMessage(), e1));
-			}
-		}
-
-		final SMOAFactory besFactory = connection.getFactory();
-
-		FactoryResourceAttributesDocumentType cluster;
-
-		try {
-			cluster = besFactory.getFactoryAttributesDocument();
-		} catch (final Throwable t) {
-			throw new CoreException(new Status(IStatus.ERROR, SMOACoreActivator.PLUGIN_ID, t.getLocalizedMessage(), t));
-		}
-
-		final List<Application> apps = SMOAFactory.getApplications(cluster).getApplication();
-
-		configuration.setAvailableAppList(apps);
-
-		// Machine && nodes information
-		{
-			final ElementAttributeManager machines = new ElementAttributeManager();
-			final AttributeManager machine = new SMOAMachineAttributes();
-
-			machine.addAttribute(ElementAttributes.getNameAttributeDefinition().create(cluster.getCommonName()));
-
-			try {
-				machine.addAttribute(MachineAttributes.getNumNodesAttributeDefinition().create(
-						cluster.getContainedResource().size()));
-			} catch (final IllegalValueException e1) {
-				// One of the "should never happen"
-				throw new CoreException(new Status(IStatus.ERROR, SMOACoreActivator.PLUGIN_ID, e1.getLocalizedMessage(), e1));
-			}
-
-			machines.setAttributeManager(new RangeSet(0), machine);
-
-			final IRuntimeNewMachineEvent irnme = eventFactory.newRuntimeNewMachineEvent(null, machines);
-			fireRuntimeNewMachineEvent(irnme);
-
-			int i = 0;
-
-			for (final Object _ : cluster.getContainedResource()) {
-				final BasicResourceAttributesDocumentType host = (BasicResourceAttributesDocumentType) _;
-
-				try {
-					final AttributeManager am = new SMOANodeAttributes();
-
-					am.addAttribute(ElementAttributes.getNameAttributeDefinition().create(host.getResourceName()));
-					am.addAttribute(ProcessAttributes.getNodeIdAttributeDefinition().create(host.getResourceName()));
-					am.addAttribute(SMOANodeAttributes.getCpuArchDef().create(
-							host.getCPUArchitecture().getCPUArchitectureName().toString()));
-					am.addAttribute(SMOANodeAttributes.getCpuCountDef().create(host.getCPUCount().intValue()));
-					am.addAttribute(SMOANodeAttributes.getMemorySizeDef().create((host.getPhysicalMemory() / (1024 * 1024)) + "MB")); //$NON-NLS-1$
-
-					am.addAttribute(NodeAttributes.getStateAttributeDefinition().create(NodeAttributes.State.UP));
-
-					final ElementAttributeManager eam = new ElementAttributeManager();
-					eam.setAttributeManager(new RangeSet(i++), am);
-
-					final IRuntimeNewNodeEvent irnne = eventFactory.newRuntimeNewNodeEvent("0", eam); //$NON-NLS-1$
-
-					fireRuntimeNewNodeEvent(irnne);
-
-				} catch (final IllegalValueException e) {
-					throw new CoreException(new Status(IStatus.ERROR, SMOACoreActivator.PLUGIN_ID, e.getLocalizedMessage(), e));
-				}
-			}
-
-		}
-
-		// Queue information
-
-		{
-			final RangeSet rs = new RangeSet(0);
-			final AttributeManager am = new SMOAQueueAttributes();
-			try {
-				am.getAttribute("name").setValueAsString("Default queue"); //$NON-NLS-1$ //$NON-NLS-2$
-				am.getAttribute("id").setValueAsString("0"); //$NON-NLS-1$ //$NON-NLS-2$
-			} catch (final IllegalValueException e) {
-				throw new RuntimeException(e);
-			}
-
-			final ElementAttributeManager eam = new ElementAttributeManager();
-			eam.setAttributeManager(rs, am);
-
-			final IRuntimeNewQueueEvent irnqe = eventFactory.newRuntimeNewQueueEvent(null, eam);
-			fireRuntimeNewQueueEvent(irnqe);
-		}
-
-		// RM informations
-
-		{
-
-			final ElementAttributeManager eam = new ElementAttributeManager();
-			final RangeSet rs = new RangeSet(rmId);
-			final AttributeManager am = new SMOARMAttributes();
-
-			am.addAttribute(SMOARMAttributes.getQueuingSystemDef().create(cluster.getLocalResourceManagerType()));
-			am.addAttribute(SMOARMAttributes.getAcceptsActivitiesDef().create(cluster.isIsAcceptingNewActivities()));
-			am.addAttribute(SMOARMAttributes.getCommonNameDef().create(cluster.getCommonName()));
-
-			eam.setAttributeManager(rs, am);
-			final IRuntimeRMChangeEvent irrmce = eventFactory.newRuntimeRMChangeEvent(eam);
-			fireRuntimeRMChangeEvent(irrmce);
-		}
-
-	}
-
-	public void stopEvents() throws CoreException {
-	}
-
-	/**
-	 * Called by Eclipse when the job is to be submitted.
-	 * 
-	 * @param subId
-	 *            - eclipse submission ID. {@link SMOAResourceManager} needs
-	 *            this to inform Eclipse that the job has been submitted.
-	 */
-	public void submitJob(String subId, ILaunchConfiguration configuration, String mode) throws CoreException {
-
-		AttributeManager attrMgr = new AttributeManager(getAttributes(configuration, mode).toArray(new IAttribute<?, ?, ?>[0]));
-
-		attrMgr.addAttribute(JobAttributes.getSubIdAttributeDefinition().create(subId));
-
-		final RangeSet rs = new RangeSet(nextJobNumber);
-		nextJobNumber++;
-		final ElementAttributeManager eam = new ElementAttributeManager();
-		eam.setAttributeManager(rs, attrMgr);
-
-		final IRuntimeNewJobEvent irnje = eventFactory.newRuntimeNewJobEvent("0", eam); //$NON-NLS-1$
-		fireRuntimeNewJobEvent(irnje);
-
-		final Exception e = jobSbmissionErrors.remove(subId);
-		if (e != null) {
-			throw new CoreException(new Status(IStatus.ERROR, SMOACoreActivator.PLUGIN_ID, e.getLocalizedMessage(), e));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rtsystem.IControlSystem#terminateJob(java.lang.String)
-	 */
-	public void terminateJob(String jobId) throws CoreException {
-	}
-
-	/**
-	 * Change attributes of a job
-	 * 
-	 * @param jobID
-	 * @param changedAttrMgr
-	 */
-	public void changeJob(String jobID, AttributeManager changedAttrMgr) {
-		AttributeManager attrMgr = new AttributeManager();
-		attrMgr.addAttributes(changedAttrMgr.getAttributes());
-		ElementAttributeManager elementAttrs = new ElementAttributeManager();
-		elementAttrs.setAttributeManager(new RangeSet(jobID), attrMgr);
-		IRuntimeJobChangeEvent event = eventFactory.newRuntimeJobChangeEvent(elementAttrs);
-		fireRuntimeJobChangeEvent(event);
-	}
-
-	/**
-	 * Convert launch configuration attributes to PTP attributes
-	 */
-	private List<IAttribute<?, ?, ?>> getAttributes(ILaunchConfiguration configuration, String mode) throws CoreException {
-		List<IAttribute<?, ?, ?>> attrs = new ArrayList<IAttribute<?, ?, ?>>();
-
-		/*
-		 * Collect attributes from Application tab
-		 */
-		String exePath = configuration.getAttribute(IPTPLaunchConfigurationConstants.ATTR_EXECUTABLE_PATH, (String) null);
-		if (exePath != null) {
-			IPath programPath = new Path(exePath);
-			attrs.add(JobAttributes.getExecutableNameAttributeDefinition().create(programPath.lastSegment()));
-
-			String path = programPath.removeLastSegments(1).toString();
-			if (path != null) {
-				attrs.add(JobAttributes.getExecutablePathAttributeDefinition().create(path));
-			}
-		}
-
-		/*
-		 * Collect attributes from Arguments tab
-		 */
-		String wd = configuration.getAttribute(IPTPLaunchConfigurationConstants.ATTR_WORKING_DIR, (String) null);
-		if (wd != null) {
-			attrs.add(JobAttributes.getWorkingDirectoryAttributeDefinition().create(wd));
-		}
-
-		String[] args = getProgramArguments(configuration, IPTPLaunchConfigurationConstants.ATTR_ARGUMENTS);
-		if (args != null) {
-			attrs.add(JobAttributes.getProgramArgumentsAttributeDefinition().create(args));
-		}
-
-		/*
-		 * Collect attributes from Environment tab
-		 */
-		String[] envArr = getEnvironment(configuration);
-		if (envArr != null) {
-			attrs.add(JobAttributes.getEnvironmentAttributeDefinition().create(envArr));
-		}
-
-		/*
-		 * Collect attributes from Debugger tab if this is a debug launch
-		 */
-		if (mode.equals(ILaunchManager.DEBUG_MODE)) {
-			boolean stopInMainFlag = configuration.getAttribute(IPTPLaunchConfigurationConstants.ATTR_STOP_IN_MAIN, false);
-			attrs.add(JobAttributes.getDebuggerStopInMainFlagAttributeDefinition().create(Boolean.valueOf(stopInMainFlag)));
-
-			attrs.add(JobAttributes.getDebugFlagAttributeDefinition().create(Boolean.TRUE));
-
-			args = getProgramArguments(configuration, IPTPLaunchConfigurationConstants.ATTR_DEBUGGER_ARGS);
-			if (args != null) {
-				attrs.add(JobAttributes.getDebuggerArgumentsAttributeDefinition().create(args));
-			}
-
-			String dbgExePath = configuration.getAttribute(IPTPLaunchConfigurationConstants.ATTR_DEBUGGER_EXECUTABLE_PATH,
-					(String) null);
-			if (dbgExePath != null) {
-				IPath path = new Path(dbgExePath);
-				attrs.add(JobAttributes.getDebuggerExecutableNameAttributeDefinition().create(path.lastSegment()));
-				attrs.add(JobAttributes.getDebuggerExecutablePathAttributeDefinition()
-						.create(path.removeLastSegments(1).toString()));
-			}
-		}
-
-		/*
-		 * PTP launched this job
-		 */
-		attrs.add(JobAttributes.getLaunchedByPTPFlagAttributeDefinition().create(Boolean.valueOf(true)));
-
-		return attrs;
-	}
-
-	/**
-	 * Get environment to append
-	 * 
-	 * @param configuration
-	 * @return
-	 * @throws CoreException
-	 */
-	private String[] getEnvironment(ILaunchConfiguration configuration) throws CoreException {
-		Map<?, ?> defaultEnv = null;
-		Map<?, ?> configEnv = configuration.getAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, defaultEnv);
-		if (configEnv == null) {
-			return null;
-		}
-
-		List<String> strings = new ArrayList<String>(configEnv.size());
-		Iterator<?> iter = configEnv.entrySet().iterator();
-		while (iter.hasNext()) {
-			Entry<?, ?> entry = (Entry<?, ?>) iter.next();
-			String key = (String) entry.getKey();
-			String value = (String) entry.getValue();
-			strings.add(key + "=" + value); //$NON-NLS-1$
-
-		}
-		return strings.toArray(new String[strings.size()]);
-	}
-
-	/**
-	 * Convert application arguments to an array of strings.
-	 * 
-	 * @param configuration
-	 *            launch configuration
-	 * @return array of strings containing the program arguments
-	 * @throws CoreException
-	 */
-	private String[] getProgramArguments(ILaunchConfiguration configuration, String attrName) throws CoreException {
-		String temp = configuration.getAttribute(attrName, (String) null);
-		if (temp != null && temp.length() > 0) {
-			ArgumentParser ap = new ArgumentParser(temp);
-			List<String> args = ap.getTokenList();
-			if (args != null) {
-				return args.toArray(new String[args.size()]);
-			}
-		}
-		return new String[0];
-	}
-
-	/**
-	 * Initialize the attribute manager. This is called each time the runtime is
-	 * started.
-	 */
-	private void initialize() {
-		attrMgr.clear();
-		attrMgr.setAttributeDefinitions(ElementAttributes.getDefaultAttributeDefinitions());
-		attrMgr.setAttributeDefinitions(ErrorAttributes.getDefaultAttributeDefinitions());
-		attrMgr.setAttributeDefinitions(FilterAttributes.getDefaultAttributeDefinitions());
-		attrMgr.setAttributeDefinitions(JobAttributes.getDefaultAttributeDefinitions());
-		attrMgr.setAttributeDefinitions(MachineAttributes.getDefaultAttributeDefinitions());
-		attrMgr.setAttributeDefinitions(MessageAttributes.getDefaultAttributeDefinitions());
-		attrMgr.setAttributeDefinitions(NodeAttributes.getDefaultAttributeDefinitions());
-		attrMgr.setAttributeDefinitions(ProcessAttributes.getDefaultAttributeDefinitions());
-		attrMgr.setAttributeDefinitions(QueueAttributes.getDefaultAttributeDefinitions());
-		attrMgr.setAttributeDefinitions(ResourceManagerAttributes.getDefaultAttributeDefinitions());
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rtsystem/SMOARuntimeSystemFactory.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rtsystem/SMOARuntimeSystemFactory.java
deleted file mode 100644
index 7f1b23d..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/rtsystem/SMOARuntimeSystemFactory.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 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.rm.smoa.core.rtsystem;
-
-import org.eclipse.ptp.core.elements.IPResourceManager;
-import org.eclipse.ptp.rm.smoa.core.SMOAConfiguration;
-import org.eclipse.ptp.rmsystem.IResourceManager;
-import org.eclipse.ptp.rtsystem.IRuntimeSystem;
-import org.eclipse.ptp.rtsystem.IRuntimeSystemFactory;
-
-public class SMOARuntimeSystemFactory implements IRuntimeSystemFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rtsystem.IRuntimeSystemFactory#create(org.eclipse.ptp
-	 * .rmsystem.IResourceManager)
-	 */
-	public IRuntimeSystem create(IResourceManager rm) {
-		SMOAConfiguration config = (SMOAConfiguration) rm.getConfiguration();
-		IPResourceManager prm = (IPResourceManager) rm.getAdapter(IPResourceManager.class);
-		return new SMOARuntimeSystem(config, prm.getID());
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/util/NotifyShell.java b/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/util/NotifyShell.java
deleted file mode 100644
index 5afc352..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.core/src/org/eclipse/ptp/rm/smoa/core/util/NotifyShell.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.core.util;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Class implementing a dialog independent to GUI actions, and not modal one.
- * (Java's MessageBox has no ability to be non-modal)
- */
-
-public class NotifyShell {
-
-	/**
-	 * Open a non-modal hint-like dialog
-	 */
-	public static void open(final String title, final String message) {
-
-		assert (title != null || message != null);
-
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-
-				final Shell s = new Shell(SWT.SHELL_TRIM | SWT.ON_TOP);
-				final GridLayout layout = new GridLayout();
-				s.setLayout(layout);
-				s.setLocation(10, 10);
-
-				// Title
-				if (title != null) {
-					final Label t = new Label(s, SWT.WRAP);
-					t.setText(title);
-					final FontData fd = t.getFont().getFontData()[0];
-					fd.setStyle(fd.getStyle() | SWT.BOLD);
-					t.setFont(new Font(t.getDisplay(), fd));
-					t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-				}
-
-				// Message
-				if (message != null) {
-					final Label msg = new Label(s, SWT.WRAP);
-					msg.setLayoutData(new GridData(GridData.FILL_BOTH));
-					msg.setText(message);
-				}
-
-				// add button for closing
-				final Button ok = new Button(s, SWT.PUSH);
-				ok.setText("Ok"); //$NON-NLS-1$
-				ok.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
-				ok.addSelectionListener(new SelectionListener() {
-
-					public void widgetDefaultSelected(SelectionEvent e) {
-					}
-
-					public void widgetSelected(SelectionEvent e) {
-						s.close();
-					}
-				});
-
-				// layout properly
-				s.pack();
-
-				// correct if too wide
-				final int newX = Math.min(s.getSize().x, s.getDisplay()
-						.getClientArea().width - 20);
-				if (newX != s.getSize().x) {
-					s.setSize(newX, s.computeSize(newX, SWT.DEFAULT).y);
-				}
-
-				// show
-				s.setVisible(true);
-			}
-		});
-	}
-
-	private NotifyShell() {
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/.classpath b/rms/org.eclipse.ptp.rm.smoa.ui/.classpath
deleted file mode 100644
index 79a74b2..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/.classpath
+++ /dev/null
@@ -1,13 +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">
-		<accessrules>
-			<accessrule kind="accessible" pattern="org/eclipse/ptp/rm/remote/core/*"/>
-			<accessrule kind="accessible" pattern="org/eclipse/rm/remote/ui/*"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="lib" path="/org.eclipse.ptp.rm.smoa.core/lib/com.smoa.comp_2.2.0.201101101421.jar"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/.project b/rms/org.eclipse.ptp.rm.smoa.ui/.project
deleted file mode 100644
index 72100c8..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rm.smoa.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<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/rms/org.eclipse.ptp.rm.smoa.ui/META-INF/MANIFEST.MF b/rms/org.eclipse.ptp.rm.smoa.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index eff0881..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,31 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.rm.smoa.ui;singleton:=true
-Bundle-Version: 4.0.0.qualifier
-Bundle-Activator: org.eclipse.ptp.rm.smoa.ui.SMOAUIPlugin
-Bundle-Vendor: %Bundle-Vendor
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.debug.core,
- org.eclipse.ptp.services.core,
- org.eclipse.ptp.services.ui,
- org.eclipse.ptp.core,
- org.eclipse.ptp.remote.core,
- org.eclipse.ptp.remote.ui,
- org.eclipse.ptp.utils.ui,
- org.eclipse.ptp.rm.smoa.core,
- org.eclipse.ptp.ui,
- org.eclipse.ptp.launch,
- org.eclipse.ptp.rm.ui,
- org.eclipse.ptp.rm.core,
- com.smoa.comp
-Export-Package: org.eclipse.ptp.rm.smoa.ui,
- org.eclipse.ptp.rm.smoa.ui.preferences
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Import-Package: org.eclipse.core.expressions,
- org.eclipse.core.filesystem,
- org.eclipse.debug.ui,
- org.eclipse.equinox.security.storage
-Bundle-ActivationPolicy: lazy
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/NOTICE.txt b/rms/org.eclipse.ptp.rm.smoa.ui/NOTICE.txt
deleted file mode 100644
index d4e7c4b..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/NOTICE.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Apache Geronimo JAX-WS 2.1 API
-Copyright 2003-2008 The Apache Software Foundation
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/about.html b/rms/org.eclipse.ptp.rm.smoa.ui/about.html
deleted file mode 100644
index 061df82..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/about.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!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=UTF-8"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 5, 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</a>.</p>
-
-<h3>Acknowledgements</h3>
-
-<p>This work is sponsored by the UCOMS project (System rozproszonego
-przetwarzania i montorowania komputerowego stosowany w odkrywaniu nowych źródeł
-energii oraz zarządzania surowcami energetycznymi) under award number MNiSW Nr
-469/1/N - USA/2009 (z dnia 24 listopada 2009r.) in close collaboration with U.S.
-research institutions involved in the U.S. Department of Energy (DOE) funded
-grant under award number DE-FG02-04ER46136 and the Board of Regents, State of
-Louisiana, under contact no. DOE/LEQSF(2004-07).</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/build.properties b/rms/org.eclipse.ptp.rm.smoa.ui/build.properties
deleted file mode 100644
index a8d3b23..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               bin/,\
-               plugin.properties
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/plugin.properties b/rms/org.eclipse.ptp.rm.smoa.ui/plugin.properties
deleted file mode 100644
index 303bd23..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-pluginName=PTP SMOA Computing UI
-pluginProvider=Poznan Supercomputing and Networking Center
-Bundle-Vendor = Poznan Supercomputing and Networking Center
-remoteUIServices.name = SMOA Computing
-menu.label = Synchronise (SMOA PTP)
-command.name = Custom synchronisation...
-command.label = Custom synchronisation...
-command.name.0 = Copy from remote to local
-command.label.0 = Copy from remote to local
-command.name.1 = Copy from local to remote
-command.label.1 = Copy from local to remote
-page.name = SMOA Computing
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/plugin.xml b/rms/org.eclipse.ptp.rm.smoa.ui/plugin.xml
deleted file mode 100644
index 892fb28..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/plugin.xml
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-
-  <!-- Registering the Launch dialog -->
-  <extension
-    point="org.eclipse.ptp.launch.rmLaunchConfigurations"
-  >
-    <launchConfiguration
-      class="org.eclipse.ptp.rm.smoa.ui.launch.SMOARMLaunchConfigurationFactory"
-      id="org.eclipse.ptp.smoa.ui.launchConfiguration"
-    />
-  </extension>
-
-   <extension
-         point="org.eclipse.ptp.ui.rmConfigurationWizards">
-      <configurationWizard
-            class="org.eclipse.ptp.rm.smoa.ui.wizards.SMOARMConfigurationWizardPageFactory"
-            id="org.eclipse.ptp.rm.smoa.SMOAServiceProvider">
-      </configurationWizard>
-   </extension>
-   
-  <!-- Registering SMOA services -->
-  <extension
-    point="org.eclipse.ptp.remote.ui.remoteUIServices"
-  >
-    <remoteUIServices
-      class="org.eclipse.ptp.rm.smoa.ui.rservices.SMOAUIServicesFactory"
-      id="org.eclipse.ptp.rm.smoa.core.rservices.SMOARemoteServices"
-      name="%remoteUIServices.name"
-    />
-  </extension>
-   
-  <!-- Adding a command -->
-  <extension
-    point="org.eclipse.ui.commands"
-  >
-    <command
-      defaultHandler="org.eclipse.ptp.rm.smoa.ui.actions.SMOACustomSyncAction"
-      id="org.eclipse.ptp.rm.smoa.ui.actions.SMOACustomSyncAction.id"
-      name="%command.name"
-    />
-     <command
-      defaultHandler="org.eclipse.ptp.rm.smoa.ui.actions.SMOAToLocalSyncAction"
-      id="org.eclipse.ptp.rm.smoa.ui.actions.SMOAToLocalSyncAction.id"
-      name="%command.name.0"
-    />
-     <command
-      defaultHandler="org.eclipse.ptp.rm.smoa.ui.actions.SMOAToRemoteSyncAction"
-      id="org.eclipse.ptp.rm.smoa.ui.actions.SMOAToRemoteSyncAction.id"
-      name="%command.name.1"
-    />
-  </extension>
-
-  <!-- Placing the commands in project menu -->
-  <extension
-    point="org.eclipse.ui.menus"
-  >
-    <menuContribution
-      locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=additions"
-    >
-      <menu id="org.eclipse.ui.views.problems.groupBy.menu"
-                label="%menu.label"
-      >
-        <command
-          commandId="org.eclipse.ptp.rm.smoa.ui.actions.SMOACustomSyncAction.id"
-          label="%command.label"
-          style="push"
-        />
-        <command
-          commandId="org.eclipse.ptp.rm.smoa.ui.actions.SMOAToLocalSyncAction.id"
-          label="%command.label.0"
-          style="push"
-        />
-        <command
-          commandId="org.eclipse.ptp.rm.smoa.ui.actions.SMOAToRemoteSyncAction.id"
-          label="%command.label.1"
-          style="push"
-        />
-        <visibleWhen checkEnabled="false">
-          <with variable="selection">
-            <count value="1"/>
-            <iterate ifEmpty="false">
-              <instanceof value="org.eclipse.core.resources.IProject"/>
-            </iterate>
-          </with>
-        </visibleWhen>
-      </menu>
-    </menuContribution>
-  </extension>
- 
-  <!-- Preferences page -->
-  <extension
-    point="org.eclipse.ui.preferencePages"
-  >
-    <page
-      category="org.eclipse.ptp.ui.preferences.rmPreferencesPage"
-      class="org.eclipse.ptp.rm.smoa.ui.preferences.SMOAPreferencePage"
-      id="org.eclipse.ptp.smoa.ui.preferences.SMOAPreferencePage"
-      name="%page.name"
-    />
-  </extension>
- 
-</plugin>
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/SMOAUIPlugin.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/SMOAUIPlugin.java
deleted file mode 100644
index f708849..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/SMOAUIPlugin.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui;
-
-import org.eclipse.ptp.rm.smoa.core.rmsystem.PoolingIntervalsAndStatic;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * the plug-in
- */
-public class SMOAUIPlugin extends AbstractUIPlugin {
-
-	/** plug-in ID */
-	public static final String PLUGIN_ID = "org.eclipse.ptp.rm.smoa.ui"; //$NON-NLS-1$
-
-	/** shared instance */
-	private static SMOAUIPlugin plugin;
-
-	public static final String KEY_INTERVAL_TASK = "pooling_interval_task"; //$NON-NLS-1$
-	public static final String KEY_INTERVAL_OUT = "pooling_interval_out"; //$NON-NLS-1$
-
-	/** Returns the shared instance */
-	public static SMOAUIPlugin getDefault() {
-		return plugin;
-	}
-
-	public SMOAUIPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * Starts the plug-in and applies user preferences
-	 */
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-
-		PoolingIntervalsAndStatic.setPoolingIntervalTask(getPreferenceStore().getInt(
-				KEY_INTERVAL_TASK));
-		PoolingIntervalsAndStatic.setPoolingIntervalOut(getPreferenceStore().getInt(
-				KEY_INTERVAL_OUT));
-	}
-
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/Messages.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/Messages.java
deleted file mode 100644
index 204472b..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/Messages.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.actions;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rm.smoa.ui.actions.messages"; //$NON-NLS-1$
-	public static String SelectConnetionAndDestDir_Browse;
-	public static String SelectConnetionAndDestDir_Cancel;
-	public static String SelectConnetionAndDestDir_CreateIfNotExists;
-	public static String SelectConnetionAndDestDir_DefaultRules;
-	public static String SelectConnetionAndDestDir_DefaultWindowTitle;
-	public static String SelectConnetionAndDestDir_DirBrowserTitle;
-	public static String SelectConnetionAndDestDir_ErrorByFetchInfoTitle;
-	public static String SelectConnetionAndDestDir_ErrorNoActiveConnection;
-	public static String SelectConnetionAndDestDir_ErrorNoActiveConnectionTitle;
-	public static String SelectConnetionAndDestDir_ExcludeRules;
-	public static String SelectConnetionAndDestDir_Ok;
-	public static String SelectConnetionAndDestDir_RemoteRootPath;
-	public static String SelectConnetionAndDestDir_ResourceManager;
-	public static String SMOACustomSyncAction_CurrentFile;
-	public static String SMOACustomSyncAction_ErrorAccessingRemoteFS;
-	public static String SMOACustomSyncAction_ErrorDialogTitle;
-	public static String SMOACustomSyncAction_ErrorOverwritePolicyTitle;
-	public static String SMOACustomSyncAction_ExceptionByReadingSettings;
-	public static String SMOACustomSyncAction_ExceptionBySynchro;
-	public static String SMOACustomSyncAction_ExceptionByWritingSettings;
-	public static String SMOACustomSyncAction_FileOverwritePolicy;
-	public static String SMOACustomSyncAction_FilesCopied;
-	public static String SMOACustomSyncAction_FilesTotal;
-	public static String SMOACustomSyncAction_FromLocal;
-	public static String SMOACustomSyncAction_FromRemote;
-	public static String SMOACustomSyncAction_IncorretOverwritePolicy;
-	public static String SMOACustomSyncAction_Local;
-	public static String SMOACustomSyncAction_PleaswWait;
-	public static String SMOACustomSyncAction_ProgressWindowTitle;
-	public static String SMOACustomSyncAction_RegeneratingTree;
-	public static String SMOACustomSyncAction_RegeneratingTree_FoundFiles;
-	public static String SMOACustomSyncAction_Remote;
-	public static String SMOACustomSyncAction_WindowTitle;
-	public static String SMOAToLocalSyncAction_WindowTitle;
-	public static String SMOAToRemoteSyncAction_WindowTitle;
-	public static String SMOASyncAction_ExceptionBySynchro;
-	public static String SMOASyncAction_ErrorByRsync_desc;
-	public static String SMOASyncAction_ErrorByRsync_title;
-	public static String SMOASyncAction_RsyncInProgress;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/SMOACustomSyncAction.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/SMOACustomSyncAction.java
deleted file mode 100644
index dd60611..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/SMOACustomSyncAction.java
+++ /dev/null
@@ -1,658 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.actions;
-
-import java.io.BufferedReader;
-import java.io.DataOutputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.Vector;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOAFileStore;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOARemoteServices;
-import org.eclipse.ptp.rm.smoa.core.util.NotifyShell;
-import org.eclipse.ptp.rm.smoa.ui.SMOAUIPlugin;
-import org.eclipse.ptp.ui.PTPUIPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-public class SMOACustomSyncAction extends AbstractHandler {
-
-	private class FileFormatException extends IOException {
-		private static final long serialVersionUID = -1360379446136195743L;
-
-		public FileFormatException(String s) {
-			super(s);
-		}
-	}
-
-	/** Policy if and when the files should be overwritten */
-	enum OverwritePolicy {
-		Always, IfNewer, Never
-	}
-
-	private static final QualifiedName SMOA_SYNC_OVERWRITE = new QualifiedName(
-			SMOAUIPlugin.PLUGIN_ID, "smoa.sync.rm.files.overwrite"); //$NON-NLS-1$
-
-	private static final String SMOA_SYNC_FILELIST_NAME = ".smoa_sync_file_list"; //$NON-NLS-1$
-
-	SMOARemoteServices rservices = (SMOARemoteServices) PTPRemoteCorePlugin
-			.getDefault().getRemoteServices("org.eclipse.ptp.remote.SMOARemoteServices"); //$NON-NLS-1$
-	// GUI components
-	private Tree remoteTree;
-	private Tree localTree;
-
-	private Combo policy;
-	// Data
-	/** Remote file store (rendered in remoteTree) */
-	private IFileStore sfs;
-	/** Local file store (rendered in localTree) */
-	private IFileStore lfs;
-
-	private OverwritePolicy overwrite;
-
-	private IProject project;
-
-	int counter;
-
-	private TreeItem addToTree(Tree toRegenerate, TreeItem treeItem,
-			IFileStore newStore) {
-		TreeItem parent = null;
-		if (treeItem.getParentItem() != null) {
-			parent = addToTree(toRegenerate, treeItem.getParentItem(), null);
-		}
-
-		TreeItem newItem;
-		if (parent == null) {
-			newItem = findChild(toRegenerate, treeItem.getText());
-			if (newItem == null) {
-				newItem = new TreeItem(toRegenerate, SWT.NONE);
-				newItem.setText(treeItem.getText());
-			}
-		} else {
-			newItem = findChild(parent, treeItem.getText());
-			if (newItem == null) {
-				newItem = new TreeItem(parent, SWT.NONE);
-				newItem.setText(treeItem.getText());
-			}
-		}
-
-		if (newStore != null) {
-			newItem.setData(newStore);
-		}
-
-		return newItem;
-	}
-
-	/**
-	 * Copies a single tree item to store, and updates toRegenerate tree
-	 */
-	private void copyTreeItem(TreeItem treeItem, IFileStore store,
-			Tree toRegenerate) throws CoreException {
-		final IFileStore newStore = store
-				.getFileStore(new Path(getRelPath(treeItem)));
-		final IFileInfo info = ((IFileStore) treeItem.getData()).fetchInfo();
-		if (info.isDirectory()) {
-			newStore.mkdir(0, null);
-			newStore.putInfo(info, 0, null);
-		} else {
-			switch (overwrite) {
-			case Always:
-				break;
-			case Never:
-				if (newStore.fetchInfo().exists()) {
-					return;
-				}
-				break;
-			case IfNewer:
-				final IFileInfo newInfo = newStore.fetchInfo();
-				if (newInfo.exists()
-						&& newInfo.getLastModified() > info.getLastModified()) {
-					return;
-				}
-				break;
-			default:
-				throw new CoreException(new Status(IStatus.ERROR,
-						PTPUIPlugin.PLUGIN_ID, Messages.SMOACustomSyncAction_IncorretOverwritePolicy));
-			}
-			((IFileStore) treeItem.getData()).copy(newStore, EFS.OVERWRITE,
-					null);
-		}
-
-		addToTree(toRegenerate, treeItem, newStore);
-	}
-
-	@Override
-	public void dispose() {
-		// saveTrees(project);
-		super.dispose();
-	}
-
-	/**
-	 * Called when user triggers this action from a menu (Described in
-	 * plugin.properties)
-	 */
-	public Object execute(ExecutionEvent execEvent) throws ExecutionException {
-		try {
-
-			project = SelectConnetionAndDestDir.getSelectedProject(execEvent);
-
-			final SelectConnetionAndDestDir dialog = new SelectConnetionAndDestDir(
-					project);
-
-			if (!dialog.open()) {
-				return null;
-			}
-
-			sfs = dialog.getRemoteFileStore();
-			if (sfs == null) {
-				throw new ExecutionException(Messages.SMOACustomSyncAction_ErrorAccessingRemoteFS);
-			}
-
-			final Shell topShell = Display.getCurrent().getActiveShell();
-			final Shell shell = new Shell(topShell, new Shell().getStyle()
-					| SWT.APPLICATION_MODAL);
-			shell.setText(Messages.SMOACustomSyncAction_WindowTitle);
-			final GridLayout gridLayout = new GridLayout(2, true);
-			shell.setLayout(gridLayout);
-
-			new Label(shell, SWT.NONE).setText(Messages.SMOACustomSyncAction_Local);
-			new Label(shell, SWT.NONE).setText(Messages.SMOACustomSyncAction_Remote);
-
-			localTree = new Tree(shell, SWT.CHECK | SWT.VIRTUAL | SWT.MULTI);
-			localTree.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-			final Listener treeListener = new Listener() {
-				public void handleEvent(Event event) {
-					assert event.item instanceof TreeItem;
-					final TreeItem me = (TreeItem) event.item;
-					if (me.getChecked()) {
-
-						TreeItem parentItem = me.getParentItem();
-						while (parentItem != null) {
-							parentItem.setChecked(true);
-							parentItem = parentItem.getParentItem();
-						}
-						for (final TreeItem item : me.getItems()) {
-							item.setChecked(true);
-							final Event e = new Event();
-							e.item = item;
-							this.handleEvent(e);
-						}
-					} else {
-						for (final TreeItem item : me.getItems()) {
-							item.setChecked(false);
-							final Event e = new Event();
-							e.item = item;
-							this.handleEvent(e);
-						}
-					}
-				}
-			};
-
-			remoteTree = new Tree(shell, SWT.CHECK | SWT.VIRTUAL | SWT.MULTI);
-			remoteTree.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-			final Button copyLocalToRemote = new Button(shell, SWT.PUSH
-					| SWT.BORDER);
-			copyLocalToRemote.setLayoutData(new GridData(
-					GridData.HORIZONTAL_ALIGN_END));
-			copyLocalToRemote.setText(Messages.SMOACustomSyncAction_FromLocal);
-
-			copyLocalToRemote.addSelectionListener(new SelectionListener() {
-
-				public void widgetDefaultSelected(SelectionEvent arg0) {
-				}
-
-				public void widgetSelected(SelectionEvent arg0) {
-					toRemote();
-					// saveTrees(project);
-				}
-			});
-
-			final Button copyRemoteToLoacal = new Button(shell, SWT.PUSH
-					| SWT.BORDER);
-			copyRemoteToLoacal.setLayoutData(new GridData(
-					GridData.HORIZONTAL_ALIGN_BEGINNING));
-			copyRemoteToLoacal.setText(Messages.SMOACustomSyncAction_FromRemote);
-
-			copyRemoteToLoacal.addSelectionListener(new SelectionListener() {
-
-				public void widgetDefaultSelected(SelectionEvent arg0) {
-				}
-
-				public void widgetSelected(SelectionEvent arg0) {
-					fromRemote();
-					// saveTrees(project);
-				}
-			});
-
-			final Composite options = new Composite(shell, SWT.NONE);
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-			gridData.horizontalSpan = 2;
-			options.setLayoutData(gridData);
-			options.setLayout(new GridLayout(2, false));
-			new Label(options, SWT.NONE).setText(Messages.SMOACustomSyncAction_FileOverwritePolicy);
-
-			policy = new Combo(options, SWT.BORDER | SWT.READ_ONLY);
-			for (final OverwritePolicy p : OverwritePolicy.values()) {
-				policy.add(p.name());
-			}
-
-			final String policyVal = project
-					.getPersistentProperty(SMOA_SYNC_OVERWRITE);
-			if (policyVal != null) {
-				policy.select(policy.indexOf(policyVal));
-			} else {
-				policy.select(policy.indexOf(OverwritePolicy.Always.name()));
-			}
-
-			assert OverwritePolicy.valueOf(policy.getText()) != null;
-			overwrite = OverwritePolicy.valueOf(policy.getText());
-
-			policy.addSelectionListener(new SelectionListener() {
-				public void widgetDefaultSelected(SelectionEvent arg0) {
-				}
-
-				public void widgetSelected(SelectionEvent arg0) {
-					try {
-						assert OverwritePolicy.valueOf(policy.getText()) != null;
-						overwrite = OverwritePolicy.valueOf(policy.getText());
-						project.setPersistentProperty(SMOA_SYNC_OVERWRITE,
-								policy.getText());
-					} catch (final CoreException e) {
-						final MessageBox mb = new MessageBox(localTree.getShell(),
-								SWT.ICON_ERROR | SWT.OK);
-						mb.setText(Messages.SMOACustomSyncAction_ErrorOverwritePolicyTitle);
-						mb.setMessage(e.getLocalizedMessage());
-						mb.open();
-					}
-				}
-			});
-
-			final Shell progress = new Shell(topShell);
-			final GridLayout layout = new GridLayout();
-			progress.setLayout(layout);
-			final Label msg = new Label(progress, SWT.NONE);
-			msg.setText(Messages.SMOACustomSyncAction_PleaswWait);
-			gridData = new GridData(GridData.FILL_BOTH);
-			gridData.minimumWidth = 300;
-			msg.setLayoutData(gridData);
-			progress.pack();
-			progress.open();
-
-			lfs = rootFromProject(localTree, project, msg);
-			rootFromFileStore(remoteTree, sfs, msg);
-
-			if (!progress.isDisposed()) {
-				progress.close();
-			}
-
-			restoreTrees(project);
-
-			localTree.addListener(SWT.Selection, treeListener);
-			remoteTree.addListener(SWT.Selection, treeListener);
-
-			shell.open();
-
-			shell.addListener(SWT.Close, new Listener() {
-				public void handleEvent(Event event) {
-					saveTrees(project);
-				}
-			});
-
-			return null;
-		} catch (final CoreException e) {
-			NotifyShell.open(Messages.SMOACustomSyncAction_ExceptionBySynchro, e.getLocalizedMessage());
-			throw new ExecutionException(e.getLocalizedMessage(), e);
-		}
-	}
-
-	private TreeItem findChild(Tree parent, String text) {
-		for (final TreeItem it : parent.getItems()) {
-			if (it.getText().equals(text)) {
-				return it;
-			}
-		}
-		return null;
-	}
-
-	private TreeItem findChild(TreeItem parent, String text) {
-		for (final TreeItem it : parent.getItems()) {
-			if (it.getText().equals(text)) {
-				return it;
-			}
-		}
-		return null;
-	}
-
-	/** Calls synchronise in local ← remote direction */
-	protected void fromRemote() {
-		synchronise(getCheckedItems(remoteTree), lfs, localTree);
-	}
-
-	/**
-	 * Returns array with relative paths to the checked items
-	 */
-	private TreeItem[] getCheckedItems(Tree tree) {
-		final Vector<TreeItem> v = new Vector<TreeItem>();
-		for (final TreeItem it : tree.getItems()) {
-			v.addAll(getCheckedItems(it));
-		}
-		return v.toArray(new TreeItem[v.size()]);
-	}
-
-	/**
-	 * Returns all checked items under this item
-	 */
-	private Vector<TreeItem> getCheckedItems(TreeItem treeItem) {
-		final Vector<TreeItem> v = new Vector<TreeItem>();
-		for (final TreeItem it : treeItem.getItems()) {
-			if (it.getChecked()) {
-				v.add(it);
-			}
-			v.addAll(getCheckedItems(it));
-		}
-		return v;
-	}
-
-	/** Recursively builds up relative path representing the tree item */
-	String getRelPath(TreeItem item) {
-		if (item.getParentItem() != null) {
-			return getRelPath(item.getParentItem()) + "/" + item.getText(); //$NON-NLS-1$
-		}
-		return "."; //$NON-NLS-1$
-	}
-
-	/**
-	 * Recursively and eagerly fills the tree with store and it's children
-	 */
-	private void populate(TreeItem tree, IFileStore store, Label msg)
-			throws CoreException {
-		counter++;
-		final TreeItem treeItem = new TreeItem(tree, SWT.NONE);
-		treeItem.setText(store.getName());
-		treeItem.setData(store);
-
-		if (msg != null && !msg.isDisposed()) {
-			msg.setText(Messages.SMOACustomSyncAction_RegeneratingTree_FoundFiles + counter);
-			msg.redraw();
-			msg.getShell().redraw();
-			msg.getDisplay().update();
-		}
-
-		if (store instanceof SMOAFileStore || store.fetchInfo().isDirectory()) {
-			for (final IFileStore fs : store.childStores(0, null)) {
-				populate(treeItem, fs, msg);
-			}
-		}
-	}
-
-	/**
-	 * Reads the state of trees from project and applies to the trees
-	 */
-	private void restoreTrees(IProject project) {
-		try {
-			final BufferedReader in = new BufferedReader(new FileReader(project
-					.getLocation().toString() + "/" + SMOA_SYNC_FILELIST_NAME)); //$NON-NLS-1$
-
-			if (!"[Local]".equals(in.readLine())) { //$NON-NLS-1$
-				throw new FileFormatException(
-						"First line does not contain " + "[Local]"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			int c;
-			while ((c = in.read()) == '\t') {
-				final String line = in.readLine();
-				if (line == null) {
-					return;
-				}
-				selectFromPath(localTree, line);
-			}
-
-			if (c == -1) {
-				return;
-			}
-
-			if (c != '[') {
-				throw new FileFormatException("Illegal line start (" + c + ")"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			final String rem = in.readLine();
-			if (!"Remote]".equals(rem)) { //$NON-NLS-1$
-				throw new FileFormatException("Invalid line [" + rem); //$NON-NLS-1$
-			}
-
-			while ((c = in.read()) == '\t') {
-				final String line = in.readLine();
-				if (line == null) {
-					return;
-				}
-				selectFromPath(remoteTree, line);
-			}
-
-			if (c == -1) {
-				return;
-			}
-
-			throw new FileFormatException("Illegal line start (" + c + ")"); //$NON-NLS-1$ //$NON-NLS-2$
-
-		} catch (final FileNotFoundException e) {
-			// first run
-		} catch (final IOException e) {
-			final MessageBox mb = new MessageBox(localTree.getShell(), SWT.ICON_ERROR
-					| SWT.OK);
-			mb.setText(Messages.SMOACustomSyncAction_ExceptionByReadingSettings);
-			mb.setMessage(e.getLocalizedMessage());
-			mb.open();
-		}
-	}
-
-	/**
-	 * Starts filling the tree basing on the given store. Updates the message
-	 * label with progress.
-	 */
-	private void rootFromFileStore(Tree tree, IFileStore store, Label msg)
-			throws CoreException {
-
-		counter = 0;
-		final TreeItem treeItem = new TreeItem(tree, SWT.NONE);
-		treeItem.setText(store.getName());
-		treeItem.setData(store);
-		for (final IFileStore fs : store.childStores(0, null)) {
-			populate(treeItem, fs, msg);
-		}
-
-	}
-
-	/**
-	 * Starts filling the tree basing on the project location. Updates the
-	 * message label with progress.
-	 */
-	private IFileStore rootFromProject(Tree tree, IProject project, Label msg)
-			throws CoreException {
-		final IFileStore store = EFS.getLocalFileSystem().getStore(
-				project.getLocation());
-
-		rootFromFileStore(tree, store, msg);
-		return store;
-	}
-
-	/**
-	 * Records the state of trees in Project
-	 */
-	protected void saveTrees(IProject project) {
-
-		try {
-			final DataOutputStream out = new DataOutputStream(new FileOutputStream(
-					project.getLocation().toString() + "/" //$NON-NLS-1$
-							+ SMOA_SYNC_FILELIST_NAME));
-
-			out.writeBytes("[Local]\n"); //$NON-NLS-1$
-
-			for (final TreeItem item : getCheckedItems(localTree)) {
-				out.write('\t');
-				out.writeBytes(getRelPath(item));
-				out.write('\n');
-			}
-
-			out.writeBytes("[Remote]\n"); //$NON-NLS-1$
-			for (final TreeItem item : getCheckedItems(remoteTree)) {
-				out.write('\t');
-				out.writeBytes(getRelPath(item));
-				out.write('\n');
-			}
-
-		} catch (final IOException e) {
-			final MessageBox mb = new MessageBox(localTree.getShell(), SWT.ICON_ERROR
-					| SWT.OK);
-			mb.setText(Messages.SMOACustomSyncAction_ExceptionByWritingSettings);
-			mb.setMessage(e.getLocalizedMessage());
-			mb.open();
-		}
-	}
-
-	/**
-	 * Looks for a TreeItem corresponding to given path in given tree and
-	 * selects it.
-	 */
-	private void selectFromPath(Tree tree, String file) {
-		TreeItem root = tree.getItems()[0];
-		TreeItem next = root;
-		root.setChecked(true);
-		final String[] path = new Path(file).segments();
-		for (int i = 0; i < path.length; ++i) {
-			for (final TreeItem item : root.getItems()) {
-				if (item.getText().equals(path[i])) {
-					next = item;
-				}
-			}
-			if (next == root) {
-				return;
-			}
-			root = next;
-		}
-		next.setChecked(true);
-	}
-
-	/**
-	 * Copies files (given as array of {@link TreeItem}s) to another tree, given
-	 * as the tree and it's starting store
-	 * 
-	 * @param items
-	 *            - what to copy
-	 * @param store
-	 *            - where to copy
-	 * @param toRegenerate
-	 *            - which tree to update
-	 */
-	protected void synchronise(TreeItem[] items, IFileStore store,
-			Tree toRegenerate) {
-
-		final Shell topShell = Display.getCurrent().getActiveShell();
-		final Shell shell = new Shell(topShell, new Shell().getStyle()
-				| SWT.APPLICATION_MODAL);
-		shell.setText(Messages.SMOACustomSyncAction_ProgressWindowTitle);
-
-		shell.setLayout(new GridLayout(2, false));
-
-		new Label(shell, SWT.NONE).setText(Messages.SMOACustomSyncAction_FilesTotal);
-		new Label(shell, SWT.NONE).setText(Integer.toString(items.length));
-		new Label(shell, SWT.NONE).setText(Messages.SMOACustomSyncAction_FilesCopied);
-		final Label done = new Label(shell, SWT.NONE);
-		done.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		new Label(shell, SWT.NONE).setText(Messages.SMOACustomSyncAction_CurrentFile);
-		final Label current = new Label(shell, SWT.NONE);
-		final GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.minimumWidth = 500;
-		current.setLayoutData(gd);
-
-		int doneVal = -1;
-
-		shell.pack(true);
-		shell.open();
-
-		try {
-			for (final TreeItem treeItem : items) {
-				if (!shell.isDisposed()) {
-					done.setText(Integer.toString(++doneVal));
-					current.setText(getRelPath(treeItem));
-
-					shell.pack(true);
-					done.redraw();
-					current.redraw();
-					shell.redraw();
-					shell.getDisplay().update();
-				}
-				copyTreeItem(treeItem, store, toRegenerate);
-			}
-
-			if (!shell.isDisposed()) {
-				done.setText(Integer.toString(++doneVal));
-				current.setText(Messages.SMOACustomSyncAction_RegeneratingTree);
-
-				shell.pack(true);
-				done.redraw();
-				current.redraw();
-				shell.redraw();
-				shell.getDisplay().update();
-			}
-
-		} catch (final CoreException e) {
-			final MessageBox mb = new MessageBox(Display.getCurrent()
-					.getActiveShell(), SWT.ICON_ERROR | SWT.OK);
-			mb.setText(Messages.SMOACustomSyncAction_ErrorDialogTitle);
-			mb.setMessage(e.getMessage());
-			mb.open();
-		}
-
-		if (!shell.isDisposed()) {
-			shell.close();
-		}
-
-	}
-
-	/** Calls synchronise in local → remote direction */
-	protected void toRemote() {
-		synchronise(getCheckedItems(localTree), sfs, remoteTree);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/SMOAToLocalSyncAction.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/SMOAToLocalSyncAction.java
deleted file mode 100644
index 26bc7d3..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/SMOAToLocalSyncAction.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.actions;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ptp.rm.smoa.core.util.NotifyShell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.ProgressBar;
-import org.eclipse.swt.widgets.Shell;
-
-import com.smoa.comp.sdk.SMOARsync;
-import com.smoa.comp.sdk.jsdl.JSDL;
-
-/**
- * Action for synchronizing files with rsync mechanism
- */
-public class SMOAToLocalSyncAction extends AbstractHandler {
-
-	public Object execute(ExecutionEvent execEvent) throws ExecutionException {
-		try {
-			final IProject project = SelectConnetionAndDestDir
-					.getSelectedProject(execEvent);
-			final SelectConnetionAndDestDir dialog = new SelectConnetionAndDestDir(
-					project);
-			dialog.setWindowTitle(Messages.SMOAToLocalSyncAction_WindowTitle);
-			dialog.setShowRules(true);
-			dialog.open();
-
-			if (!dialog.hasSucceeded()) {
-				return null;
-			}
-
-			final SMOARsync rsync = dialog.getConnection().getRsync();
-
-			final JSDL jsdl = new JSDL("rsync from " + dialog.getRemoteDir()); //$NON-NLS-1$
-			jsdl.setWorkingDirectory(dialog.getRemoteDir());
-
-			final Shell shell = new Shell(Display.getCurrent().getActiveShell());
-			shell.setLayout(new GridLayout(1, false));
-			shell.setText(Messages.SMOASyncAction_RsyncInProgress);
-			final ProgressBar progress = new ProgressBar(shell, SWT.INDETERMINATE
-					| SWT.SMOOTH | SWT.BORDER);
-			final GridData data = new GridData(GridData.FILL_BOTH);
-			data.minimumWidth = 200;
-			progress.setLayoutData(data);
-
-			shell.pack();
-
-			shell.open();
-
-			new Thread() {
-				@Override
-				public void run() {
-					try {
-						final String localDir = project.getLocation().toString();
-
-						rsync.remoteToLocal(jsdl, localDir, dialog.getRules());
-						Display.getDefault().asyncExec(new Runnable() {
-							public void run() {
-								if (!shell.isDisposed()) {
-									shell.close();
-								}
-							}
-						});
-					} catch (final Exception e) {
-						Display.getDefault().asyncExec(new Runnable() {
-							public void run() {
-								if (!shell.isDisposed()) {
-									shell.close();
-								}
-								e.printStackTrace();
-								final Shell s = Display.getDefault().getActiveShell();
-								final MessageBox mb = new MessageBox(s != null ? s
-										: new Shell(), SWT.APPLICATION_MODAL
-										| SWT.ICON_ERROR | SWT.OK);
-								mb.setText(Messages.SMOASyncAction_ErrorByRsync_title);
-								mb.setMessage(Messages.SMOASyncAction_ErrorByRsync_desc
-										+ e.getClass().getName()
-										+ (e.getLocalizedMessage() == null ? "" //$NON-NLS-1$
-												: ("\n" + e //$NON-NLS-1$
-														.getLocalizedMessage())));
-								mb.open();
-							}
-						});
-					}
-				}
-			}.start();
-
-			return null;
-		} catch (final CoreException e) {
-			NotifyShell.open(Messages.SMOASyncAction_ExceptionBySynchro, e.getLocalizedMessage());
-			throw new ExecutionException(e.getLocalizedMessage(), e);
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/SMOAToRemoteSyncAction.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/SMOAToRemoteSyncAction.java
deleted file mode 100644
index e4a7551..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/SMOAToRemoteSyncAction.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.actions;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ptp.rm.smoa.core.util.NotifyShell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.ProgressBar;
-import org.eclipse.swt.widgets.Shell;
-
-import com.smoa.comp.sdk.SMOARsync;
-import com.smoa.comp.sdk.jsdl.JSDL;
-
-/**
- * Action for synchronizing files with rsync mechanism
- */
-public class SMOAToRemoteSyncAction extends AbstractHandler {
-
-	public Object execute(ExecutionEvent execEvent) throws ExecutionException {
-		try {
-			final IProject project = SelectConnetionAndDestDir
-					.getSelectedProject(execEvent);
-			final SelectConnetionAndDestDir dialog = new SelectConnetionAndDestDir(
-					project);
-			dialog.setWindowTitle(Messages.SMOAToRemoteSyncAction_WindowTitle);
-			dialog.setShowRules(true);
-			dialog.open();
-
-			if (!dialog.hasSucceeded()) {
-				return null;
-			}
-
-			final SMOARsync rsync = dialog.getConnection().getRsync();
-
-			final JSDL jsdl = new JSDL("rsync to " + dialog.getRemoteDir()); //$NON-NLS-1$
-			jsdl.setWorkingDirectory(dialog.getRemoteDir());
-
-			final Shell shell = new Shell(Display.getCurrent().getActiveShell());
-			shell.setLayout(new GridLayout(1, false));
-			shell.setText(Messages.SMOASyncAction_RsyncInProgress);
-			final ProgressBar progress = new ProgressBar(shell, SWT.INDETERMINATE
-					| SWT.SMOOTH | SWT.BORDER);
-			final GridData data = new GridData(GridData.FILL_BOTH);
-			data.minimumWidth = 200;
-			progress.setLayoutData(data);
-
-			shell.pack();
-
-			shell.open();
-
-			new Thread() {
-				@Override
-				public void run() {
-					try {
-						final String localDir = project.getLocation().toString();
-						rsync.localToRemote(jsdl, localDir, dialog.getRules());
-						Display.getDefault().asyncExec(new Runnable() {
-							public void run() {
-								if (!shell.isDisposed()) {
-									shell.close();
-								}
-							}
-						});
-					} catch (final Exception e) {
-						Display.getDefault().asyncExec(new Runnable() {
-							public void run() {
-								if (!shell.isDisposed()) {
-									shell.close();
-								}
-								e.printStackTrace();
-								final Shell s = Display.getDefault().getActiveShell();
-								final MessageBox mb = new MessageBox(s != null ? s
-										: new Shell(), SWT.APPLICATION_MODAL
-										| SWT.ICON_ERROR | SWT.OK);
-								mb.setText(Messages.SMOASyncAction_ErrorByRsync_title);
-								mb.setMessage(Messages.SMOASyncAction_ErrorByRsync_desc
-										+ e.getClass().getName()
-										+ (e.getLocalizedMessage() == null ? "" //$NON-NLS-1$
-												: ("\n" + e //$NON-NLS-1$
-														.getLocalizedMessage())));
-								mb.open();
-							}
-						});
-					}
-				}
-			}.start();
-
-			return null;
-		} catch (final CoreException e) {
-			NotifyShell.open(Messages.SMOASyncAction_ExceptionBySynchro, e.getLocalizedMessage());
-			throw new ExecutionException(e.getLocalizedMessage(), e);
-		}
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/SelectConnetionAndDestDir.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/SelectConnetionAndDestDir.java
deleted file mode 100644
index 023ce05..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/SelectConnetionAndDestDir.java
+++ /dev/null
@@ -1,521 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.actions;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Vector;
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.ptp.remote.core.IRemoteFileManager;
-import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOAConnection;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOARemoteServices;
-import org.eclipse.ptp.rm.smoa.ui.SMOAUIPlugin;
-import org.eclipse.ptp.rm.smoa.ui.rservices.SMOAUIFileManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.TextStyle;
-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.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Provides dialog for selecting the connection and remote directory.
- * 
- * Has also option to display rules for {@link SMOAToLocalSyncAction} and
- * {@link SMOAToRemoteSyncAction} classes.
- */
-/* package access */class SelectConnetionAndDestDir {
-
-	// Locations in {@link IProject}'s store for keeping settings of this dialog
-	private static final QualifiedName SMOA_SYNC_PATH = new QualifiedName(
-			SMOAUIPlugin.PLUGIN_ID, "smoa.sync.rm.path"); //$NON-NLS-1$
-	private static final QualifiedName SMOA_SYNC_RM = new QualifiedName(
-			SMOAUIPlugin.PLUGIN_ID, "smoa.sync.rm.name"); //$NON-NLS-1$
-	private static final QualifiedName SMOA_SYNC_CREATE = new QualifiedName(
-			SMOAUIPlugin.PLUGIN_ID, "smoa.sync.rm.create"); //$NON-NLS-1$
-	private static final QualifiedName SMOA_SYNC_RULES = new QualifiedName(
-			SMOAUIPlugin.PLUGIN_ID, "smoa.sync.rsync.rules"); //$NON-NLS-1$
-
-	/**
-	 * Set of default ignore rules, loaded when the project has none in it's
-	 * settings
-	 */
-	private static final String DEFAULT_RULES = Messages.SelectConnetionAndDestDir_DefaultRules;
-
-	/** Tries to retrieve the IProject from event */
-	static public IProject getSelectedProject(ExecutionEvent execEvent)
-			throws ExecutionException {
-		Object object = execEvent.getApplicationContext();
-		if (!(object instanceof EvaluationContext)) {
-			throw new ExecutionException("EvaluationContext"); //$NON-NLS-1$
-		}
-		final EvaluationContext context = (EvaluationContext) execEvent
-				.getApplicationContext();
-
-		object = context.getDefaultVariable();
-
-		if (!(object instanceof List)) {
-			throw new ExecutionException("List"); //$NON-NLS-1$
-		}
-		@SuppressWarnings("unchecked")
-		final List<Object> list = (List<Object>) object;
-
-		object = list.get(0);
-		if (!(object instanceof IProject)) {
-			throw new ExecutionException("IProject"); //$NON-NLS-1$
-		}
-
-		final IProject project = (IProject) object;
-		return project;
-	}
-
-	private final IProject project;
-
-	private final SMOARemoteServices rservices = (SMOARemoteServices) PTPRemoteCorePlugin
-			.getDefault().getRemoteServices("org.eclipse.ptp.remote.SMOARemoteServices"); //$NON-NLS-1$
-	private String remoteDir = null;
-	private SMOAConnection connection = null;
-
-	private boolean mkdirIfNotExists = false;
-	private boolean showRules = false;
-
-	private String rules = null;
-	private boolean succeeded = false;
-
-	private String windowTitle;
-
-	public SelectConnetionAndDestDir(final IProject project) {
-		this.project = project;
-	}
-
-	public SMOAConnection getConnection() {
-		return connection;
-	}
-
-	/** Returns directory selected by user for remote synchronization */
-	public String getRemoteDir() {
-		return remoteDir;
-	}
-
-	/** Gets remote file store */
-	public IFileStore getRemoteFileStore() throws CoreException {
-		if (!succeeded) {
-			return null;
-		}
-
-		final IRemoteFileManager fileManager = rservices.getFileManager(connection);
-		final IFileStore resource = fileManager.getResource(remoteDir);
-
-		if (mkdirIfNotExists) {
-			resource.mkdir(0, null);
-		}
-
-		return resource;
-	}
-
-	/** Returns interpreted ignore rules */
-	public List<Pattern> getRules() {
-		if (rules == null) {
-			return null;
-		}
-
-		final Vector<Pattern> v = new Vector<Pattern>();
-
-		for (final String rule : rules.split("\n")) { //$NON-NLS-1$
-			if (!rule.isEmpty()) {
-				v.add(Pattern.compile(rule));
-			}
-		}
-
-		return v;
-	}
-
-	/** Returns if the user triggered 'Ok' on the dialog */
-	public boolean hasSucceeded() {
-		return succeeded;
-	}
-
-	public boolean isMkdirIfNotExists() {
-		return mkdirIfNotExists;
-	}
-
-	public boolean isShowRules() {
-		return showRules;
-	}
-
-	/**
-	 * Opens the dialog and waits till completion
-	 * 
-	 * If user selected and accepted the dialog, returns true. False otherwise.
-	 */
-	@SuppressWarnings({ "unused", "null" })
-	public boolean open() throws CoreException {
-		final Shell topShell = Display.getCurrent().getActiveShell();
-
-		final Map<String, SMOAConnection> connections = rservices
-				.getConnectionManager().getOpenConnections();
-
-		// re-labelling connections
-		final Set<SMOAConnection> temp = new HashSet<SMOAConnection>(
-				connections.values());
-		connections.clear();
-		for (final SMOAConnection c : temp) {
-			connections.put(c.getRMName(), c);
-		}
-
-		if (connections.isEmpty()) {
-			final MessageBox mb = new MessageBox(topShell, SWT.ICON_INFORMATION
-					| SWT.OK);
-			mb.setText(Messages.SelectConnetionAndDestDir_ErrorNoActiveConnectionTitle);
-			mb.setMessage(Messages.SelectConnetionAndDestDir_ErrorNoActiveConnection);
-			mb.open();
-			return false;
-		}
-
-		final Shell shell = new Shell(topShell, new Shell().getStyle()
-				| SWT.APPLICATION_MODAL);
-		shell.setLayout(new GridLayout(3, false));
-
-		shell.setText(windowTitle != null ? windowTitle
-				: Messages.SelectConnetionAndDestDir_DefaultWindowTitle);
-
-		new Label(shell, SWT.NONE).setText(Messages.SelectConnetionAndDestDir_ResourceManager);
-
-		final Combo combo = new Combo(shell, SWT.READ_ONLY);
-		final GridData gridData1 = new GridData(GridData.FILL_HORIZONTAL);
-		combo.setLayoutData(gridData1);
-		gridData1.horizontalSpan = 2;
-
-		for (final String conn : connections.keySet()) {
-			combo.add(conn);
-		}
-
-		new Label(shell, SWT.NONE)
-				.setText(Messages.SelectConnetionAndDestDir_RemoteRootPath);
-
-		final Text remoteRootPath = new Text(shell, SWT.SINGLE | SWT.BORDER);
-		remoteRootPath.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		final Button browse = new Button(shell, SWT.PUSH | SWT.BORDER);
-		browse.setText(Messages.SelectConnetionAndDestDir_Browse);
-
-		new Label(shell, SWT.NONE);
-
-		final Button cbCreateDir = new Button(shell, SWT.CHECK | SWT.BORDER);
-		cbCreateDir.setText(Messages.SelectConnetionAndDestDir_CreateIfNotExists);
-		cbCreateDir.setSelection(true);
-
-		new Label(shell, SWT.NONE);
-
-		final StyledText rules;
-
-		final boolean showRulesLocal = showRules;
-		if (showRulesLocal) {
-			final Composite rulesComp = new Composite(shell, SWT.NONE);
-			final GridData gridData2 = new GridData(GridData.FILL_HORIZONTAL);
-			rulesComp.setLayoutData(gridData2);
-			gridData2.horizontalSpan = 3;
-			rulesComp.setLayout(new GridLayout(1, false));
-
-			new Label(rulesComp, SWT.NONE)
-					.setText(Messages.SelectConnetionAndDestDir_ExcludeRules);
-
-			rules = new StyledText(rulesComp, SWT.MULTI | SWT.BORDER
-					| SWT.V_SCROLL | SWT.H_SCROLL);
-
-			rules.getHorizontalBar().setVisible(true);
-
-			final GridData gridData = new GridData(GridData.FILL_BOTH);
-			rules.setLayoutData(gridData);
-			gridData.minimumHeight = rules.getLineHeight() * 5;
-		} else {
-			rules = null;
-		}
-
-		final Composite buttons = new Composite(shell, SWT.NONE);
-		final GridData gridData3 = new GridData(GridData.FILL_HORIZONTAL);
-		buttons.setLayoutData(gridData3);
-		gridData3.horizontalSpan = 3;
-
-		buttons.setLayout(new GridLayout(3, false));
-		new Label(buttons, SWT.NONE).setLayoutData(new GridData(
-				GridData.FILL_HORIZONTAL));
-
-		final Button ok = new Button(buttons, SWT.PUSH | SWT.BORDER);
-		ok.setText(Messages.SelectConnetionAndDestDir_Ok);
-
-		final Button cancel = new Button(buttons, SWT.PUSH | SWT.BORDER);
-		cancel.setText(Messages.SelectConnetionAndDestDir_Cancel);
-
-		remoteRootPath.setEnabled(false);
-		browse.setEnabled(false);
-		ok.setEnabled(false);
-
-		final Runnable check = new Runnable() {
-			String previousRM = null;
-			String previousDir = null;
-			boolean previousResult = false;
-
-			public void run() {
-				if (showRulesLocal) {
-					if (rules.getStyleRanges().length != 0) {
-						ok.setEnabled(false);
-						return;
-					}
-				}
-
-				if (combo.getSelectionIndex() == -1) {
-					ok.setEnabled(false);
-					return;
-				}
-
-				if (remoteRootPath.getText().isEmpty()) {
-					ok.setEnabled(false);
-					return;
-				}
-				if (cbCreateDir.getSelection()) {
-					ok.setEnabled(true);
-					return;
-				}
-
-				if (combo.getText().equals(previousRM)
-						&& remoteRootPath.getText().equals(previousDir)) {
-					ok.setEnabled(previousResult);
-					return;
-				}
-
-				previousRM = combo.getText();
-				previousDir = remoteRootPath.getText();
-				final IRemoteFileManager fileManager = rservices
-						.getFileManager(connections.get(previousRM));
-				final IFileStore resource = fileManager.getResource(previousDir);
-				try {
-					ok.setEnabled(resource.fetchInfo(0, null).isDirectory());
-				} catch (final CoreException e) {
-					final MessageBox mb = new MessageBox(shell, SWT.ICON_ERROR
-							| SWT.OK);
-					mb.setText(Messages.SelectConnetionAndDestDir_ErrorByFetchInfoTitle);
-					mb.setMessage(e.getMessage());
-				}
-				previousResult = ok.getEnabled();
-			}
-		};
-
-		combo.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-				widgetSelected(arg0);
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				remoteRootPath.setEnabled(true);
-				browse.setEnabled(true);
-				remoteRootPath.setText(connections.get(combo.getText())
-						.getHomeDir() + "/" + project.getName()); //$NON-NLS-1$
-				check.run();
-			}
-		});
-
-		remoteRootPath.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent arg0) {
-				check.run();
-			}
-		});
-
-		browse.addSelectionListener(new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				final SMOAUIFileManager uifm = new SMOAUIFileManager(rservices);
-				uifm.showConnections(false);
-				uifm.setConnection(connections.get(combo.getText()));
-				final String chosen = uifm.browseDirectory(shell,
-						Messages.SelectConnetionAndDestDir_DirBrowserTitle, remoteRootPath.getText(), 0);
-				if (chosen != null) {
-					remoteRootPath.setText(chosen);
-				}
-			}
-		});
-
-		if (showRulesLocal) {
-			rules.addModifyListener(new ModifyListener() {
-
-				public void modifyText(ModifyEvent arg0) {
-					rules.setStyleRanges(new StyleRange[0]);
-					int start = 0;
-					final String[] array = rules.getText().split("\n"); //$NON-NLS-1$
-					for (int i = 0; i < array.length; ++i) {
-						if (array[i].isEmpty()) {
-							start++;
-							continue;
-						}
-						try {
-							Pattern.compile(array[i]);
-						} catch (final PatternSyntaxException e) {
-							final TextStyle textStyle = new TextStyle();
-							textStyle.underline = true;
-							textStyle.underlineColor = new Color(rules
-									.getDisplay(), 255, 0, 0);
-							textStyle.underlineStyle = SWT.UNDERLINE_ERROR;
-							final StyleRange style = new StyleRange(textStyle);
-							style.start = start;
-							style.length = array[i].length();
-
-							rules.setStyleRange(style);
-
-						}
-						start += array[i].length() + 1;
-					}
-
-					check.run();
-				}
-			});
-		}
-
-		cancel.addSelectionListener(new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				shell.close();
-			}
-		});
-
-		cbCreateDir.addSelectionListener(new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				check.run();
-			}
-		});
-
-		final String[] result = new String[2];
-		final SMOAConnection[] conn = new SMOAConnection[1];
-		final boolean[] mkdir = new boolean[1];
-
-		ok.addSelectionListener(new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				result[0] = remoteRootPath.getText();
-				if (showRulesLocal) {
-					result[1] = rules.getText();
-				}
-				conn[0] = connections.get(combo.getText());
-				mkdir[0] = cbCreateDir.getSelection();
-				shell.close();
-			}
-		});
-
-		final String create = project.getPersistentProperty(SMOA_SYNC_CREATE);
-		if (create != null) {
-			cbCreateDir.setSelection(create.equals("true")); //$NON-NLS-1$
-		}
-
-		final String rm = project.getPersistentProperty(SMOA_SYNC_RM);
-		if (rm != null) {
-			final SMOAConnection c = connections.get(rm);
-			if (c != null) {
-				combo.select(combo.indexOf(rm));
-			}
-			remoteRootPath.setEnabled(true);
-			browse.setEnabled(true);
-		}
-
-		final String path = project.getPersistentProperty(SMOA_SYNC_PATH);
-		if (path != null) {
-			remoteRootPath.setText(path);
-		}
-
-		if (showRulesLocal) {
-			final String rulesVar = project.getPersistentProperty(SMOA_SYNC_RULES);
-			if (rulesVar != null) {
-				rules.setText(rulesVar);
-			} else {
-				rules.setText(DEFAULT_RULES);
-			}
-		}
-
-		shell.pack();
-
-		shell.open();
-		while (!shell.isDisposed()) {
-			if (!shell.getDisplay().readAndDispatch()) {
-				shell.getDisplay().sleep();
-			}
-		}
-
-		if (result[0] == null || result[0].isEmpty()) {
-			return false;
-		}
-
-		connection = conn[0];
-		remoteDir = result[0];
-		mkdirIfNotExists = mkdir[0];
-		if (showRulesLocal) {
-			this.rules = result[1];
-		}
-
-		project.setPersistentProperty(SMOA_SYNC_PATH, result[0]);
-		project.setPersistentProperty(SMOA_SYNC_RM, conn[0].getRMName());
-		project.setPersistentProperty(SMOA_SYNC_CREATE, mkdir[0] ? "true" //$NON-NLS-1$
-				: "false"); //$NON-NLS-1$
-
-		if (showRulesLocal) {
-			project.setPersistentProperty(SMOA_SYNC_RULES, result[1]);
-		}
-
-		succeeded = true;
-		return true;
-	}
-
-	/** Adds to the GUI proper dialog for the ignore rules */
-	public void setShowRules(boolean showRules) {
-		this.showRules = showRules;
-	}
-
-	public void setWindowTitle(String title) {
-		windowTitle = title;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/messages.properties b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/messages.properties
deleted file mode 100644
index 2874fae..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/actions/messages.properties
+++ /dev/null
@@ -1,40 +0,0 @@
-SelectConnetionAndDestDir_Browse=Browse...
-SelectConnetionAndDestDir_Cancel=Cancel
-SelectConnetionAndDestDir_CreateIfNotExists=Create dir if not exists
-SelectConnetionAndDestDir_DefaultRules=\\..*\n.*~
-SelectConnetionAndDestDir_DefaultWindowTitle=Choose connection and destination directory
-SelectConnetionAndDestDir_DirBrowserTitle=Synchronise (SMOA Comp)
-SelectConnetionAndDestDir_ErrorByFetchInfoTitle=Error\!
-SelectConnetionAndDestDir_ErrorNoActiveConnection=There is no active connection\!\nPlease start target SMOA Resource Manager first
-SelectConnetionAndDestDir_ErrorNoActiveConnectionTitle=Synchronise (SMOA Comp)
-SelectConnetionAndDestDir_ExcludeRules=File exclude rules (Java Pattern):
-SelectConnetionAndDestDir_Ok=Ok
-SelectConnetionAndDestDir_RemoteRootPath=Remote root path for synchronisation:
-SelectConnetionAndDestDir_ResourceManager=Resource manager:
-SMOACustomSyncAction_CurrentFile=Current:
-SMOACustomSyncAction_ErrorAccessingRemoteFS=Error accessing remote FS\!\!\!
-SMOACustomSyncAction_ErrorDialogTitle=Error\!
-SMOACustomSyncAction_ErrorOverwritePolicyTitle=Synchronise (SMOA Comp)
-SMOACustomSyncAction_ExceptionByReadingSettings=Synchronise (SMOA Comp)
-SMOACustomSyncAction_ExceptionBySynchro=Exception occured by synchronizing files
-SMOACustomSyncAction_ExceptionByWritingSettings=Synchronise (SMOA Comp)
-SMOACustomSyncAction_FileOverwritePolicy=File overwrite policy:
-SMOACustomSyncAction_FilesCopied=Files copied:
-SMOACustomSyncAction_FilesTotal=Files total:
-SMOACustomSyncAction_FromLocal=from local to remote [>>]
-SMOACustomSyncAction_FromRemote=[<<] from remote to local
-SMOACustomSyncAction_IncorretOverwritePolicy=Incorrect overwrite policy\!
-SMOACustomSyncAction_Local=Local
-SMOACustomSyncAction_PleaswWait=Please wait...
-SMOACustomSyncAction_ProgressWindowTitle=SMOA Computing file synchronization
-SMOACustomSyncAction_RegeneratingTree=Regenerating tree...
-SMOACustomSyncAction_RegeneratingTree_FoundFiles=Regenerating tree. Found files: 
-SMOACustomSyncAction_Remote=Remote
-SMOACustomSyncAction_WindowTitle=SMOA Computing file synchronization
-SMOAToLocalSyncAction_WindowTitle=Synchronise from remote to local
-SMOAToRemoteSyncAction_WindowTitle=Synchronise from local to remote
-SMOASyncAction_RsyncInProgress=rsyncing...
-SMOASyncAction_ExceptionBySynchro=Exception occurred by synchronising files
-SMOASyncAction_ErrorByRsync_desc=Caught exception while executing rsync:\n
-SMOASyncAction_ErrorByRsync_title=Error!
-SMOASyncAction_RsyncInProgress=rsyncing...
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/launch/Messages.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/launch/Messages.java
deleted file mode 100644
index 9a4bf42..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/launch/Messages.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.launch;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rm.smoa.ui.launch.messages"; //$NON-NLS-1$
-	public static String SMOARMLaunchConfigurationDynamicTab_AllMachines;
-	public static String SMOARMLaunchConfigurationDynamicTab_APP_REGEX;
-	public static String SMOARMLaunchConfigurationDynamicTab_CpuCountBounds;
-	public static String SMOARMLaunchConfigurationDynamicTab_CustomMakeCommand;
-	public static String SMOARMLaunchConfigurationDynamicTab_CustomMakeIsEmptyError;
-	public static String SMOARMLaunchConfigurationDynamicTab_Description;
-	public static String SMOARMLaunchConfigurationDynamicTab_MaxCpuCount;
-	public static String SMOARMLaunchConfigurationDynamicTab_MinCpuCount;
-	public static String SMOARMLaunchConfigurationDynamicTab_Name;
-	public static String SMOARMLaunchConfigurationDynamicTab_NativeSpec;
-	public static String SMOARMLaunchConfigurationDynamicTab_PreferredMachines;
-	public static String SMOARMLaunchConfigurationDynamicTab_QueueName;
-	public static String SMOARMLaunchConfigurationDynamicTab_RunMake;
-	public static String SMOARMLaunchConfigurationDynamicTab_WrapperScript;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/launch/SMOARMLaunchConfigurationDynamicTab.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/launch/SMOARMLaunchConfigurationDynamicTab.java
deleted file mode 100644
index 1707082..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/launch/SMOARMLaunchConfigurationDynamicTab.java
+++ /dev/null
@@ -1,648 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.launch;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.ptp.core.attributes.ArrayAttribute;
-import org.eclipse.ptp.core.attributes.ArrayAttributeDefinition;
-import org.eclipse.ptp.core.attributes.IAttribute;
-import org.eclipse.ptp.core.attributes.IAttributeDefinition;
-import org.eclipse.ptp.core.attributes.IllegalValueException;
-import org.eclipse.ptp.core.attributes.IntegerAttribute;
-import org.eclipse.ptp.core.elements.IPMachine;
-import org.eclipse.ptp.core.elements.IPNode;
-import org.eclipse.ptp.core.elements.IPQueue;
-import org.eclipse.ptp.core.elements.IPResourceManager;
-import org.eclipse.ptp.core.elements.attributes.ElementAttributes;
-import org.eclipse.ptp.core.elements.attributes.JobAttributes;
-import org.eclipse.ptp.launch.ui.extensions.AbstractRMLaunchConfigurationDynamicTab;
-import org.eclipse.ptp.launch.ui.extensions.RMLaunchValidation;
-import org.eclipse.ptp.rm.smoa.core.SMOAConfiguration;
-import org.eclipse.ptp.rm.smoa.core.attrib.SMOAJobAttributes;
-import org.eclipse.ptp.rm.smoa.core.attrib.SMOANodeAttributes;
-import org.eclipse.ptp.rm.smoa.core.attrib.StringMapAttribute;
-import org.eclipse.ptp.rm.smoa.core.attrib.StringMapAttributeDefinition;
-import org.eclipse.ptp.rm.smoa.core.rmsystem.SMOAResourceManager;
-import org.eclipse.ptp.rm.smoa.ui.SMOAUIPlugin;
-import org.eclipse.ptp.rmsystem.IResourceManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Spinner;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * This GUI element is drawn within the Launch dialog, under Resources tab.
- * 
- * The configuration is saved outside this class.
- */
-public class SMOARMLaunchConfigurationDynamicTab extends AbstractRMLaunchConfigurationDynamicTab {
-
-	/** The regular expression for filtering application names for combo box */
-	public static final String APP_REGEX = Messages.SMOARMLaunchConfigurationDynamicTab_APP_REGEX;
-
-	// Main GUI composite
-	private Composite control = null;
-
-	// Controls for user:
-	private Text jobName = null;
-	private Text jobDescription = null;
-	private Text jobNativeSpecification = null;
-	private List machinesAll = null;
-	private List machinesPreferred = null;
-	private Spinner minCPUs = null;
-	private Spinner maxCPUs = null;
-	private Button cboxMin = null;
-	private Button cboxMax = null;
-	private Combo application = null;
-	private Button cboxMake = null;
-	private Text queue = null;
-	private Text customMake = null;
-	private Button cboxCustomMake = null;
-
-	public SMOARMLaunchConfigurationDynamicTab(IResourceManager rm, ILaunchConfigurationDialog dialog) {
-		super(dialog);
-	}
-
-	public RMLaunchValidation canSave(Control control, IResourceManager rm, IPQueue queue) {
-		return new RMLaunchValidation(true, null);
-	}
-
-	public void createControl(Composite parent, IResourceManager rm, IPQueue ipqueue) throws CoreException {
-		control = new Composite(parent, SWT.NONE);
-		control.setLayout(new GridLayout(1, false));
-
-		Label label;
-		Group group;
-
-		// Job name
-
-		final Composite nameComposite = new Composite(control, SWT.NONE);
-		nameComposite.setLayout(new GridLayout(2, false));
-		nameComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		label = new Label(nameComposite, SWT.NONE);
-		label.setText(Messages.SMOARMLaunchConfigurationDynamicTab_Name);
-		label.setLayoutData(new GridData());
-
-		jobName = new Text(nameComposite, SWT.SINGLE | SWT.BORDER);
-		jobName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		label = new Label(nameComposite, SWT.NONE);
-		label.setText(Messages.SMOARMLaunchConfigurationDynamicTab_Description);
-		label.setLayoutData(new GridData());
-
-		jobDescription = new Text(nameComposite, SWT.MULTI | SWT.BORDER);
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		gridData.minimumHeight = jobDescription.getLineHeight();
-		jobDescription.setLayoutData(gridData);
-
-		// App & make
-
-		final Composite appComposite = new Composite(control, SWT.NONE);
-		appComposite.setLayout(new GridLayout(4, false));
-		appComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		label = new Label(appComposite, SWT.NONE);
-		label.setText(Messages.SMOARMLaunchConfigurationDynamicTab_WrapperScript);
-		label.setLayoutData(new GridData());
-
-		application = new Combo(appComposite, SWT.BORDER | SWT.READ_ONLY);
-		application.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		label = new Label(appComposite, SWT.NONE);
-		label.setText("     "); /* Now I know where the name "spacer" comes from *///$NON-NLS-1$
-		label.setLayoutData(new GridData());
-
-		cboxMake = new Button(appComposite, SWT.CHECK | SWT.BORDER);
-		cboxMake.setLayoutData(new GridData());
-
-		cboxMake.setText(Messages.SMOARMLaunchConfigurationDynamicTab_RunMake);
-
-		// Queue and make app
-
-		final Composite queue_makenameComposite = new Composite(control, SWT.NONE);
-		queue_makenameComposite.setLayout(new GridLayout(2, false));
-		queue_makenameComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		cboxCustomMake = new Button(queue_makenameComposite, SWT.CHECK | SWT.BORDER);
-		cboxCustomMake.setText(Messages.SMOARMLaunchConfigurationDynamicTab_CustomMakeCommand);
-		cboxCustomMake.setLayoutData(new GridData());
-		cboxCustomMake.setEnabled(false);
-
-		customMake = new Text(queue_makenameComposite, SWT.SINGLE | SWT.BORDER);
-		customMake.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		customMake.setEnabled(false);
-
-		label = new Label(queue_makenameComposite, SWT.NONE);
-		label.setText(Messages.SMOARMLaunchConfigurationDynamicTab_QueueName);
-		label.setLayoutData(new GridData());
-
-		queue = new Text(queue_makenameComposite, SWT.SINGLE | SWT.BORDER);
-		queue.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		// CPU count
-
-		group = new Group(control, SWT.NONE);
-		group.setText(Messages.SMOARMLaunchConfigurationDynamicTab_CpuCountBounds);
-		group.setLayout(new GridLayout(6, false));
-		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		label = new Label(group, SWT.NONE);
-		label.setText(Messages.SMOARMLaunchConfigurationDynamicTab_MinCpuCount);
-		label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_END));
-
-		minCPUs = new Spinner(group, SWT.SINGLE | SWT.BORDER);
-		minCPUs.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
-
-		cboxMin = new Button(group, SWT.CHECK);
-		cboxMin.setSelection(true);
-		cboxMin.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-
-		label = new Label(group, SWT.NONE);
-		label.setText(Messages.SMOARMLaunchConfigurationDynamicTab_MaxCpuCount);
-		label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_END));
-
-		maxCPUs = new Spinner(group, SWT.SINGLE | SWT.BORDER);
-		maxCPUs.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
-
-		cboxMax = new Button(group, SWT.CHECK);
-		cboxMax.setSelection(true);
-		cboxMax.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-
-		// Machines
-
-		group = new Group(control, SWT.NONE);
-		group.setText(Messages.SMOARMLaunchConfigurationDynamicTab_PreferredMachines);
-		group.setLayout(new GridLayout(2, true));
-		group.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		label = new Label(group, SWT.NONE);
-		label.setText(Messages.SMOARMLaunchConfigurationDynamicTab_AllMachines);
-		label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		label = new Label(group, SWT.NONE);
-		label.setText(Messages.SMOARMLaunchConfigurationDynamicTab_PreferredMachines);
-		label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		machinesAll = new List(group, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
-		gridData = new GridData(GridData.FILL_BOTH);
-		gridData.minimumHeight = (int) (2.25 * machinesAll.getItemHeight());
-		machinesAll.setLayoutData(gridData);
-
-		machinesPreferred = new List(group, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
-		machinesPreferred.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		// Descriptions
-
-		final Composite descsComposite = new Composite(control, SWT.NONE);
-		descsComposite.setLayout(new GridLayout(2, false));
-		descsComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		label = new Label(descsComposite, SWT.NONE);
-		label.setText(Messages.SMOARMLaunchConfigurationDynamicTab_NativeSpec);
-		label.setLayoutData(new GridData());
-
-		jobNativeSpecification = new Text(descsComposite, SWT.MULTI | SWT.BORDER);
-		gridData = new GridData(GridData.FILL_BOTH);
-		gridData.minimumHeight = jobNativeSpecification.getLineHeight();
-		jobNativeSpecification.setLayoutData(gridData);
-
-	}
-
-	/**
-	 * Passes all attributes from ILaunchConfiguration to the proper launch
-	 * filtering only those returned by SMOAJobAttributes.getLaunchAttributes()
-	 * method
-	 */
-	@SuppressWarnings("unchecked")
-	public IAttribute<?, ?, ?>[] getAttributes(IResourceManager rm, IPQueue queue, ILaunchConfiguration configuration, String mode)
-			throws CoreException {
-		final Map<String, IAttribute<?, ?, ?>> launchAttributes = new HashMap<String, IAttribute<?, ?, ?>>();
-
-		final Map<?, ?> configurationAttributes = configuration.getAttributes();
-
-		final Map<String, IAttributeDefinition<?, ?, ?>> possibleAttributesMap = SMOAJobAttributes.getLaunchAttributes();
-		try {
-			for (final Object name : configurationAttributes.entrySet()) {
-				final Entry<?, ?> entry = (Entry<?, ?>) name;
-
-				final Object value = entry.getValue();
-				final IAttributeDefinition<?, ?, ?> definition = possibleAttributesMap.get(entry.getKey());
-
-				if (definition != null && value != null) {
-					if (definition instanceof ArrayAttributeDefinition<?>) {
-						// ArrayAttributeDefinition
-						assert value instanceof java.util.List<?>;
-						final java.util.List<String> list = (java.util.List<String>) value;
-						final ArrayAttributeDefinition<String> arrayDef = (ArrayAttributeDefinition<String>) definition;
-
-						final ArrayAttribute<String> attribute = arrayDef.create(list.toArray(new String[list.size()]));
-						launchAttributes.put(entry.getKey().toString(), attribute);
-					} else if (definition instanceof StringMapAttributeDefinition) {
-						// StringMapAttributeDefinition
-						if (value instanceof Map<?, ?>) {
-							final Map<String, String> map = (Map<String, String>) entry.getValue();
-							final StringMapAttribute attribute = ((StringMapAttributeDefinition) definition).create(map);
-							launchAttributes.put(entry.getKey().toString(), attribute);
-						} else {
-							throw new IllegalValueException("Bad format of some map attr"); //$NON-NLS-1$
-						}
-					} else {
-						// Others
-						launchAttributes.put(entry.getKey().toString(), definition.create(value.toString()));
-					}
-				}
-			}
-		} catch (final IllegalValueException e) {
-			throw new CoreException(new Status(IStatus.WARNING, SMOAUIPlugin.PLUGIN_ID, "getAttributes", e)); //$NON-NLS-1$
-		}
-
-		return launchAttributes.values().toArray(new IAttribute<?, ?, ?>[launchAttributes.size()]);
-	}
-
-	public Control getControl() {
-		return control;
-	}
-
-	public RMLaunchValidation initializeFrom(Control control, IResourceManager rm, IPQueue ipqueue,
-			ILaunchConfiguration configuration) {
-		boolean success = false;
-		String message = null;
-
-		success = true;
-
-		// We get machine names and sum of processor counts
-		int maxCpuCount = 0;
-
-		final IPResourceManager rmp = (IPResourceManager) rm.getAdapter(IPResourceManager.class);
-		final IPMachine[] machines = rmp.getMachines();
-		if (machines != null && machines.length > 0) {
-			final IPMachine machine = machines[0];
-			for (final IPNode node : machine.getNodes()) {
-				machinesAll.add(node.getName());
-				final IntegerAttribute cpuCountAttribute = node.getAttribute(SMOANodeAttributes.getCpuCountDef());
-				if (cpuCountAttribute != null) {
-					final Integer cpusOnNode = cpuCountAttribute.getValue();
-					if (cpusOnNode != null) {
-						maxCpuCount += cpusOnNode;
-					}
-				}
-			}
-		}
-
-		final java.util.List<String> apps = new Vector<String>();
-		if (rm instanceof SMOAResourceManager && ((SMOAResourceManager) rm).getConfiguration() instanceof SMOAConfiguration) {
-			final SMOAConfiguration conf = (SMOAConfiguration) ((SMOAResourceManager) rm).getConfiguration();
-			for (final String app : conf.getAvailableAppList()) {
-				if (app.matches(APP_REGEX)) {
-					apps.add(app);
-				}
-			}
-		}
-		apps.add(SMOAJobAttributes.NO_WRAPPER_SCRIPT);
-		Collections.sort(apps);
-		application.setItems(apps.toArray(new String[apps.size()]));
-		application.select(application.indexOf(SMOAJobAttributes.NO_WRAPPER_SCRIPT));
-
-		if (maxCpuCount == 0) {
-			maxCpuCount = 1;
-		}
-
-		minCPUs.setMinimum(1);
-		maxCPUs.setMinimum(1);
-		minCPUs.setMaximum(maxCpuCount);
-		maxCPUs.setMaximum(maxCpuCount);
-
-		minCPUs.setSelection(1);
-		maxCPUs.setSelection(maxCpuCount);
-
-		minCPUs.setEnabled(false);
-		maxCPUs.setEnabled(false);
-
-		cboxMin.setSelection(false);
-		cboxMax.setSelection(false);
-
-		try {
-			final Map<?, ?> confAttributes = configuration.getAttributes();
-
-			final String nameEntry = (String) confAttributes.get(ElementAttributes.getNameAttributeDefinition().getId());
-			if (nameEntry != null) {
-				jobName.setText(nameEntry);
-			}
-
-			final String appEntry = (String) confAttributes.get(SMOAJobAttributes.getAppNameDef().getId());
-			if (appEntry != null) {
-				if (application.indexOf(appEntry) != -1) {
-					application.select(application.indexOf(appEntry));
-				}
-			}
-
-			final Boolean b = (Boolean) confAttributes.get(SMOAJobAttributes.getMakeDef().getId());
-			if (b != null) {
-				cboxMake.setSelection(b);
-				if (b) {
-					cboxCustomMake.setEnabled(true);
-				}
-			}
-
-			final Boolean c = (Boolean) confAttributes.get(SMOAJobAttributes.getIfCustomMakeDef().getId());
-			if (c != null) {
-				cboxCustomMake.setSelection(c);
-			}
-			{
-				if (b != null && b && c) {
-					customMake.setEnabled(true);
-				}
-			}
-
-			final String makeCmdEntry = (String) confAttributes.get(SMOAJobAttributes.getCustomMakeCommandDef().getId());
-			if (makeCmdEntry != null) {
-				customMake.setText(makeCmdEntry);
-			}
-
-			final String queueEntry = (String) confAttributes.get(SMOAJobAttributes.getQueueNameDef().getId());
-			if (queueEntry != null) {
-				queue.setText(queueEntry);
-			}
-
-			final Integer minEntry = (Integer) confAttributes.get(SMOAJobAttributes.getMinCpuDef().getId());
-			if (minEntry != null) {
-				minCPUs.setSelection(minEntry);
-				cboxMin.setSelection(true);
-				minCPUs.setEnabled(true);
-			}
-
-			final Integer maxEntry = (Integer) confAttributes.get(SMOAJobAttributes.getMaxCpuDef().getId());
-			if (maxEntry != null) {
-				maxCPUs.setSelection(maxEntry);
-				cboxMax.setSelection(true);
-				maxCPUs.setEnabled(true);
-			}
-
-			final String descEntry = (String) confAttributes.get(SMOAJobAttributes.getDescDef().getId());
-			if (descEntry != null) {
-				jobDescription.setText(descEntry);
-			}
-
-			final String nativeEntry = (String) confAttributes.get(SMOAJobAttributes.getNativeSpecDef().getId());
-			if (nativeEntry != null) {
-				jobNativeSpecification.setText(nativeEntry);
-			}
-
-			@SuppressWarnings("unchecked")
-			final java.util.List<String> prefEntry = (java.util.List<String>) confAttributes.get(SMOAJobAttributes
-					.getPrefferedDef().getId());
-			if (prefEntry != null) {
-				for (final String string : prefEntry) {
-					machinesPreferred.add(string);
-				}
-			}
-
-		} catch (final CoreException e) {
-			e.printStackTrace();
-			success = false;
-			message = e.getMessage();
-		}
-
-		prepareListeners(control, rm, ipqueue, configuration);
-
-		return new RMLaunchValidation(success, message);
-	}
-
-	public RMLaunchValidation isValid(ILaunchConfiguration launchConfig, IResourceManager rm, IPQueue queue) {
-
-		final boolean isCustomCommandValid = !(customMake.isEnabled() && customMake.getText().isEmpty());
-
-		return new RMLaunchValidation(isCustomCommandValid, isCustomCommandValid ? null
-				: Messages.SMOARMLaunchConfigurationDynamicTab_CustomMakeIsEmptyError);
-	}
-
-	/**
-	 * Called by each context change, tab change and by initialization (after
-	 * initializeForm).
-	 */
-	public RMLaunchValidation performApply(ILaunchConfigurationWorkingCopy configuration, IResourceManager rm, IPQueue ipqueue) {
-
-		configuration.setAttribute(ElementAttributes.getNameAttributeDefinition().getId(), jobName.getText());
-
-		configuration.setAttribute(SMOAJobAttributes.getDescDef().getId(), jobDescription.getText());
-
-		configuration.setAttribute(SMOAJobAttributes.getQueueNameDef().getId(), queue.getText());
-
-		configuration.setAttribute(SMOAJobAttributes.getAppNameDef().getId(), application.getItem(application.getSelectionIndex()));
-
-		configuration.setAttribute(SMOAJobAttributes.getMakeDef().getId(), cboxMake.getSelection());
-
-		configuration.setAttribute(SMOAJobAttributes.getIfCustomMakeDef().getId(), cboxCustomMake.getSelection());
-
-		configuration.setAttribute(SMOAJobAttributes.getCustomMakeCommandDef().getId(), customMake.getText());
-
-		if (cboxMin.getSelection()) {
-			configuration.setAttribute(SMOAJobAttributes.getMinCpuDef().getId(), minCPUs.getSelection());
-		} else {
-			configuration.removeAttribute(SMOAJobAttributes.getMinCpuDef().getId());
-		}
-
-		if (cboxMax.getSelection()) {
-			configuration.setAttribute(SMOAJobAttributes.getMaxCpuDef().getId(), maxCPUs.getSelection());
-		} else {
-			configuration.removeAttribute(SMOAJobAttributes.getMaxCpuDef().getId());
-		}
-
-		configuration.setAttribute(SMOAJobAttributes.getNativeSpecDef().getId(), jobNativeSpecification.getText());
-		final Vector<String> pref = new Vector<String>();
-		for (final String s : machinesPreferred.getItems()) {
-			pref.add(s);
-		}
-		configuration.setAttribute(SMOAJobAttributes.getPrefferedDef().getId(), pref);
-
-		return new RMLaunchValidation(true, null);
-	}
-
-	private void prepareListeners(Control c, final IResourceManager rm, IPQueue ipqueue, final ILaunchConfiguration configuration) {
-		jobName.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent arg0) {
-				fireContentsChanged();
-			}
-		});
-
-		jobDescription.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent arg0) {
-				fireContentsChanged();
-			}
-		});
-
-		jobNativeSpecification.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent arg0) {
-				fireContentsChanged();
-			}
-		});
-
-		minCPUs.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent arg0) {
-				if (minCPUs.getSelection() > maxCPUs.getSelection()) {
-					final int swap = maxCPUs.getSelection();
-					maxCPUs.setSelection(minCPUs.getSelection());
-					minCPUs.setSelection(swap);
-				}
-				fireContentsChanged();
-			}
-		});
-
-		maxCPUs.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent arg0) {
-				if (minCPUs.getSelection() > maxCPUs.getSelection()) {
-					final int swap = maxCPUs.getSelection();
-					maxCPUs.setSelection(minCPUs.getSelection());
-					minCPUs.setSelection(swap);
-				}
-				fireContentsChanged();
-			}
-		});
-
-		machinesAll.addMouseListener(new MouseListener() {
-			public void mouseDoubleClick(MouseEvent arg0) {
-				for (final String s : machinesAll.getSelection()) {
-					if (machinesPreferred.indexOf(s) == -1) {
-						machinesPreferred.add(s);
-					}
-				}
-				fireContentsChanged();
-			}
-
-			public void mouseDown(MouseEvent arg0) {
-			}
-
-			public void mouseUp(MouseEvent arg0) {
-			}
-		});
-
-		machinesPreferred.addMouseListener(new MouseListener() {
-			public void mouseDoubleClick(MouseEvent arg0) {
-				machinesPreferred.remove(machinesPreferred.getSelectionIndices());
-				fireContentsChanged();
-			}
-
-			public void mouseDown(MouseEvent arg0) {
-			}
-
-			public void mouseUp(MouseEvent arg0) {
-			}
-		});
-
-		cboxMin.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				minCPUs.setEnabled(cboxMin.getSelection());
-				fireContentsChanged();
-			}
-		});
-
-		cboxMax.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				maxCPUs.setEnabled(cboxMax.getSelection());
-				fireContentsChanged();
-			}
-		});
-
-		queue.addModifyListener(new ModifyListener() {
-
-			public void modifyText(ModifyEvent arg0) {
-				fireContentsChanged();
-			}
-		});
-
-		cboxMake.addSelectionListener(new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				cboxCustomMake.setEnabled(cboxMake.getSelection());
-				customMake.setEnabled(cboxMake.getSelection() && cboxCustomMake.getSelection());
-				fireContentsChanged();
-			}
-		});
-
-		cboxCustomMake.addSelectionListener(new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				customMake.setEnabled(cboxMake.getSelection() && cboxCustomMake.getSelection());
-				fireContentsChanged();
-			}
-		});
-
-		customMake.addModifyListener(new ModifyListener() {
-
-			public void modifyText(ModifyEvent arg0) {
-				fireContentsChanged();
-			}
-		});
-
-		application.addSelectionListener(new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-				widgetSelected(arg0);
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				fireContentsChanged();
-			}
-		});
-	}
-
-	/**
-	 * Called only by creating a new Launch
-	 */
-	public RMLaunchValidation setDefaults(ILaunchConfigurationWorkingCopy configuration, IResourceManager rm, IPQueue queue) {
-
-		configuration.setAttribute(ElementAttributes.getNameAttributeDefinition().getId(), ""); //$NON-NLS-1$
-
-		configuration.removeAttribute(JobAttributes.getWorkingDirectoryAttributeDefinition().getId());
-
-		return new RMLaunchValidation(true, null);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/launch/SMOARMLaunchConfigurationFactory.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/launch/SMOARMLaunchConfigurationFactory.java
deleted file mode 100644
index 7f66ae4..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/launch/SMOARMLaunchConfigurationFactory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.launch;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.ptp.launch.ui.extensions.AbstractRMLaunchConfigurationFactory;
-import org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab;
-import org.eclipse.ptp.rm.smoa.core.rmsystem.SMOAResourceManager;
-import org.eclipse.ptp.rmsystem.IResourceManager;
-
-/**
- * Part of an extension of PTP plug-in. Shows where to take launch tab from.
- */
-public class SMOARMLaunchConfigurationFactory extends AbstractRMLaunchConfigurationFactory {
-
-	@Override
-	protected IRMLaunchConfigurationDynamicTab doCreate(IResourceManager rm, ILaunchConfigurationDialog dialog)
-			throws CoreException {
-		return new SMOARMLaunchConfigurationDynamicTab(rm, dialog);
-	}
-
-	@Override
-	public Class<? extends IResourceManager> getResourceManagerClass() {
-		return SMOAResourceManager.class;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/launch/messages.properties b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/launch/messages.properties
deleted file mode 100644
index b9063cc..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/launch/messages.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-SMOARMLaunchConfigurationDynamicTab_AllMachines=All machines
-SMOARMLaunchConfigurationDynamicTab_APP_REGEX=.*[pP][tT][pP].*
-SMOARMLaunchConfigurationDynamicTab_CpuCountBounds=CPU count bounds
-SMOARMLaunchConfigurationDynamicTab_CustomMakeCommand=Custom make command:
-SMOARMLaunchConfigurationDynamicTab_CustomMakeIsEmptyError=Custom make command may not be empty
-SMOARMLaunchConfigurationDynamicTab_Description=Description
-SMOARMLaunchConfigurationDynamicTab_MaxCpuCount=Maximum CPU count
-SMOARMLaunchConfigurationDynamicTab_MinCpuCount=Minimum CPU count
-SMOARMLaunchConfigurationDynamicTab_Name=Name
-SMOARMLaunchConfigurationDynamicTab_NativeSpec=Native Spec.
-SMOARMLaunchConfigurationDynamicTab_PreferredMachines=Preferred machines
-SMOARMLaunchConfigurationDynamicTab_QueueName=Queue name
-SMOARMLaunchConfigurationDynamicTab_RunMake=Run 'make' before run
-SMOARMLaunchConfigurationDynamicTab_WrapperScript=Wrapper script
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/preferences/Messages.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/preferences/Messages.java
deleted file mode 100644
index ad1ff74..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/preferences/Messages.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.preferences;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rm.smoa.ui.preferences.messages"; //$NON-NLS-1$
-	public static String SMOAPreferencePage_OutputPooling;
-	public static String SMOAPreferencePage_TaskPooling;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/preferences/SMOAPreferencePage.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/preferences/SMOAPreferencePage.java
deleted file mode 100644
index 5f6f9ba..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/preferences/SMOAPreferencePage.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.preferences;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.ptp.rm.smoa.core.rmsystem.PoolingIntervalsAndStatic;
-import org.eclipse.ptp.rm.smoa.ui.SMOAUIPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Spinner;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * Represents preferences page for SMOA Computing plug-in.
- * 
- * Currently only pooling intervals are set up here.
- */
-public class SMOAPreferencePage extends PreferencePage implements
-		IWorkbenchPreferencePage {
-
-	private Composite parent;
-	private Spinner taskInterval;
-	private Spinner outInterval;
-
-	public SMOAPreferencePage() {
-	}
-
-	@Override
-	protected Control createContents(Composite arg0) {
-		parent = new Composite(arg0, SWT.NONE);
-
-		final GridLayout layout = new GridLayout(2, false);
-		parent.setLayout(layout);
-
-		final IPreferenceStore store = SMOAUIPlugin.getDefault().getPreferenceStore();
-
-		// Task
-		Label label = new Label(parent, SWT.NONE);
-		label.setText(Messages.SMOAPreferencePage_TaskPooling);
-		label.setLayoutData(new GridData());
-
-		taskInterval = new Spinner(parent, SWT.BORDER);
-		taskInterval.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		int taskCheck = store.getInt(SMOAUIPlugin.KEY_INTERVAL_TASK);
-		if (taskCheck < 100) {
-			taskCheck = doGetPreferenceStore().getDefaultInt(
-					SMOAUIPlugin.KEY_INTERVAL_TASK);
-		}
-
-		taskInterval.setValues(taskCheck, 100, 3600000, 3, 1000, 10000);
-
-		// out
-		label = new Label(parent, SWT.NONE);
-		label.setText(Messages.SMOAPreferencePage_OutputPooling);
-		label.setLayoutData(new GridData());
-
-		outInterval = new Spinner(parent, SWT.BORDER);
-		outInterval.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		int outCheck = store.getInt(SMOAUIPlugin.KEY_INTERVAL_OUT);
-		if (outCheck < 100) {
-			outCheck = doGetPreferenceStore().getDefaultInt(
-					SMOAUIPlugin.KEY_INTERVAL_OUT);
-		}
-
-		outInterval.setValues(outCheck, 100, 3600000, 3, 1000, 10000);
-
-		return parent;
-	}
-
-	@Override
-	protected IPreferenceStore doGetPreferenceStore() {
-		return SMOAUIPlugin.getDefault().getPreferenceStore();
-	}
-
-	public void init(IWorkbench arg0) {
-
-		doGetPreferenceStore().setDefault(SMOAUIPlugin.KEY_INTERVAL_TASK,
-				PoolingIntervalsAndStatic.DEFAULT_POOLING_STATE);
-		doGetPreferenceStore().setDefault(SMOAUIPlugin.KEY_INTERVAL_OUT,
-				PoolingIntervalsAndStatic.DEFAULT_POOLING_OUT);
-	}
-
-	@Override
-	public boolean performOk() {
-		final IPreferenceStore preferenceStore = doGetPreferenceStore();
-		preferenceStore.setValue(SMOAUIPlugin.KEY_INTERVAL_TASK,
-				taskInterval.getSelection());
-		preferenceStore.setValue(SMOAUIPlugin.KEY_INTERVAL_OUT,
-				outInterval.getSelection());
-
-		PoolingIntervalsAndStatic.setPoolingIntervalTask(taskInterval.getSelection());
-		PoolingIntervalsAndStatic.setPoolingIntervalOut(outInterval.getSelection());
-
-		return true;
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/preferences/messages.properties b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/preferences/messages.properties
deleted file mode 100644
index a4ceff4..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/preferences/messages.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-SMOAPreferencePage_OutputPooling=Output pooling interval [s]:
-SMOAPreferencePage_TaskPooling=Task status pooling interval [s]:
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/rservices/SMOAUIConnectionManager.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/rservices/SMOAUIConnectionManager.java
deleted file mode 100644
index 7cd94a2..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/rservices/SMOAUIConnectionManager.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.rservices;
-
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.ui.IRemoteUIConnectionManager;
-import org.eclipse.swt.widgets.Shell;
-
-public class SMOAUIConnectionManager implements IRemoteUIConnectionManager {
-
-	public IRemoteConnection newConnection(Shell shell) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public IRemoteConnection newConnection(Shell shell, String[] attrHints, String[] attrHintValues) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public void openConnectionWithProgress(Shell shell, IRunnableContext context, IRemoteConnection connection) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void updateConnection(Shell shell, IRemoteConnection connection) {
-		// TODO Auto-generated method stub
-
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/rservices/SMOAUIFileManager.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/rservices/SMOAUIFileManager.java
deleted file mode 100644
index a72a76d..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/rservices/SMOAUIFileManager.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.rservices;
-
-import org.eclipse.jface.window.Window;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.ui.IRemoteUIFileManager;
-import org.eclipse.ptp.remote.ui.dialogs.RemoteResourceBrowser;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * GUI control allowing file browsing, selecting a single/multiple
- * file/directory.
- * 
- * Current implementation does not provide selecting connection.
- */
-public class SMOAUIFileManager implements IRemoteUIFileManager {
-	private IRemoteServices services = null;
-	private IRemoteConnection connection = null;
-	private boolean showConnections = false;
-
-	public SMOAUIFileManager(IRemoteServices services) {
-		this.services = services;
-	}
-
-	public String browseDirectory(Shell shell, String message,
-			String filterPath, int flags) {
-		final RemoteResourceBrowser browser = new RemoteResourceBrowser(services,
-				connection, shell, RemoteResourceBrowser.SINGLE);
-		browser.setType(RemoteResourceBrowser.DIRECTORY_BROWSER);
-		browser.setInitialPath(filterPath);
-		browser.showConnections(showConnections);
-		if (browser.open() == Window.CANCEL) {
-			return null;
-		}
-		connection = browser.getConnection();
-		final String path = browser.getPath();
-		if (path == null) {
-			return null;
-		}
-		return path;
-	}
-
-	public String browseFile(Shell shell, String message, String filterPath,
-			int flags) {
-		final RemoteResourceBrowser browser = new RemoteResourceBrowser(services,
-				connection, shell, RemoteResourceBrowser.SINGLE);
-		browser.setType(RemoteResourceBrowser.FILE_BROWSER);
-		browser.setInitialPath(filterPath);
-		browser.showConnections(showConnections);
-		if (browser.open() == Window.CANCEL) {
-			return null;
-		}
-		connection = browser.getConnection();
-		final String path = browser.getPath();
-		if (path == null) {
-			return null;
-		}
-		return path;
-	}
-
-	public String[] browseFiles(Shell shell, String message, String filterPath,
-			int flags) {
-		final RemoteResourceBrowser browser = new RemoteResourceBrowser(services,
-				connection, shell, RemoteResourceBrowser.MULTI);
-		browser.setType(RemoteResourceBrowser.FILE_BROWSER);
-		browser.setInitialPath(filterPath);
-		browser.showConnections(showConnections);
-		if (browser.open() == Window.CANCEL) {
-			return null;
-		}
-		connection = browser.getConnection();
-		final String path[] = browser.getPaths();
-		if (path == null) {
-			return null;
-		}
-		return path;
-	}
-
-	public IRemoteConnection getConnection() {
-		return connection;
-	}
-
-	public void setConnection(IRemoteConnection connection) {
-		this.connection = connection;
-	}
-
-	public void showConnections(boolean enable) {
-		showConnections = enable;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/rservices/SMOAUIServices.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/rservices/SMOAUIServices.java
deleted file mode 100644
index 3c5e56c..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/rservices/SMOAUIServices.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.rservices;
-
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.ui.IRemoteUIConnectionManager;
-import org.eclipse.ptp.remote.ui.IRemoteUIFileManager;
-import org.eclipse.ptp.remote.ui.IRemoteUIServices;
-import org.eclipse.ptp.rm.smoa.core.rservices.SMOARemoteServices;
-
-/**
- * Extends PTP for providing GUI access to {@link SMOARemoteServices}.
- */
-public class SMOAUIServices implements IRemoteUIServices {
-
-	static private SMOAUIServices instance;
-
-	public static SMOAUIServices getInstance(IRemoteServices services) {
-		if (instance == null) {
-			instance = new SMOAUIServices(services);
-		}
-		return instance;
-	}
-
-	private final IRemoteServices remoteServices;
-
-	public SMOAUIServices(IRemoteServices services) {
-		remoteServices = services;
-	}
-
-	public String getId() {
-		return remoteServices.getId();
-	}
-
-	public String getName() {
-		return remoteServices.getName();
-	}
-
-	public IRemoteUIConnectionManager getUIConnectionManager() {
-		return new SMOAUIConnectionManager();
-	}
-
-	public IRemoteUIFileManager getUIFileManager() {
-		return new SMOAUIFileManager(remoteServices);
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/rservices/SMOAUIServicesFactory.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/rservices/SMOAUIServicesFactory.java
deleted file mode 100644
index 82061f2..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/rservices/SMOAUIServicesFactory.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.rservices;
-
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.ui.IRemoteUIServices;
-import org.eclipse.ptp.remote.ui.IRemoteUIServicesFactory;
-
-/**
- * Part of extension, creates {@link SMOAUIServices} on demand.
- */
-public class SMOAUIServicesFactory implements IRemoteUIServicesFactory {
-
-	public IRemoteUIServices getServices(IRemoteServices services) {
-		return SMOAUIServices.getInstance(services);
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/Messages.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/Messages.java
deleted file mode 100644
index cbf6ca7..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/Messages.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.wizards;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rm.smoa.ui.wizards.messages"; //$NON-NLS-1$
-	public static String SMOAResourceManagerConfigurationWizardPage_AuthTypeAnonymous;
-	public static String SMOAResourceManagerConfigurationWizardPage_AuthTypeGSI;
-	public static String SMOAResourceManagerConfigurationWizardPage_AuthTypeUserTokenProfile;
-	public static String SMOAResourceManagerConfigurationWizardPage_Browse;
-	public static String SMOAResourceManagerConfigurationWizardPage_CaCert;
-	public static String SMOAResourceManagerConfigurationWizardPage_ChooseAuthenticationType;
-	public static String SMOAResourceManagerConfigurationWizardPage_Hostname;
-	public static String SMOAResourceManagerConfigurationWizardPage_Password;
-	public static String SMOAResourceManagerConfigurationWizardPage_Port;
-	public static String SMOAResourceManagerConfigurationWizardPage_SecureStorageError;
-	public static String SMOAResourceManagerConfigurationWizardPage_ServiceDN;
-	public static String SMOAResourceManagerConfigurationWizardPage_SmoaComputingConfiguration;
-	public static String SMOAResourceManagerConfigurationWizardPage_SmoaComputingConfiguration_description;
-	public static String SMOAResourceManagerConfigurationWizardPage_Username;
-	public static String SMOAResourceManagerFileServicesPage_ChooseFileTransferMethods;
-	public static String SMOAResourceManagerFileServicesPage_Connection;
-	public static String SMOAResourceManagerFileServicesPage_FileServicesChoice;
-	public static String SMOAResourceManagerFileServicesPage_FileServicesChoice_description;
-	public static String SMOAResourceManagerFileServicesPage_New;
-	public static String SMOAResourceManagerFileServicesPage_RemoteServices;
-	public static String SMOAResourceManagerFileServicesPage_TextForChoosingAdditionalSsh;
-	public static String SMOAResourceManagerFileServicesPage_TextForChoosingSmoaOnly;
-	public static String SMOAResourceManagerFileServicesPage_WarningAboutUsingSmoaOnly;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/SMOARMConfigurationWizardPageFactory.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/SMOARMConfigurationWizardPageFactory.java
deleted file mode 100644
index 704a0a4..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/SMOARMConfigurationWizardPageFactory.java
+++ /dev/null
@@ -1,36 +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.rm.smoa.ui.wizards;
-
-import org.eclipse.ptp.ui.wizards.IRMConfigurationWizard;
-import org.eclipse.ptp.ui.wizards.RMConfigurationWizardPage;
-import org.eclipse.ptp.ui.wizards.RMConfigurationWizardPageFactory;
-
-public class SMOARMConfigurationWizardPageFactory extends RMConfigurationWizardPageFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.ui.wizards.RMConfigurationWizardPageFactory#getPages(
-	 * org.eclipse.ptp.ui.wizards.IRMConfigurationWizard)
-	 */
-	@Override
-	public RMConfigurationWizardPage[] getPages(IRMConfigurationWizard wizard) {
-		RMConfigurationWizardPage wizardPages[];
-
-		wizardPages = new RMConfigurationWizardPage[2];
-		wizardPages[0] = new SMOAResourceManagerConfigurationWizardPage(wizard);
-		wizardPages[1] = new SMOAResourceManagerFileServicesPage(wizard);
-		return wizardPages;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/SMOAResourceManagerConfigurationWizardPage.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/SMOAResourceManagerConfigurationWizardPage.java
deleted file mode 100644
index 04aeaaa..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/SMOAResourceManagerConfigurationWizardPage.java
+++ /dev/null
@@ -1,465 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.wizards;
-
-import java.io.File;
-
-import org.eclipse.equinox.security.storage.StorageException;
-import org.eclipse.ptp.rm.smoa.core.SMOAConfiguration.AuthType;
-import org.eclipse.ptp.rm.smoa.core.rmsystem.SMOAResourceManager;
-import org.eclipse.ptp.rm.smoa.core.rmsystem.SMOAResourceManagerConfiguration;
-import org.eclipse.ptp.ui.wizards.IRMConfigurationWizard;
-import org.eclipse.ptp.ui.wizards.RMConfigurationWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Spinner;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * GUI for configuring {@link SMOAResourceManager} (or rather:
- * {@link SMOAResourceManagerConfiguration}).
- * 
- * Is part of the new Resource Manager wizard, pointed by
- * {@link SMOAProviderContributor}.
- */
-public class SMOAResourceManagerConfigurationWizardPage extends RMConfigurationWizardPage {
-
-	private final SMOAResourceManagerConfiguration conf;
-
-	// GUI elements
-
-	// main part
-	private Text host;
-	private Spinner port;
-
-	// selecting authentication
-	private Button anonymous;
-	private Button username;
-	private Button gsiauth;
-
-	// adaptive GUI
-	private Composite userData;
-	private StackLayout stackLayout;
-
-	// adaptive GUI composites
-	private Composite anonymousTab;
-	private Composite userpasswdTab;
-	private Composite gsiTab;
-
-	// contents of userpasswdTab
-	private Text user;
-	private Text passwd;
-	private Text cacert;
-	private Text dn;
-
-	// contents of gsiTab
-	private Text gsi_dn;
-
-	AuthType previousAuth = null;
-
-	public SMOAResourceManagerConfigurationWizardPage(IRMConfigurationWizard wizard) {
-		super(wizard, Messages.SMOAResourceManagerConfigurationWizardPage_SmoaComputingConfiguration);
-		setTitle(Messages.SMOAResourceManagerConfigurationWizardPage_SmoaComputingConfiguration);
-		setDescription(Messages.SMOAResourceManagerConfigurationWizardPage_SmoaComputingConfiguration_description);
-		conf = (SMOAResourceManagerConfiguration) wizard.getBaseConfiguration();
-	}
-
-	/** Host and port part */
-	private void createAddress(Composite parent) {
-
-		final Composite myMainComp = new Composite(parent, SWT.NONE);
-
-		final GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		gridLayout.marginWidth = 0;
-
-		final GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		myMainComp.setLayoutData(gd);
-
-		myMainComp.setLayout(gridLayout);
-
-		Label label;
-		// URI
-
-		label = new Label(myMainComp, SWT.NONE);
-		label.setText(Messages.SMOAResourceManagerConfigurationWizardPage_Hostname);
-		label.setLayoutData(new GridData());
-
-		host = new Text(myMainComp, SWT.SINGLE | SWT.BORDER);
-		if (conf.getUrl() != null) {
-			host.setText(conf.getUrl());
-		}
-		host.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		host.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent arg0) {
-				setPageComplete(isValid());
-				conf.setUrl(host.getText());
-			}
-		});
-
-		// PORT
-
-		label = new Label(myMainComp, SWT.NONE);
-		label.setText(Messages.SMOAResourceManagerConfigurationWizardPage_Port);
-		label.setLayoutData(new GridData());
-
-		port = new Spinner(myMainComp, SWT.SINGLE | SWT.BORDER);
-		port.setMaximum(65535);
-		port.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		port.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent arg0) {
-				final int portNo = Integer.parseInt(port.getText());
-				assert portNo >= 0 && portNo < 65536 : "Java spinner violates boundaries"; //$NON-NLS-1$
-				conf.setPort(portNo);
-			}
-		});
-		if (conf.getPort() != null) {
-			port.setSelection(conf.getPort());
-		} else {
-			port.setSelection(19000);
-		}
-	}
-
-	/** Anonymous authentication part */
-	private Composite createAnonymous(Composite topComposite) {
-		return new Composite(topComposite, SWT.NONE);
-	}
-
-	private void createContents(Composite parent) {
-
-		final GridLayout mainLayout = new GridLayout();
-		mainLayout.numColumns = 1;
-		mainLayout.marginWidth = 0;
-
-		parent.setLayout(mainLayout);
-
-		createAddress(parent);
-
-		new Label(parent, SWT.NONE).setLayoutData(new GridData());
-
-		createUserData(parent);
-	}
-
-	@Override
-	public void createControl(Composite parent) {
-		final Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout());
-		createContents(composite);
-		setControl(composite);
-		setPageComplete(isValid());
-	}
-
-	/** GSI authentication part */
-	private Composite createGSI(Composite topComposite) {
-
-		final Composite c = new Composite(topComposite, SWT.NONE);
-		c.setLayout(new GridLayout(2, false));
-
-		new Label(c, SWT.NONE).setText(Messages.SMOAResourceManagerConfigurationWizardPage_ServiceDN);
-
-		gsi_dn = new Text(c, SWT.SINGLE | SWT.BORDER);
-		if (conf.getServiceDN() != null) {
-			gsi_dn.setText(conf.getServiceDN());
-		}
-		gsi_dn.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		gsi_dn.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent arg0) {
-				if (!dn.getText().equals(gsi_dn.getText())) {
-					dn.setText(gsi_dn.getText());
-				}
-			}
-		});
-
-		return c;
-	}
-
-	/** Authentication selection part */
-	private void createUserData(Composite mainComp) {
-
-		final Composite authType = new Composite(mainComp, SWT.NONE);
-		final GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 3;
-		authType.setLayout(gridLayout);
-
-		final GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 3;
-		authType.setLayoutData(gd);
-
-		final Label l = new Label(authType, SWT.NONE);
-		l.setText(Messages.SMOAResourceManagerConfigurationWizardPage_ChooseAuthenticationType);
-		final GridData gridData = new GridData(GridData.CENTER);
-		gridData.horizontalSpan = 3;
-		l.setLayoutData(gridData);
-
-		anonymous = new Button(authType, SWT.RADIO);
-		anonymous.setText(Messages.SMOAResourceManagerConfigurationWizardPage_AuthTypeAnonymous);
-		anonymous.setLayoutData(new GridData());
-
-		username = new Button(authType, SWT.RADIO);
-		username.setText(Messages.SMOAResourceManagerConfigurationWizardPage_AuthTypeUserTokenProfile);
-		username.setLayoutData(new GridData());
-
-		gsiauth = new Button(authType, SWT.RADIO);
-		gsiauth.setText(Messages.SMOAResourceManagerConfigurationWizardPage_AuthTypeGSI);
-		gsiauth.setLayoutData(new GridData());
-
-		// ///////
-
-		userData = new Composite(mainComp, SWT.NONE);
-		userData.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		stackLayout = new StackLayout();
-		userData.setLayout(stackLayout);
-
-		anonymousTab = createAnonymous(userData);
-		userpasswdTab = createUserPassword(userData);
-		gsiTab = createGSI(userData);
-
-		userData.layout();
-
-		previousAuth = conf.getAuthType();
-		switch (previousAuth) {
-		case Anonymous:
-			anonymous.setSelection(true);
-			toggleUsernamePassword();
-			break;
-		case UsernamePassword:
-			username.setSelection(true);
-			toggleUsernamePassword();
-			break;
-		case GSI:
-			gsiauth.setSelection(true);
-			toggleUsernamePassword();
-			break;
-		}
-
-		anonymous.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-				widgetSelected(arg0);
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				setPageComplete(isValid());
-				toggleUsernamePassword();
-			}
-		});
-
-		username.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-				widgetSelected(arg0);
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				setPageComplete(isValid());
-				toggleUsernamePassword();
-			}
-		});
-
-		gsiauth.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-				widgetSelected(arg0);
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				setPageComplete(isValid());
-				toggleUsernamePassword();
-			}
-		});
-
-	}
-
-	/** User name & password + certificate authentication part */
-	private Composite createUserPassword(Composite topComposite) {
-		GridData gridData;
-		Label l;
-
-		final Composite userPassword = new Composite(topComposite, SWT.NONE);
-
-		userPassword.setLayout(new GridLayout(3, false));
-
-		final GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
-		gd2.horizontalSpan = 2;
-		userPassword.setLayoutData(gd2);
-
-		// User name
-
-		final Label userLabel = new Label(userPassword, SWT.NONE);
-		userLabel.setText(Messages.SMOAResourceManagerConfigurationWizardPage_Username);
-		userLabel.setLayoutData(new GridData());
-
-		user = new Text(userPassword, SWT.SINGLE | SWT.BORDER);
-		if (conf.getUser() != null) {
-			user.setText(conf.getUser());
-		}
-		gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		user.setLayoutData(gridData);
-
-		user.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent arg0) {
-				setPageComplete(isValid());
-				conf.setUser(user.getText());
-			}
-		});
-
-		// Password
-
-		final Label passwdLabel = new Label(userPassword, SWT.NONE);
-		passwdLabel.setText(Messages.SMOAResourceManagerConfigurationWizardPage_Password);
-		passwdLabel.setLayoutData(new GridData());
-
-		passwd = new Text(userPassword, SWT.SINGLE | SWT.BORDER | SWT.PASSWORD);
-		if (conf.getPassword() != null) {
-			passwd.setText(conf.getPassword());
-		}
-		gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		passwd.setLayoutData(gridData);
-
-		passwd.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent arg0) {
-				conf.setPassword(passwd.getText());
-
-			}
-		});
-
-		// CA cert
-
-		l = new Label(userPassword, SWT.NONE);
-		l.setText(Messages.SMOAResourceManagerConfigurationWizardPage_CaCert);
-		l.setLayoutData(new GridData());
-
-		cacert = new Text(userPassword, SWT.SINGLE | SWT.BORDER);
-		if (conf.getCaCertPath() != null) {
-			cacert.setText(conf.getCaCertPath());
-		}
-		cacert.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		final Button cacertBrowser = new Button(userPassword, SWT.PUSH);
-		cacertBrowser.setText(Messages.SMOAResourceManagerConfigurationWizardPage_Browse);
-		cacertBrowser.setLayoutData(new GridData());
-		cacertBrowser.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-			}
-
-			public void widgetSelected(SelectionEvent arg0) {
-				final FileDialog dialog = new FileDialog(new Shell(), SWT.OPEN);
-				dialog.setFileName(cacert.getText());
-				final String _ = dialog.open();
-				if (null != _) {
-					cacert.setText(_);
-				}
-			}
-		});
-
-		// DN
-
-		final Label label = new Label(userPassword, SWT.NONE);
-		label.setText(Messages.SMOAResourceManagerConfigurationWizardPage_ServiceDN);
-		label.setLayoutData(new GridData());
-
-		dn = new Text(userPassword, SWT.SINGLE | SWT.BORDER);
-		if (conf.getServiceDN() != null) {
-			dn.setText(conf.getServiceDN());
-		}
-		gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		dn.setLayoutData(gridData);
-		dn.setEnabled(!cacert.getText().isEmpty());
-		dn.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent arg0) {
-				gsi_dn.setText(dn.getText());
-				conf.setServiceDn(dn.getText());
-				setPageComplete(isValid());
-			}
-		});
-
-		// Finalizing
-
-		cacert.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent arg0) {
-				conf.setCacertPath(cacert.getText());
-				dn.setEnabled(!cacert.getText().isEmpty());
-				setPageComplete(isValid());
-			}
-		});
-
-		return userPassword;
-	}
-
-	/**
-	 * Checks if the settings are acceptable (i.e. is it worth to try to connect
-	 * using them)
-	 */
-	public boolean isValid() {
-		if (host != null && host.getText().isEmpty()) {
-			return false;
-		}
-
-		if (username != null && username.getSelection()) {
-			if (user.getText().isEmpty()) {
-				return false;
-			}
-			if ((!cacert.getText().isEmpty()) && (!new File(cacert.getText()).exists())) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	/** Reacts on the authentication type change */
-	private void toggleUsernamePassword() {
-
-		if (username.getSelection()) {
-			conf.setAuthType(AuthType.UsernamePassword);
-			stackLayout.topControl = userpasswdTab;
-			userData.layout();
-			if (previousAuth != AuthType.UsernamePassword) {
-				try {
-					previousAuth = AuthType.UsernamePassword;
-					conf.trigerSecureStorage();
-				} catch (final StorageException e) {
-					final MessageBox mb = new MessageBox(getShell(), SWT.ERROR | SWT.OK | SWT.ICON_ERROR);
-					mb.setText(Messages.SMOAResourceManagerConfigurationWizardPage_SecureStorageError);
-					mb.setMessage(e.getLocalizedMessage());
-					mb.open();
-				}
-			}
-		} else if (anonymous.getSelection()) {
-			conf.setAuthType(AuthType.Anonymous);
-			stackLayout.topControl = anonymousTab;
-			userData.layout();
-		} else if (gsiauth.getSelection()) {
-			conf.setAuthType(AuthType.GSI);
-			stackLayout.topControl = gsiTab;
-			userData.layout();
-		} else {
-			throw new RuntimeException("Boo!"); //$NON-NLS-1$
-		}
-
-		previousAuth = conf.getAuthType();
-		setPageComplete(isValid());
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/SMOAResourceManagerFileServicesPage.java b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/SMOAResourceManagerFileServicesPage.java
deleted file mode 100644
index e0799dc..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/SMOAResourceManagerFileServicesPage.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Poznan Supercomputing and Networking Center
- * 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:
- *     Jan Konczak (PSNC) - initial implementation
- ******************************************************************************/
-
-package org.eclipse.ptp.rm.smoa.ui.wizards;
-
-import java.util.Vector;
-
-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.IRemoteUIServices;
-import org.eclipse.ptp.remote.ui.PTPRemoteUIPlugin;
-import org.eclipse.ptp.rm.smoa.core.SMOARemoteServicesFactory;
-import org.eclipse.ptp.rm.smoa.core.rmsystem.SMOAResourceManagerConfiguration;
-import org.eclipse.ptp.ui.wizards.IRMConfigurationWizard;
-import org.eclipse.ptp.ui.wizards.RMConfigurationWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * Prompts user for selecting desired method of file transfer.
- */
-public class SMOAResourceManagerFileServicesPage extends RMConfigurationWizardPage {
-
-	private Button rbSmoa;
-	private Button rbSsh;
-
-	private Composite connectionComposite;
-	private Combo rservies;
-	private Combo connCombo;
-	private Button newConnection;
-	private Label warnSmoa;
-
-	private final Vector<IRemoteServices> remoteServices = new Vector<IRemoteServices>();
-	private IRemoteConnection[] connections;
-	private int selectedRservices;
-	private final SMOAResourceManagerConfiguration conf;
-
-	public SMOAResourceManagerFileServicesPage(IRMConfigurationWizard wizard) {
-		super(wizard, Messages.SMOAResourceManagerFileServicesPage_FileServicesChoice);
-		setTitle(Messages.SMOAResourceManagerFileServicesPage_FileServicesChoice);
-		setDescription(Messages.SMOAResourceManagerFileServicesPage_FileServicesChoice_description);
-		conf = (SMOAResourceManagerConfiguration) wizard.getBaseConfiguration();
-	}
-
-	private void createChoice(Composite mainComposite) {
-		final Composite typeSelection = new Composite(mainComposite, SWT.NONE);
-		typeSelection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		typeSelection.setLayout(new GridLayout(2, true));
-
-		final Label caption = new Label(typeSelection, SWT.NONE);
-		caption.setText(Messages.SMOAResourceManagerFileServicesPage_ChooseFileTransferMethods);
-		final GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		caption.setLayoutData(gridData);
-
-		rbSmoa = new Button(typeSelection, SWT.RADIO);
-		rbSmoa.setText(Messages.SMOAResourceManagerFileServicesPage_TextForChoosingSmoaOnly);
-
-		rbSsh = new Button(typeSelection, SWT.RADIO);
-		rbSsh.setText(Messages.SMOAResourceManagerFileServicesPage_TextForChoosingAdditionalSsh);
-	}
-
-	private void createConnectionSelector(Composite mainComposite) {
-		connectionComposite = new Composite(mainComposite, SWT.NONE);
-		connectionComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		connectionComposite.setLayout(new GridLayout(3, false));
-
-		new Label(connectionComposite, SWT.NONE).setText(Messages.SMOAResourceManagerFileServicesPage_RemoteServices);
-
-		rservies = new Combo(connectionComposite, SWT.READ_ONLY);
-		final GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		rservies.setLayoutData(gridData);
-
-		new Label(connectionComposite, SWT.NONE).setText(Messages.SMOAResourceManagerFileServicesPage_Connection);
-
-		connCombo = new Combo(connectionComposite, SWT.READ_ONLY);
-		connCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		newConnection = new Button(connectionComposite, SWT.PUSH);
-		newConnection.setText(Messages.SMOAResourceManagerFileServicesPage_New);
-
-	}
-
-	@Override
-	public void createControl(Composite parent) {
-		final Composite mainComposite = new Composite(parent, SWT.NONE);
-		mainComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-		setControl(mainComposite);
-
-		final GridLayout mainLayout = new GridLayout();
-		mainComposite.setLayout(mainLayout);
-
-		createChoice(mainComposite);
-
-		createConnectionSelector(mainComposite);
-
-		warnSmoa = new Label(mainComposite, SWT.NONE);
-		warnSmoa.setText(Messages.SMOAResourceManagerFileServicesPage_WarningAboutUsingSmoaOnly);
-		warnSmoa.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		prepareListeners();
-
-		initValues();
-
-		setPageComplete(isValid());
-	}
-
-	private void enableConnSelection(boolean enabled) {
-		for (final Control c : connectionComposite.getChildren()) {
-			c.setEnabled(enabled);
-		}
-	}
-
-	private void initValues() {
-		final IRemoteServices[] _ = PTPRemoteCorePlugin.getDefault().getAllRemoteServices();
-		for (final IRemoteServices services : _) {
-			final String name = services.getName();
-			if (SMOARemoteServicesFactory.ID.equals(services.getId())) {
-				continue;
-			}
-			remoteServices.add(services);
-			rservies.add(name);
-		}
-
-		connCombo.setEnabled(false);
-		newConnection.setEnabled(false);
-
-		selectedRservices = rservies.getSelectionIndex();
-
-		final IRemoteConnection rconn = conf.getFileRemoteConnection();
-		if (rconn == null) {
-			rbSmoa.setSelection(true);
-			enableConnSelection(false);
-		} else {
-			rbSsh.setSelection(true);
-			int index = remoteServices.indexOf(rconn.getRemoteServices());
-			if (index != -1) {
-				rservies.select(index);
-
-				updateConnectionList();
-
-				index = -1;
-				for (int i = 0; i < connections.length; i++) {
-					// Comparing connections is dangerous, RSE messes up
-					if (connections[i].getName().equals(rconn.getName())) {
-						index = i;
-						break;
-					}
-				}
-
-				connCombo.select(index);
-			}
-		}
-	}
-
-	boolean isValid() {
-		return connCombo.getSelectionIndex() != -1 || rbSmoa.getSelection();
-	}
-
-	private void prepareListeners() {
-		rbSmoa.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {
-				widgetSelected(e);
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				enableConnSelection(false);
-				warnSmoa.setVisible(true);
-				conf.setFileRemoteConnection(null);
-				setPageComplete(isValid());
-			}
-		});
-
-		rbSsh.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {
-				widgetSelected(e);
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				enableConnSelection(true);
-				warnSmoa.setVisible(false);
-				setPageComplete(isValid());
-			}
-		});
-
-		rservies.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-
-				if (selectedRservices == rservies.getSelectionIndex()) {
-					return;
-				}
-
-				updateConnectionList();
-				setPageComplete(isValid());
-			}
-		});
-
-		connCombo.addSelectionListener(new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				setPageComplete(isValid());
-
-				final int index = connCombo.getSelectionIndex();
-				conf.setFileRemoteConnection(connections[index]);
-			}
-		});
-
-		newConnection.addSelectionListener(new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				if (selectedRservices == -1) {
-					return;
-				}
-				final IRemoteServices rseServices = remoteServices.get(selectedRservices);
-				final IRemoteUIServices remUIServices = PTPRemoteUIPlugin.getDefault().getRemoteUIServices(rseServices);
-				if (remUIServices == null) {
-					return;
-				}
-
-				final IRemoteConnection rconn = remUIServices.getUIConnectionManager().newConnection(getShell());
-
-				if (rconn == null) {
-					return;
-				}
-
-				updateConnectionList();
-
-				int index = -1;
-				for (int i = 0; i < connections.length; i++) {
-					if (connections[i].getName().equals(rconn.getName())) {
-						index = i;
-						break;
-					}
-				}
-				assert index != -1;
-				connCombo.select(index);
-
-				conf.setFileRemoteConnection(rconn);
-
-				setPageComplete(isValid());
-
-			}
-		});
-	}
-
-	private void updateConnectionList() {
-		selectedRservices = rservies.getSelectionIndex();
-
-		connCombo.removeAll();
-
-		final int index = rservies.getSelectionIndex();
-		connections = remoteServices.get(index).getConnectionManager().getConnections();
-
-		for (final IRemoteConnection conn : connections) {
-			connCombo.add(conn.getName());
-		}
-
-		connCombo.setEnabled(true);
-		newConnection.setEnabled(true);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/messages.properties b/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/messages.properties
deleted file mode 100644
index 36497d6..0000000
--- a/rms/org.eclipse.ptp.rm.smoa.ui/src/org/eclipse/ptp/rm/smoa/ui/wizards/messages.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-SMOAResourceManagerConfigurationWizardPage_AuthTypeAnonymous=Anonymous
-SMOAResourceManagerConfigurationWizardPage_AuthTypeGSI=GSI
-SMOAResourceManagerConfigurationWizardPage_AuthTypeUserTokenProfile=Username token profile
-SMOAResourceManagerConfigurationWizardPage_Browse=Browse
-SMOAResourceManagerConfigurationWizardPage_CaCert=CA cert: 
-SMOAResourceManagerConfigurationWizardPage_ChooseAuthenticationType=Choose authentication type:
-SMOAResourceManagerConfigurationWizardPage_Hostname=Hostname
-SMOAResourceManagerConfigurationWizardPage_Password=Password:
-SMOAResourceManagerConfigurationWizardPage_Port=Port
-SMOAResourceManagerConfigurationWizardPage_SecureStorageError=Secure storage error\!
-SMOAResourceManagerConfigurationWizardPage_ServiceDN=Service DN:
-SMOAResourceManagerConfigurationWizardPage_SmoaComputingConfiguration=SMOA Computing Configuration
-SMOAResourceManagerConfigurationWizardPage_SmoaComputingConfiguration_description=Enter information to connect to an SMOA Computing system
-SMOAResourceManagerConfigurationWizardPage_Username=Username:
-SMOAResourceManagerFileServicesPage_ChooseFileTransferMethods=Choose file transfer method:
-SMOAResourceManagerFileServicesPage_Connection=Connection:
-SMOAResourceManagerFileServicesPage_FileServicesChoice=File services choice
-SMOAResourceManagerFileServicesPage_FileServicesChoice_description=Choose access method for remote filesystem
-SMOAResourceManagerFileServicesPage_New=New...
-SMOAResourceManagerFileServicesPage_RemoteServices=Remote Services:
-SMOAResourceManagerFileServicesPage_TextForChoosingAdditionalSsh=Additional SSH connection
-SMOAResourceManagerFileServicesPage_TextForChoosingSmoaOnly=SMOA Computing (experimental)
-SMOAResourceManagerFileServicesPage_WarningAboutUsingSmoaOnly=Warning: SMOA file staging routines are not stable.\nUsing only SMOA does not support debugging.\nPlease consider using additional SSH connection using RemoteTools.
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 27313d3..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: ETFW Feedback 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 38d37f7..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               icons/,\
-               data/
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 057b091..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/plugin.xml
+++ /dev/null
@@ -1,103 +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_action.gif"
-                  tooltip="Show ETFw Feedback view for selected XML file"
-                  id="org.eclipse.ptp.etfw.feedback.actions.toolbars.sampleCommand">
-            </command>
-         </toolbar>
-      </menuContribution>
-   </extension>
-   <!--  from other plugin -->
-   <extension
-         point="org.eclipse.ui.commands">
-      <category
-            name="%category.name.0"
-            id="org.eclipse.ptp.etfw.feedback.actions.commands.category">
-      </category>
-      <command
-            name="%command.name"
-            categoryId="org.eclipse.ptp.etfw.feedback.actions.commands.category"
-            id="org.eclipse.ptp.etfw.feedback.actions.commands.sampleCommand">
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.handlers">
-      <handler
-            commandId="org.eclipse.ptp.etfw.feedback.actions.commands.sampleCommand"
-            class="org.eclipse.ptp.etfw.feedback.actions.handlers.ShowFeedbackHandler">
-      </handler>
-   </extension>
-   <extension
-         point="org.eclipse.ui.bindings">
-      <key
-            commandId="org.eclipse.ptp.etfw.feedback.actions.commands.sampleCommand"
-            contextId="org.eclipse.ui.contexts.window"
-            sequence="M1+6"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
-      </key>
-   </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 384bac5..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/Activator.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2009,2011 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 6cfd305..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackItem.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2009,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;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ptp.etfw.feedback.AbstractFeedbackItem;
-import org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem;
-import org.eclipse.ptp.etfw.feedback.sample.internal.FeedbackIDs;
-
-/**
- * @author Beth Tibbitts
- * 
- */
-public class SampleFeedbackItem extends AbstractFeedbackItem implements IFeedbackItem {
-	private String name;
-	private String parentID;
-	private String id;
-	private String description;
-	private String filename;
-	private int lineNo;
-
-	/**
-	 * map of values by attribute name, that the view LabelProvider will want to ask for
-	 */
-	Map<String, String> map = new HashMap<String, String>();
-
-	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;
-
-		map.put(FeedbackIDs.FEEDBACK_ATTR_NAME, name);
-		map.put(FeedbackIDs.FEEDBACK_ATTR_FILENAME, filename);
-		map.put(FeedbackIDs.FEEDBACK_ATTR_ID, id);
-		map.put(IMarker.LINE_NUMBER, Integer.toString(lineNo));
-		map.put(FeedbackIDs.FEEDBACK_ATTR_DESC, 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;
-	}
-
-	public String getAttr(String key) {
-		return map.get(key);
-	}
-
-	public Object getObject(String key) {
-		// 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 3cf4f2d..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackParser.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2009,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;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-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.IProject;
-import org.eclipse.core.resources.IResource;
-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;
-	private List<IFeedbackItem> items = new ArrayList<IFeedbackItem>();
-
-	public List<IFeedbackItem> getFeedbackItems(IFile ifile) {
-		if (traceOn)
-			System.out.println("Reading xml file: " + ifile.getLocation());
-
-		items = new ArrayList<IFeedbackItem>();
-		try {
-			items = parse(ifile);
-		} 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;
-	}
-
-	/**
-	 * @deprecated use getFeedbackItems(IFile) instead
-	 */
-	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;
-	}
-
-	/**
-	 * 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(IFile ifile) throws ParserConfigurationException, SAXException, IOException,
-			XPathExpressionException {
-		List<IFeedbackItem> items = new ArrayList<IFeedbackItem>();
-
-		// We will look for file in same dir as xml file; save its locn here
-		IPath p = ifile.getFullPath();
-		p = p.removeLastSegments(1);
-		String filepath = p.toPortableString() + IPath.SEPARATOR;
-
-		DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
-		domFactory.setNamespaceAware(true); // never forget this!
-		Document document = super.getXMLDocument(ifile);
-		XPathFactory factory = XPathFactory.newInstance();
-		XPath xpath = factory.newXPath();
-
-		/* get the items */
-		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();
-				// Remote: assure we save enough info to regurgitate even a remote file
-				// Note: we never had an IResource/IFile for this to begin with.
-				// must create enough info
-				fname = filepath + fname; // fully qualify
-				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
-
-		if (traceOn)
-			System.out.println("SFP found items: " + items.size() + " elements");
-		return items;
-	}
-
-	/**
-	 * For testing only:
-	 * try to create an IFile/IResource from the info we have
-	 * 
-	 * @param fname
-	 */
-	private void tryCreateFile(String fname, IFile xmlFile) {
-		System.out.println("xmlFile: " + xmlFile);
-		IProject proj = xmlFile.getProject();
-		IResource foundRes = proj.findMember(fname);
-		boolean exists = foundRes.exists();
-		IPath path = foundRes.getFullPath();
-		String s = path.toString();
-		String s2 = path.toPortableString();
-		String s3 = path.toOSString();
-		IResource recreatedRes = getResourceInProject(proj, fname);
-		exists = recreatedRes.exists();
-
-	}
-
-}
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 4e71441..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackView.java
+++ /dev/null
@@ -1,124 +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.preferences.PreferenceConstants;
-import org.eclipse.ptp.etfw.feedback.sample.internal.FeedbackIDs;
-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 0895906..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 cdc4b83..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/actions/SampleFeedbackAction.java
+++ /dev/null
@@ -1,59 +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/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/internal/FeedbackIDs.java b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/internal/FeedbackIDs.java
deleted file mode 100644
index bbdabe3..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/internal/FeedbackIDs.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2009,2011 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.internal;
-
-/**
- * Feedback view Plugin constants
- * 
- * <p>
- * <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. We do not recommending using this API without consulting with the
- * etfw.feedback team.
- */
-public interface FeedbackIDs
-{
-
-	/** View ID */
-	String FEEDBACK_VIEW_ID = "org.eclipse.ptp.etfw.feedback.views.feedbackView"; //$NON-NLS-1$
-
-	// attribute names
-	String FEEDBACK_ATTR_NAME = "name"; //$NON-NLS-1$
-	String FEEDBACK_ATTR_ID = "itemID"; //$NON-NLS-1$
-	String FEEDBACK_ATTR_FILENAME = "filename"; //$NON-NLS-1$
-	String FEEDBACK_ATTR_PATHNAME = "pathname"; //$NON-NLS-1$
-	String FEEDBACK_ATTR_PARENT = "parent"; //$NON-NLS-1$
-	String FEEDBACK_ATTR_FUNCTION = "functionCaller"; //$NON-NLS-1$
-	String FEEDBACK_ATTR_FUNCTION_CALLEE = "functionCallee"; // unused? others? //$NON-NLS-1$
-	String FEEDBACK_ATTR_DESC = "description"; //$NON-NLS-1$
-	String FEEDBACK_ATTR_LOOP_ID = "LoopId"; //attr name in xml file AND attr name in marker //$NON-NLS-1$
-	// //Note: we use IMarker.LINE_NUMBER too
-
-	/**
-	 * @since 5.0
-	 */
-	String FEEDBACK_ATTR_ITEM = "item"; //$NON-NLS-1$
-
-}
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 db83e3b..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,21 +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,
- org.eclipse.ptp.pldt.openmp.ui.pv,
- org.eclipse.ptp.pldt.mpi.analysis,
- org.eclipse.ptp.pldt.upc
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Activator: org.eclipse.ptp.pldt.tests.Activator
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/testMPIMacro.c b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPIMacro.c
deleted file mode 100644
index be5d7ff..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPIMacro.c
+++ /dev/null
@@ -1,35 +0,0 @@
-// test recognition of artifacts within preprocessor
-// Note that this is ridiculous code, only used for testing
-#include <mpi.h>
-
-/* for any error messages returned by LAPI */
-char err_msg_buf[MPI_MAX_ERR_STRING];
-#define FOO MPI_Init(&argc, &argv)
-
-#define CHECK(func_and_args)                                      \
-{                                                                 \
-    int rc;                                                       \
-    if ((rc = (func_and_args)) != MPI_SUCCESS) {                 \
-        MPI_Address(rc, 0);                                      \
-        fprintf(stderr,                                           \
-                "MPI returns error message: %s, rc = %d\n",      \
-                 err_msg_buf, rc);                                \
-        exit(1);                                                  \
-    }                                                             \
-                                                                  \
-}
-
-
-
-void do_accumulate(foo_handle_t *handle, void *param)
-{
-	FOO;
-	MPI_Send(null,0,null,0,0,0); // artifact not within preproc
-    CHECK((MPI_Send(*handle, buddy,
-                       (void *)(hdr_hdl_list[buddy]), &uhdr,
-                        sizeof(uhdr_t), &(data_buffer[0]),
-                        len*(sizeof(data_buffer[0])),
-                        NULL, NULL, NULL)));
-
-}
- 
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/testMPIbarriersFnCall.c b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPIbarriersFnCall.c
deleted file mode 100644
index e80d5af..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPIbarriersFnCall.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include "mpi.h"
-// Sample MPI program
-int myBarrier(){
-	MPI_Barrier(MPI_COMM_WORLD);
-}
-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);
-		}
-		myBarrier(); // barrier in fn call should match barrier in 'then' clause above
-	}
-	/* 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/resources/testUPC.upc b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testUPC.upc
deleted file mode 100644
index e58e8b6..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testUPC.upc
+++ /dev/null
@@ -1,79 +0,0 @@
-/* The ubiquitous cpi program.
-   Compute pi using a simple quadrature rule
-   in parallel
-   Usage: cpi [intervals_per_thread]
-
-   BRT: from http://www.psc.edu/general/software/packages/upc/examples/cpi.upc
-   */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include <upc_relaxed.h>
-
-#define INTERVALS_PER_THREAD_DEFAULT 100
-/* Add up all the inputs on all the threads.
-   When the collective spec becomes finalised this
-   will be replaced */
-
-shared double reduce_data[THREADS];
-shared double reduce_result;
-double myreduce(double myinput)
-{
-  reduce_data[MYTHREAD]=myinput;
-  upc_barrier;
-  if(MYTHREAD == 0) {
-    double result = 0;
-    int i;
-    for(i=0;i < THREADS;i++) {
-      result += reduce_data[i];
-    }
-    reduce_result = result;
-  }
-  upc_barrier;
-  return(reduce_result);
-}
-
-/* The function to be integrated */
-double f(double x)
-{
-  double dfour=4;
-  double done=1;
-  return(dfour/(done + (x*x)));
-}
-
-/* Implementation of a simple quadrature rule */
-double integrate(double left,double right,int intervals)
-{
-  int i;
-  double sum = 0;
-  double h = (right-left)/intervals;
-  double hh = h/2;
-  /* Use the midpoint rule */
-  double midpt = left + hh;
-  for(i=0;i < intervals;i++) {
-    sum += f(midpt + i*h);
-  }
-  return(h*sum);
-}
-
-int main(int argc,char **argv)
-{
-  double mystart, myend;
-  double myresult;
-  double piapprox;
-  int intervals_per_thread = INTERVALS_PER_THREAD_DEFAULT;
-  double realpi=3.141592653589793238462643;
-  /* Get the part of the range that I'm responsible for */
-  mystart = (1.0*MYTHREAD)/THREADS;
-  myend = (1.0*(MYTHREAD+1))/THREADS;
-  if(argc > 1) {
-    intervals_per_thread = atoi(argv[1]);
-  }
-  piapprox = myreduce(integrate(mystart,myend,intervals_per_thread));
-  if(MYTHREAD == 0) {
-    printf("Approx: %20.17f Error: %23.17f\n",piapprox,fabs(piapprox - realpi));
-  }
-  upc_addrfield();
-  return(0);
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testUPCmacro.upc b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testUPCmacro.upc
deleted file mode 100644
index db444b0..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testUPCmacro.upc
+++ /dev/null
@@ -1,35 +0,0 @@
-// note: this is ridiculous code, not expected to run, just testing macro etc. recognition.
-#include <upc.h>
-#define FOO upc_lock(0)
-
-/* for any error messages returned by LAPI */
-char err_msg_buf[MPI_MAX_ERR_STRING];
-
-#define CHECK(func_and_args)                                      \
-{                                                                 \
-    int rc;                                                       \
-    if ((rc = (func_and_args)) != 0) {                            \
-        upc_string(rc, err_msg_buf);                         \
-        fprintf(stderr,                                           \
-                "UPC returns error message: %s, rc = %d\n",      \
-                 err_msg_buf, rc);                                \
-        exit(1);                                                  \
-    }                                                             \
-                                                                  \
-}
-
-
-
-void do_accumulate(foo_handle_t *handle, void *param)
-{
-	upc_addrfield(null);
-	FOO;
-
-    CHECK((upc_something(*handle, buddy,
-                       (void *)(hdr_hdl_list[buddy]), &uhdr,
-                        sizeof(uhdr_t), &(data_buffer[0]),
-                        len*(sizeof(data_buffer[0])),
-                        NULL, NULL, NULL)));
-
-}
- 
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Activator.java b/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Activator.java
deleted file mode 100644
index 4034187..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Activator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.eclipse.ptp.pldt.tests;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-//http://wiki.eclipse.org/Eclipse_Plug-in_Development_FAQ#How_do_I_read_from_a_file_that_I.27ve_included_in_my_bundle.2Fplug-in.3F
-//your BundleActivator implementation will probably look something
-//like the following
-
-public class Activator implements BundleActivator {
-	private static Activator instance;
-
-	private Bundle bundle;
-
-	public void start(BundleContext context) throws Exception {
-		instance = this;
-		bundle = context.getBundle();
-	}
-
-	public void stop(BundleContext context) throws Exception {
-		instance = null;
-	}
-
-	public static Activator getDefault() {
-		return instance;
-	}
-
-	public Bundle getBundle() {
-		return bundle;
-	}
-
-}
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 5b62843..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/PldtBaseTestFramework.java
+++ /dev/null
@@ -1,209 +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.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URISyntaxException;
-import java.net.URL;
-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.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.ptp.pldt.internal.common.IDs;
-import org.osgi.framework.Bundle;
-
-/**
- * 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>>();
-
-	/**
-	 * Return a file imported for use in the tests. Includes determining if the
-	 * file exists
-	 */
-	protected IFile importFile(String srcDir, String filename) throws Exception {
-		assertTrue("Missing file: " + filename, testExists(srcDir, filename));
-		IFile result = super.importFile(filename, readTestFile(srcDir, filename));
-		return result;
-	}
-
-	/**
-	 * Determine if a file exists
-	 * 
-	 * @param srcDir
-	 *            source directory in which the file should be located
-	 * @param filename
-	 *            file name of file to find
-	 * @return
-	 */
-	private boolean testExists(String srcDir, String filename) {
-		String fullname = srcDir + File.separator + filename;
-		IPath path = new Path(fullname);
-		Activator a = Activator.getDefault();
-		Bundle bundle = a.getBundle();
-		URL url = FileLocator.find(bundle, path, null);
-		if (url == null) {
-			// System.out.println(filename+" **NOT FOUND***");
-			return false;
-		}
-		return true;
-
-	}
-
-	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 eb8f984..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/TestFortran.java
+++ /dev/null
@@ -1,172 +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.internal.common.IDs;
-import org.eclipse.ptp.pldt.mpi.core.actions.RunAnalyseMPIcommandHandler;
-import org.eclipse.ptp.pldt.mpi.internal.core.MpiIDs;
-import org.eclipse.ptp.pldt.openmp.core.actions.RunAnalyseOpenMPcommandHandler;
-import org.eclipse.ptp.pldt.openmp.core.internal.OpenMPIDs;
-
-/**
- * @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(OpenMPIDs.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 0e7bc72..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010,2011 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.internal.common.IDs;
-import org.eclipse.ptp.pldt.mpi.core.MpiPlugin;
-import org.eclipse.ptp.pldt.mpi.core.actions.RunAnalyseMPIcommandHandler;
-import org.eclipse.ptp.pldt.mpi.internal.core.MpiIDs;
-
-/**
- * @author beth
- * 
- */
-public class Test_MPI extends PldtBaseTestFramework {
-
-	public void testMPIartifacts() throws Exception {
-		System.out.println("\n==> " + getMethodName() + "()...");
-
-		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]);
-		}
-
-	}
-
-	public void testMPIartifactsInMacro() throws Exception {
-		System.out.println("\n==> " + getMethodName() + "()...");
-		MpiPlugin.getDefault().getPreferenceStore().setValue(MpiIDs.MPI_RECOGNIZE_APIS_BY_PREFIX_ALONE, true);
-		IFile file = importFile("resources", "testMPIMacro.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 = { 26, 27, 28, 28 };
-		// the "(" is just the beginning of a long expanded macro. will not do exact match. see below.
-		String[] expectedMpiTypes = { "MPI_Init  (FOO)", "MPI_Send", "MPI_Send  (", "MPI_Address  (" };
-		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());
-			// Note: the whole text of the expanded artifact name is longer; we're not doing an exact match here
-			String expectedName = expectedArts[i].getName();
-			assertTrue(markerArts[i].getName().startsWith(expectedName));
-			boolean test = markerArts[i].equals(expectedArts[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 d140f9f..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI_barriers.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.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.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_helloBarrierFnCall() throws Exception {
-		System.out.println("\n==> " + getMethodName() + "()...");
-		int[] expectedMarkerLocn = { 6, 36 };
-		BarrierSetBasics bsb = new BarrierSetBasics(2, 2);
-		barrierBase("testMPIbarriersFnCall.c", expectedMarkerLocn, bsb);
-	}
-
-	public void testMPI_barriers_error() throws Exception {
-		System.out.println("\n==> " + getMethodName() + "()...");
-		int[] expectedMarkerLocn = { 33 };
-		BarrierSetBasics bsb = new BarrierSetBasics(1, 1, true);
-		barrierBase("testMPIbarriersErr.c", expectedMarkerLocn, bsb);
-	}
-
-	public void barrierBase(String filename, int[] expectedLinenos, 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.internal.IDs.barrierMarkerID;
-
-		// =================================
-		IMarker[] markers = file.findMarkers(barrierMarkerID, true, IResource.DEPTH_INFINITE);
-		int expectedNumber = expectedLinenos.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);
-
-		// ////////////
-		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], "barrier");
-		}
-		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());
-			// /
-			// 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: "+expectedLinenos[i]);
-			// assertEquals("expected barrier marker locn",expectedLinenos[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.internal.IDs.matchingSetMarkerID;
-		final String barrierParentID = org.eclipse.ptp.pldt.mpi.analysis.internal.IDs.parentIDAttr;
-		final String barrierMyID = org.eclipse.ptp.pldt.mpi.analysis.internal.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 };// actual values are unused? 6 members: 2 parents, two child nodes each?
-
-		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<IMarker> 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 barrier set inspection. ");
-	}
-
-	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<String> 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 7f33d32..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_OpenMP.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010,2011 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.internal.common.IDs;
-import org.eclipse.ptp.pldt.openmp.analysis.PAST.PASTOMPPragma;
-import org.eclipse.ptp.pldt.openmp.core.actions.RunAnalyseOpenMPcommandHandler;
-import org.eclipse.ptp.pldt.openmp.core.internal.OpenMPIDs;
-
-/**
- * @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(OpenMPIDs.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(OpenMPIDs.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/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_UPC.java b/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_UPC.java
deleted file mode 100644
index f413a5d..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_UPC.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 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.internal.common.IDs;
-import org.eclipse.ptp.pldt.mpi.core.MpiPlugin;
-import org.eclipse.ptp.pldt.mpi.internal.core.MpiIDs;
-import org.eclipse.ptp.pldt.upc.actions.RunAnalyseUPCcommandHandler;
-import org.eclipse.ptp.pldt.upc.internal.UPCIDs;
-
-/**
- * @author beth
- * 
- */
-public class Test_UPC extends PldtBaseTestFramework {
-
-	public void testUPCartifacts() throws Exception {
-		System.out.println("\n==> " + getMethodName() + "()...");
-
-		IFile file = importFile("resources", "testUPC.upc");
-		assertNotNull(file);
-
-		IFile upcInclude = importFile("resources/includes", "upc.h");
-		assertNotNull(upcInclude);
-		String tempPath = upcInclude.getFullPath().toOSString();// includePath= /RegressionTestProject/upc.h
-		System.out.println("tempPath=" + tempPath);
-		String includePath = upcInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-				+ upcInclude.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 });
-		RunAnalyseUPCcommandHandler racm = new RunAnalyseUPCcommandHandler();
-
-		racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-
-		IMarker[] markers = file.findMarkers(UPCIDs.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 = { 77 };
-		String[] expectedTypes = { "upc_addrfield" };
-		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], expectedTypes[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());
-
-			// the following never works, so we'll be happy enough with the two assertEquals above.
-			// assertEquals(expectedArts[i], markerArts[i]);
-
-		}
-
-	}
-
-	public void testUPCartifactsWithMacro() throws Exception {
-		System.out.println("\n==> " + getMethodName() + "()...");
-		MpiPlugin.getDefault().getPreferenceStore().setValue(MpiIDs.MPI_RECOGNIZE_APIS_BY_PREFIX_ALONE, true);
-		IFile file = importFile("resources", "testUPCmacro.upc");
-		assertNotNull(file);
-
-		IFile upcInclude = importFile("resources/includes", "upc.h");
-		assertNotNull(upcInclude);
-		String tempPath = upcInclude.getFullPath().toOSString();// includePath= /RegressionTestProject/upc.h
-		System.out.println("tempPath=" + tempPath);
-		String includePath = upcInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-				+ upcInclude.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 });
-		RunAnalyseUPCcommandHandler racm = new RunAnalyseUPCcommandHandler();
-
-		racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-
-		IMarker[] markers = file.findMarkers(UPCIDs.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 = { 25, 26, 28, 28 };
-		String[] expectedTypes = { "upc_addrfield", "upc_lock  (FOO)", "upc_something  (CHECK", "upc_string  (CHECK" };
-		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], expectedTypes[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 - note macro is fairly long so we only test startsWith
-			System.out.println("    " + expectedArts[i].getName() + " = " + markerArts[i].getName());
-			assertTrue(markerArts[i].getName().startsWith(expectedArts[i].getName()));
-
-		}
-
-	}
-}
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);
-	}
-}
