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.git.core/.classpath b/rdt/org.eclipse.ptp.rdt.sync.git.core/.classpath
deleted file mode 100644
index 5e4c1fe..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.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.git.core/.project b/rdt/org.eclipse.ptp.rdt.sync.git.core/.project
deleted file mode 100644
index 8460142..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rdt.sync.git.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.git.core/.settings/org.eclipse.jdt.core.prefs b/rdt/org.eclipse.ptp.rdt.sync.git.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index c60b0a7..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,335 +0,0 @@
-#Thu Feb 10 15:23:36 EST 2011
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-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.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-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=error
-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.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-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.suppressOptionalErrors=disabled
-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=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
-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.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=132
-org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
-org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
-org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.join_lines_in_comments=true
-org.eclipse.jdt.core.formatter.join_wrapped_lines=false
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=132
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_on_off_tags=false
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.core/.settings/org.eclipse.jdt.ui.prefs b/rdt/org.eclipse.ptp.rdt.sync.git.core/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 520172a..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.core/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,57 +0,0 @@
-#Thu Feb 10 14:53:44 EST 2011
-cleanup.add_default_serial_version_id=true
-cleanup.add_generated_serial_version_id=false
-cleanup.add_missing_annotations=true
-cleanup.add_missing_deprecated_annotations=true
-cleanup.add_missing_methods=false
-cleanup.add_missing_nls_tags=false
-cleanup.add_missing_override_annotations=true
-cleanup.add_missing_override_annotations_interface_methods=true
-cleanup.add_serial_version_id=false
-cleanup.always_use_blocks=true
-cleanup.always_use_parentheses_in_expressions=false
-cleanup.always_use_this_for_non_static_field_access=false
-cleanup.always_use_this_for_non_static_method_access=false
-cleanup.convert_to_enhanced_for_loop=true
-cleanup.correct_indentation=true
-cleanup.format_source_code=true
-cleanup.format_source_code_changes_only=false
-cleanup.make_local_variable_final=true
-cleanup.make_parameters_final=false
-cleanup.make_private_fields_final=true
-cleanup.make_type_abstract_if_missing_method=false
-cleanup.make_variable_declarations_final=true
-cleanup.never_use_blocks=false
-cleanup.never_use_parentheses_in_expressions=true
-cleanup.organize_imports=true
-cleanup.qualify_static_field_accesses_with_declaring_class=false
-cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-cleanup.qualify_static_member_accesses_with_declaring_class=true
-cleanup.qualify_static_method_accesses_with_declaring_class=false
-cleanup.remove_private_constructors=true
-cleanup.remove_trailing_whitespaces=true
-cleanup.remove_trailing_whitespaces_all=true
-cleanup.remove_trailing_whitespaces_ignore_empty=false
-cleanup.remove_unnecessary_casts=true
-cleanup.remove_unnecessary_nls_tags=true
-cleanup.remove_unused_imports=true
-cleanup.remove_unused_local_variables=false
-cleanup.remove_unused_private_fields=true
-cleanup.remove_unused_private_members=false
-cleanup.remove_unused_private_methods=true
-cleanup.remove_unused_private_types=true
-cleanup.sort_members=true
-cleanup.sort_members_all=false
-cleanup.use_blocks=true
-cleanup.use_blocks_only_for_return_and_throw=false
-cleanup.use_parentheses_in_expressions=false
-cleanup.use_this_for_non_static_field_access=false
-cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-cleanup.use_this_for_non_static_method_access=false
-cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-cleanup_profile=_PTP
-cleanup_settings_version=2
-eclipse.preferences.version=1
-formatter_profile=_PTP
-formatter_settings_version=11
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.core/META-INF/MANIFEST.MF b/rdt/org.eclipse.ptp.rdt.sync.git.core/META-INF/MANIFEST.MF
deleted file mode 100644
index 8f5438b..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,30 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.ptp.rdt.sync.git.core;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.ptp.rdt.sync.git.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.git.core
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Import-Package: com.jcraft.jsch,
- org.eclipse.core.filesystem,
- org.eclipse.core.internal.filesystem.local,
- org.eclipse.jgit.api,
- org.eclipse.jgit.api.errors,
- org.eclipse.jgit.errors,
- org.eclipse.jgit.lib,
- org.eclipse.jgit.storage.file,
- org.eclipse.jgit.transport,
- org.eclipse.jgit.util,
- org.eclipse.ptp.remote.remotetools.core
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.core/build.properties b/rdt/org.eclipse.ptp.rdt.sync.git.core/build.properties
deleted file mode 100644
index 0dc34f7..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.core/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin.properties
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.core/plugin.properties b/rdt/org.eclipse.ptp.rdt.sync.git.core/plugin.properties
deleted file mode 100644
index 0621005..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.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 Git Core
-plugin.provider = Eclipse.org
-
-GitServiceProvider.name = Git Synchronization Service
-
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.core/plugin.xml b/rdt/org.eclipse.ptp.rdt.sync.git.core/plugin.xml
deleted file mode 100644
index 442ef9b..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.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.git.core.GitServiceProvider"
-            id="org.eclipse.ptp.rdt.sync.git.core.GitServiceProvider"
-            name="%GitServiceProvider.name"
-            serviceId="org.eclipse.ptp.rdt.sync.core.SyncService">
-      </provider>
-   </extension>
-
-</plugin>
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/Activator.java b/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/Activator.java
deleted file mode 100644
index 9ccec38..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/Activator.java
+++ /dev/null
@@ -1,64 +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.git.core;
-
-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.git.core"; //$NON-NLS-1$
-
-	// The shared instance
-	private static Activator plugin;
-
-	/**
-	 * Returns the shared instance
-	 * 
-	 * @return the shared instance
-	 */
-	public static Activator getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * The constructor
-	 */
-	public Activator() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	@Override
-	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)
-	 */
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-}
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/CommandRunner.java b/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/CommandRunner.java
deleted file mode 100644
index a92b946..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/CommandRunner.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Oak Ridge 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:
- *    John Eblen - initial implementation
- *******************************************************************************/
-package org.eclipse.ptp.rdt.sync.git.core;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-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.exception.RemoteConnectionException;
-
-// Static class for running system-level commands. This includes local and remote directory operations and also running arbitrary
-// commands on remote machines.
-public class CommandRunner {
-	// Nested convenience class for storing the results of a command.
-	public static class CommandResults {
-		private String stdout;
-		private String stderr;
-		private int exitCode;
-
-		/**
-		 * @return the exitCode
-		 */
-		public int getExitCode() {
-			return exitCode;
-		}
-
-		/**
-		 * @return the stderr
-		 */
-		public String getStderr() {
-			return stderr;
-		}
-
-		/**
-		 * @return the stdout
-		 */
-		public String getStdout() {
-			return stdout;
-		}
-
-		/**
-		 * @param exitCode
-		 */
-		public void setExitCode(int exitCode) {
-			this.exitCode = exitCode;
-		}
-
-		/**
-		 * @param stderr
-		 */
-		public void setStderr(String stderr) {
-			this.stderr = stderr;
-		}
-
-		/**
-		 * @param stdout
-		 */
-		public void setStdout(String stdout) {
-			this.stdout = stdout;
-		}
-	};
-
-	enum DirectoryStatus {
-		NOT_A_DIRECTORY, NOT_PRESENT, PRESENT
-	}
-
-	/**
-	 * Simply check if a local directory is present but do not create
-	 * 
-	 * @return the directory status
-	 */
-	public static DirectoryStatus checkLocalDirectory(String localDirectory) {
-		final File localDir = new File(localDirectory);
-		if (localDir.exists() == false) {
-			return DirectoryStatus.NOT_PRESENT;
-		}
-
-		else if (localDir.isDirectory()) {
-			return DirectoryStatus.PRESENT;
-		}
-
-		return DirectoryStatus.NOT_A_DIRECTORY;
-	}
-
-	/**
-	 * Simply check if a remote directory is present but do not create
-	 * 
-	 * @param conn
-	 * @param remoteDir
-	 * @return the directory status
-	 */
-	public static DirectoryStatus checkRemoteDirectory(IRemoteConnection conn, String remoteDir) {
-		final IRemoteFileManager fileManager = conn.getRemoteServices().getFileManager(conn);
-		final IFileStore fileStore = fileManager.getResource(remoteDir);
-		final IFileInfo fileInfo = fileStore.fetchInfo();
-
-		if (fileInfo.exists() == false) {
-			return DirectoryStatus.NOT_PRESENT;
-		} else if (fileInfo.isDirectory() == false) {
-			return DirectoryStatus.NOT_A_DIRECTORY;
-		} else {
-			return DirectoryStatus.PRESENT;
-		}
-	}
-
-	/**
-	 * This function creates the local directory if it does not exist.
-	 * 
-	 * @return whether the directory was already PRESENT
-	 * TODO: Handle false return from mkdir
-	 */
-	public static DirectoryStatus createLocalDirectory(String localDirectory) {
-		final DirectoryStatus directoryStatus = checkLocalDirectory(localDirectory);
-		if (directoryStatus == DirectoryStatus.NOT_PRESENT) {
-			final File localDir = new File(localDirectory);
-			localDir.mkdir();
-		}
-
-		return directoryStatus;
-	}
-
-	/**
-	 * This function creates the remote directory if it does not exist. Parent directories are also created if necessary. Note that
-	 * this command does not overwrite if the requested remote directory exists but is not a directory.
-	 * 
-	 * TODO: Check that this also holds true for creating parent directories. For example, if remoteDir =
-	 *        "/home/user/project/project1/" and "/home/user/project" is a file will it be deleted?
-	 * @param conn
-	 * @param remoteDir
-	 * @throws CoreException
-	 *             on problem creating the remote directory.
-	 * @return whether the directory was already PRESENT
-	 */
-	public static DirectoryStatus createRemoteDirectory(IRemoteConnection conn, String remoteDir) throws CoreException {
-		final IRemoteFileManager fileManager = conn.getRemoteServices().getFileManager(conn);
-		final IFileStore fileStore = fileManager.getResource(remoteDir);
-		final IFileInfo fileInfo = fileStore.fetchInfo();
-
-		if (fileInfo.exists() == true) {
-			if (fileInfo.isDirectory() == true) {
-				return DirectoryStatus.PRESENT;
-			} else {
-				return DirectoryStatus.NOT_A_DIRECTORY;
-			}
-		}
-
-		try {
-			fileStore.mkdir(EFS.NONE, null);
-		} catch (final CoreException e) {
-			throw e;
-		}
-
-		return DirectoryStatus.NOT_PRESENT;
-	}
-
-	/**
-	 * Execute command on a remote host and wait for the command to complete.
-	 * 
-	 * @param conn
-	 * @param command
-	 * @return CommandResults (contains stdout, stderr, and exit code)
-	 * @throws IOException
-	 *             in several cases if there is a problem communicating with the remote host.
-	 * @throws InterruptedException
-	 *             if execution of remote command is interrupted.
-	 * @throws RemoteConnectionException
-	 * 			   if connection closed and cannot be opened. 
-	 * TODO: Expand to work with multiple platforms (assumes UNIX \n line endings.)
-	 * TODO: Make robust against buffer overflows - use threads.
-	 */
-	public static CommandResults executeRemoteCommand(IRemoteConnection conn, String command, String remoteDirectory,
-														IProgressMonitor monitor) throws 
-																IOException, InterruptedException, RemoteConnectionException {
-		if (!conn.isOpen()) {
-			try {
-				conn.open(monitor);
-			} catch (RemoteConnectionException e) {
-				throw e;
-			}
-		}
-
-		final CommandResults commandResults = new CommandResults();
-		// Run the command and wait for it to complete.
-		final List<String> commandStrings = Arrays.asList(command.split("\\s+")); //$NON-NLS-1$
-		final IRemoteProcessBuilder rpb = conn.getRemoteServices().getProcessBuilder(conn, commandStrings);
-		final IRemoteFileManager rfm = conn.getRemoteServices().getFileManager(conn);
-		if (rfm != null) {
-			rpb.directory(rfm.getResource(remoteDirectory));
-		}
-
-		IRemoteProcess rp = null;
-		try {
-			rp = rpb.start();
-		} catch (final IOException e) {
-			throw e;
-		}
-
-		// Read and store stdout and stderr.
-		BufferedReader commandOutputReader = null;
-		BufferedReader commandErrorReader = null;
-		commandOutputReader = new BufferedReader(new InputStreamReader(rp.getInputStream()));
-		commandErrorReader = new BufferedReader(new InputStreamReader(rp.getErrorStream()));
-
-		String output = ""; //$NON-NLS-1$
-		try {
-			String line;
-			while ((line = commandOutputReader.readLine()) != null) {
-				output += line;
-				output += "\n"; //$NON-NLS-1$
-			}
-		} catch (final IOException e) {
-			throw e;
-		} finally {
-			commandOutputReader.close();
-		}
-
-		String error = ""; //$NON-NLS-1$
-		try {
-			String line;
-			while ((line = commandErrorReader.readLine()) != null) {
-				error += line;
-				error += "\n"; //$NON-NLS-1$
-			}
-		} catch (final IOException e) {
-			throw e;
-		} finally {
-			commandErrorReader.close();
-		}
-		
-		int exitCode;
-		try {
-			exitCode = rp.waitFor();
-		} catch (final InterruptedException e) {
-			throw e;
-		}
-		commandResults.setExitCode(exitCode);
-
-		commandResults.setStdout(output);
-		commandResults.setStderr(error);
-		return commandResults;
-	}
-
-	// Enforce as static
-	private CommandRunner() {
-		throw new AssertionError("Cannot create instances of static class CommandRunner"); //$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/GitRemoteSyncConnection.java b/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/GitRemoteSyncConnection.java
deleted file mode 100644
index 7bb7302..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/GitRemoteSyncConnection.java
+++ /dev/null
@@ -1,640 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Oak Ridge 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:
- *    John Eblen - initial implementation
- *******************************************************************************/
-package org.eclipse.ptp.rdt.sync.git.core;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
-import java.net.URISyntaxException;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jgit.api.AddCommand;
-import org.eclipse.jgit.api.CommitCommand;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.MergeCommand;
-import org.eclipse.jgit.api.errors.CheckoutConflictException;
-import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.api.errors.InvalidMergeHeadsException;
-import org.eclipse.jgit.api.errors.NoFilepatternException;
-import org.eclipse.jgit.api.errors.NoHeadException;
-import org.eclipse.jgit.api.errors.NoMessageException;
-import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
-import org.eclipse.jgit.errors.NotSupportedException;
-import org.eclipse.jgit.errors.TransportException;
-import org.eclipse.jgit.errors.UnmergedPathException;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.StoredConfig;
-import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
-import org.eclipse.jgit.transport.CredentialsProvider;
-import org.eclipse.jgit.transport.RefSpec;
-import org.eclipse.jgit.transport.RemoteConfig;
-import org.eclipse.jgit.transport.RemoteSession;
-import org.eclipse.jgit.transport.SshSessionFactory;
-import org.eclipse.jgit.transport.Transport;
-import org.eclipse.jgit.transport.TransportGitSsh;
-import org.eclipse.jgit.transport.URIish;
-import org.eclipse.jgit.util.FS;
-import org.eclipse.ptp.rdt.sync.git.core.CommandRunner.CommandResults;
-import org.eclipse.ptp.remote.core.AbstractRemoteProcess;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.exception.RemoteConnectionException;
-
-/**
- * 
- * This class implements a remote sync tool using git, as accessed through the jgit library.
- * 
- */
-public class GitRemoteSyncConnection {
-	private final static String remoteProjectName = "eclipse_auto"; //$NON-NLS-1$
-	private final static String commitMessage = "Eclipse Automatic Commit"; //$NON-NLS-1$
-	private final static String remotePushBranch = "ptp-push"; //$NON-NLS-1$
-	private final IRemoteConnection connection;
-	private final String localDirectory;
-	private final String remoteDirectory;
-	private Git git;
-	private TransportGitSsh transport;
-
-	/**
-	 * Create a remote sync connection using git. Assumes that the local directory exists but not necessarily the remote directory.
-	 * It is created if not.
-	 * 
-	 * @param conn
-	 * @param localDir
-	 * @param remoteDir
-	 * @throws RemoteSyncException
-	 *             on problems building the remote repository. Specific exception nested. Upon such an exception, the instance is
-	 *             invalid and should not be used.
-	 */
-	public GitRemoteSyncConnection(IRemoteConnection conn, String localDir, String remoteDir) throws RemoteSyncException {
-		connection = conn;
-		localDirectory = localDir;
-		remoteDirectory = remoteDir;
-
-		// Build repo, creating it if it is not already present.
-		try {
-			buildRepo();
-		} catch (final CoreException e) {
-			throw new RemoteSyncException(e);
-		} catch (final IOException e) {
-			throw new RemoteSyncException(e);
-		} catch (final RemoteExecutionException e) {
-			throw new RemoteSyncException(e);
-		}
-
-		// Build transport
-		final RemoteConfig remoteConfig = buildRemoteConfig(git.getRepository().getConfig());
-		buildTransport(remoteConfig);
-	}
-
-	/**
-	 * Builds the remote configuration for the connection, setting up fetch and push operations between local and remote master
-	 * branches.
-	 * 
-	 * @param config
-	 *            configuration for the local repository
-	 * @return the remote configuration
-	 * @throws RuntimeException
-	 *             if the URI in the passed configuration is not properly formatted.
-	 */
-	private RemoteConfig buildRemoteConfig(StoredConfig config) {
-		RemoteConfig rconfig = null;
-
-		try {
-			rconfig = new RemoteConfig(config, remoteProjectName);
-		} catch (final URISyntaxException e) {
-			throw new RuntimeException(e);
-		}
-
-		final RefSpec refSpecFetch = new RefSpec("+refs/heads/master:refs/remotes/" +  //$NON-NLS-1$
-												                      remoteProjectName + "/master"); //$NON-NLS-1$
-		final RefSpec refSpecPush = new RefSpec("+master:" + remotePushBranch); //$NON-NLS-1$
-		rconfig.addFetchRefSpec(refSpecFetch);
-		rconfig.addPushRefSpec(refSpecPush);
-
-		return rconfig;
-	}
-
-	/**
-	 * 
-	 * @param localDirectory
-	 * @param remoteHost
-	 * @return the repository
-	 * @throws CoreException
-	 *             on problems creating the remote directory.
-	 * @throws IOException
-	 *             on problems writing to the file system.
-	 * @throws RemoteExecutionException
-	 *             on failure to run remote commands.
-	 * @throws RemoteSyncException
-	 *             on problems with initial local commit.
-	 * TODO: Consider the consequences of exceptions that occur at various points, which can leave the repo in a partial state.
-	 * 		   For example, if the repo is created but the initial commit fails.
-	 * TODO: Consider evaluating the output of "git init".
-	 */
-	private Git buildRepo() throws CoreException, IOException, RemoteExecutionException, RemoteSyncException {
-		final File localDir = new File(localDirectory);
-		final FileRepositoryBuilder repoBuilder = new FileRepositoryBuilder();
-		Repository repository = null;
-
-		try {
-			repository = repoBuilder.setWorkTree(localDir).build();
-		} catch (final IOException e) {
-			throw e;
-		}
-		git = new Git(repository);
-
-		// Create and configure local repository if it is not already present. Set the git instance.
-		if (repoReady() == false) {
-			try {
-				repository.create(false);
-			} catch (final IOException e) {
-				throw e;
-			}
-
-			// An initial commit to create the master branch.
-			try {
-				doCommit();
-			} catch (final RemoteSyncException e) {
-				throw e;
-			}
-		}
-
-		// Create remote directory if necessary.
-		try {
-			CommandRunner.createRemoteDirectory(connection, remoteDirectory);
-		} catch (final CoreException e) {
-			throw e;
-		}
-		
-		// Initialize remote directory if necessary
-		try {
-			doRemoteInit();
-		} catch (final IOException e) {
-			throw e;
-		} catch (final RemoteExecutionException e) {
-			throw e;
-		}
-
-		// Commit remote files if necessary
-		try {
-			doRemoteCommit();
-		} catch (final IOException e) {
-			throw e;
-		} catch (final RemoteExecutionException e) {
-			throw e;
-		}
-
-		return new Git(repository);
-	}
-	
-	/**
-	* Create and configure remote repository if it is not already present. Note that "git init" is "safe" on a repo already
-	* created, so we can simply rerun it each time.
-	* @throws IOException
-	* @throws RemoteExecutionException
-	*/
-	private void doRemoteInit() throws IOException, RemoteExecutionException {
-		String command = null;
-		CommandResults commandResults = null;
-
-		command = "git init"; //$NON-NLS-1$
-		try {
-			commandResults = CommandRunner.executeRemoteCommand(connection, command, remoteDirectory, null);
-		} catch (final IOException e) {
-			throw e;
-		} catch (final InterruptedException e) {
-			throw new RemoteExecutionException(e);
-		} catch (RemoteConnectionException e) {
-			throw new RemoteExecutionException(e);
-		}
-
-		if (commandResults.getExitCode() != 0) {
-			throw new RemoteExecutionException("remote git init failed with message: " + //$NON-NLS-1$
-																						commandResults.getStderr());
-		}
-	}
-	
-	/*
-	 * Do a commit on the remote repository. First we add and delete files from the git index as needed, and then we call "git commit"
-	 * TODO: Modified files already added by "git add" will not be found by "getRemoteFileStatus". Thus, a commit may not happen even
-	 * though there are outstanding changes. Note that this can only occur by accessing the repo outside of Eclipse.
-	 */
-	private void doRemoteCommit() throws IOException, RemoteExecutionException {
-		Set<String> filesToAdd = new HashSet<String>();
-		Set<String> filesToDelete = new HashSet<String>();
-		boolean needToCommit = false;
-		
-		try {
-			getRemoteFileStatus(filesToAdd, filesToDelete);
-			for (String fileName : filesToDelete) {
-				if (filesToAdd.contains(fileName)) {
-					filesToAdd.remove(fileName);
-				}
-			}
-			if (filesToAdd.size() > 0) {
-				addRemoteFiles(filesToAdd);
-				needToCommit = true;
-			}
-			if (filesToDelete.size() > 0) {
-				deleteRemoteFiles(filesToDelete);
-				needToCommit = true;
-			}
-			
-			if (needToCommit) {
-				commitRemoteFiles();
-			}
-		} catch (IOException e) {
-			throw e;
-		} catch (RemoteExecutionException e) {
-			throw e;
-		}
-	}
-	
-	/*
-	 * Do a "git commit" on the remote host
-	 */
-	private void commitRemoteFiles() throws IOException, RemoteExecutionException {
-		final String command = "git commit -m \"" + commitMessage + "\""; //$NON-NLS-1$ //$NON-NLS-2$
-		CommandResults commandResults = null;
-		
-		try {
-			commandResults = CommandRunner.executeRemoteCommand(connection, command, remoteDirectory, null);
-		} catch (final IOException e) {
-			throw e;
-		} catch (final InterruptedException e) {
-			throw new RemoteExecutionException(e);
-		} catch (RemoteConnectionException e) {
-			throw new RemoteExecutionException(e);
-		}
-		if (commandResults.getExitCode() != 0) {
-			throw new RemoteExecutionException("remote git commit failed with message: " + //$NON-NLS-1$
-																						 commandResults.getStderr());
-		}
-	}
-
-	/*
-	 * Do a "git rm <Files>" on the remote host
-	 */
-	private void deleteRemoteFiles(Set<String> filesToDelete) throws IOException, RemoteExecutionException {
-		String command = "git rm"; //$NON-NLS-1$
-		for (String fileName : filesToDelete) {
-			command = command.concat(" "); //$NON-NLS-1$
-			command = command.concat(fileName);
-		}
-		
-		CommandResults commandResults = null;
-		try {
-			commandResults = CommandRunner.executeRemoteCommand(connection, command, remoteDirectory, null);
-		} catch (final IOException e) {
-			throw e;
-		} catch (final InterruptedException e) {
-			throw new RemoteExecutionException(e);
-		} catch (RemoteConnectionException e) {
-			throw new RemoteExecutionException(e);
-		}
-		if (commandResults.getExitCode() != 0) {
-			throw new RemoteExecutionException("remote git rm failed with message: " + //$NON-NLS-1$
-																						 commandResults.getStderr());
-		}
-	}
-
-	/*
-	 * Do a "git add <Files>" on the remote host
-	 */
-	private void addRemoteFiles(Set<String> filesToAdd) throws IOException, RemoteExecutionException {
-		String command = "git add"; //$NON-NLS-1$
-		for (String fileName : filesToAdd) {
-			command = command.concat(" "); //$NON-NLS-1$
-			command = command.concat(fileName);
-		}
-		
-		CommandResults commandResults = null;
-		try {
-			commandResults = CommandRunner.executeRemoteCommand(connection, command, remoteDirectory, null);
-		} catch (final IOException e) {
-			throw e;
-		} catch (final InterruptedException e) {
-			throw new RemoteExecutionException(e);
-		} catch (RemoteConnectionException e) {
-			throw new RemoteExecutionException(e);
-		}
-		if (commandResults.getExitCode() != 0) {
-			throw new RemoteExecutionException("remote git add failed with message: " + //$NON-NLS-1$
-																						 commandResults.getStderr());
-		}
-	}
-
-	/*
-	 * Use "git ls-files" to obtain a list of files that need to be added or deleted from the git index. 
-	 */
-	private void getRemoteFileStatus(Set<String> filesToAdd, Set<String> filesToDelete)
-																					throws IOException, RemoteExecutionException {
-		final String command = "git ls-files -t --modified --others --deleted"; //$NON-NLS-1$
-		CommandResults commandResults = null;
-		
-		try {
-			commandResults = CommandRunner.executeRemoteCommand(connection, command, remoteDirectory, null);
-		} catch (final IOException e) {
-			throw e;
-		} catch (final InterruptedException e) {
-			throw new RemoteExecutionException(e);
-		} catch (RemoteConnectionException e) {
-			throw new RemoteExecutionException(e);
-		}
-		if (commandResults.getExitCode() != 0) {
-			throw new RemoteExecutionException("remote git ls-files failed with message: " + //$NON-NLS-1$
-																						 commandResults.getStderr());
-		}
-		
-		BufferedReader statusReader = new BufferedReader(new StringReader(commandResults.getStdout()));
-		String line = null;
-		while ((line = statusReader.readLine()) != null) {
-			String[] lineParts = line.split("\\s+"); //$NON-NLS-1$
-			if (lineParts.length < 2) {
-				continue;
-			}
-			if (lineParts[0].startsWith("R")) { //$NON-NLS-1$
-				filesToDelete.add(lineParts[1]);
-			} else {
-				filesToAdd.add(lineParts[1]);
-			}
-		}
-		statusReader.close();
-	}
-
-	// Subclass JGit's generic RemoteSession to set up running of remote commands using the available process builder.
-	public class PTPSession implements RemoteSession {
-		private URIish uri;
-
-		public PTPSession(URIish uri) {
-			this.uri = uri;
-		}
-
-		public Process exec(String command, int timeout) throws TransportException {
-			// TODO: Use a library for command splitting.
-			List<String> commandList = new LinkedList<String>();
-			commandList.add("sh"); //$NON-NLS-1$
-			commandList.add("-c"); //$NON-NLS-1$
-			commandList.add(command);
-			
-			try {
-				if (!connection.isOpen()) {
-					connection.open(null);
-				}
-				return (AbstractRemoteProcess) connection.getRemoteServices().getProcessBuilder(connection, commandList).start();
-			} catch (IOException e) {
-				throw new TransportException(uri, e.getMessage(), e);
-			} catch (RemoteConnectionException e) {
-				throw new TransportException(uri, e.getMessage(), e);
-			}
-			
-		}
-
-		public void disconnect() {
-			// Nothing to do				
-		}
-	}
-
-	/**
-	 * Creates the transport object that JGit uses for executing commands remotely.
-	 * 
-	 * @param remoteConfig
-	 * 				the remote configuration for our local Git repo
-	 * @return the transport
-	 * @throws RuntimeException
-	 *             if the requested transport is not supported by JGit.
-	 */
-	private void buildTransport(RemoteConfig remoteConfig) {
-		final URIish uri = buildURI();			
-		try {
-			transport = (TransportGitSsh) Transport.open(git.getRepository(), uri);
-		} catch (NotSupportedException e) {
-			throw new RuntimeException(e);
-		} catch (TransportException e) {
-			throw new RuntimeException(e);
-		}
-		
-		// Set the transport to use our own means of executing remote commands.
-		transport.setSshSessionFactory(new SshSessionFactory() {
-			@Override
-			public RemoteSession getSession(URIish uri, CredentialsProvider credentialsProvider, FS fs, int tms) throws TransportException {
-				return new PTPSession(uri);
-			}
-		});
-
-		transport.applyConfig(remoteConfig);
-	}
-
-	/**
-	 * Build the URI for the remote host as needed by the transport. Since the transport will use an external SSH session, we do
-	 * not need to provide user, host, or password. However, the function for opening a transport throws an exception if the host
-	 * is null or empty length. So we set it to a dummy string.
-	 * 
-	 * @return URIish
-	 */
-	private URIish buildURI() {
-		return new URIish()
-				// .setUser(connection.getUsername())
-				.setHost("/not/a/real/host") //$NON-NLS-1$
-				// .setPass("")
-				.setScheme("ssh") //$NON-NLS-1$
-				.setPath(remoteDirectory);
-	}
-
-	public void close() {
-		transport.close();
-	}
-
-	/**
-	 * Commits files in working directory. For now, we just commit all files. So adding ".", handles all files, including newly
-	 * created files, and setting the all flag (-a) ensures that deleted files are updated.
-	 * TODO: Figure out how to do this more efficiently, as was done remotely (using git ls-files)
-	 * 
-	 * @throws RemoteSyncException
-	 *             on problems committing.
-	 */
-	private void doCommit() throws RemoteSyncException {
-		final AddCommand addCommand = git.add();
-		addCommand.addFilepattern("."); //$NON-NLS-1$
-		try {
-			addCommand.call();
-		} catch (final NoFilepatternException e) {
-			throw new RemoteSyncException(e);
-		}
-
-		final CommitCommand commitCommand = git.commit();
-		commitCommand.setAll(true);
-		commitCommand.setMessage(commitMessage);
-
-		try {
-			commitCommand.call();
-		} catch (final GitAPIException e) {
-			throw new RemoteSyncException(e);
-		} catch (final UnmergedPathException e) {
-			throw new RemoteSyncException(e);
-		}
-	}
-
-	/**
-	 * @return the connection (IRemoteConnection)
-	 */
-	public IRemoteConnection getConnection() {
-		return connection;
-	}
-
-	/**
-	 * @return the localDirectory
-	 */
-	public String getLocalDirectory() {
-		return localDirectory;
-	}
-
-	/**
-	 * @return the remoteDirectory
-	 */
-	public String getRemoteDirectory() {
-		return remoteDirectory;
-	}
-
-	/**
-	 * 
-	 * @param localDirectory
-	 * @return If the repo has actually been initialized
-	 * TODO: Consider the ways this could go wrong. What if the directory name already ends in a slash? What if ".git" is a file or
-	 * does not contain the appropriate files?
-	 */
-	private boolean repoReady() {
-		final String repoDirectory = localDirectory + "/.git"; //$NON-NLS-1$
-		final File repoDir = new File(repoDirectory);
-		return repoDir.exists();
-	}
-
-	/**
-	 * Many of the listed exceptions appear to be unrecoverable, caused by errors in the initial setup. It is vital, though, that
-	 * failed syncs are reported and handled. So all exceptions are checked exceptions, embedded in a RemoteSyncException.
-	 * 
-	 * @throws RemoteSyncException
-	 *             for various problems sync'ing. The specific exception is nested within the RemoteSyncException. 
-	 * TODO: Consider possible platform dependency.
-	 */
-	public void syncLocalToRemote() throws RemoteSyncException {
-		// First commit changes to the local repository.
-		try {
-			doCommit();
-		} catch (final RemoteSyncException e) {
-			throw e;
-		}
-
-		// Then push them to the remote site.
-		try {
-			transport.push(NullProgressMonitor.INSTANCE, null);
-		} catch (final NotSupportedException e) {
-			throw new RemoteSyncException(e);
-		} catch (final TransportException e) {
-			throw new RemoteSyncException(e);
-		}
-
-		// Now remotely merge changes with master branch
-		CommandResults mergeResults;
-		final String command = "git merge " + remotePushBranch; //$NON-NLS-1$
-		try {
-			mergeResults = CommandRunner.executeRemoteCommand(connection, command, remoteDirectory, null);
-		} catch (final IOException e) {
-			throw new RemoteSyncException(e);
-		} catch (final InterruptedException e) {
-			throw new RemoteSyncException(e);
-		} catch (RemoteConnectionException e) {
-			throw new RemoteSyncException(e);
-		}
-
-		if (mergeResults.getExitCode() != 0) {
-			throw new RemoteSyncException(new RemoteExecutionException("Remote merge failed with message: " +  //$NON-NLS-1$
-																									mergeResults.getStderr()));
-		}
-	}
-
-	/**
-	 * @throws RemoteSyncException
-	 *             for various problems sync'ing. The specific exception is nested within the RemoteSyncException. Many of the
-	 *             listed exceptions appear to be unrecoverable, caused by errors in the initial setup. It is vital, though, that
-	 *             failed syncs are reported and handled. So all exceptions are checked exceptions, embedded in a
-	 *             RemoteSyncException.
-	 */
-	public void syncRemoteToLocal() throws RemoteSyncException {
-
-		// TODO: Figure out why pull doesn't work and why we have to fetch and merge instead.
-		// PullCommand pullCommand = gitConnection.getGit().pull().
-		// try {
-		// pullCommand.call();
-		// } catch (WrongRepositoryStateException e) {
-		// throw new RemoteSyncException(e);
-		// } catch (InvalidConfigurationException e) {
-		// throw new RemoteSyncException(e);
-		// } catch (DetachedHeadException e) {
-		// throw new RemoteSyncException(e);
-		// } catch (InvalidRemoteException e) {
-		// throw new RemoteSyncException(e);
-		// } catch (CanceledException e) {
-		// throw new RemoteSyncException(e);
-		// }
-
-		// First, commit in case any changes have occurred remotely.
-		try {
-			doRemoteCommit();
-		} catch (IOException e) {
-			throw new RemoteSyncException(e);
-		} catch (RemoteExecutionException e) {
-			throw new RemoteSyncException(e);
-		}
-		
-		// Next, fetch the remote repository
-		try {
-			transport.fetch(NullProgressMonitor.INSTANCE, null);
-		} catch (final NotSupportedException e) {
-			throw new RemoteSyncException(e);
-		} catch (final TransportException e) {
-			throw new RemoteSyncException(e);
-		}
-
-		// Now merge. Before merging we set the head for merging to master.
-		Ref masterRef = null;
-		try {
-			masterRef = git.getRepository().getRef("refs/remotes/" + remoteProjectName + "/master"); //$NON-NLS-1$ //$NON-NLS-2$
-		} catch (final IOException e) {
-			throw new RemoteSyncException(e);
-		}
-
-		final MergeCommand mergeCommand = git.merge().include(masterRef);
-		try {
-			mergeCommand.call();
-		} catch (final NoHeadException e) {
-			throw new RemoteSyncException(e);
-		} catch (final ConcurrentRefUpdateException e) {
-			throw new RemoteSyncException(e);
-		} catch (final CheckoutConflictException e) {
-			throw new RemoteSyncException(e);
-		} catch (final InvalidMergeHeadsException e) {
-			throw new RemoteSyncException(e);
-		} catch (final WrongRepositoryStateException e) {
-			throw new RemoteSyncException(e);
-		} catch (final NoMessageException e) {
-			throw new RemoteSyncException(e);
-		}
-	}
-}
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/GitServiceProvider.java b/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/GitServiceProvider.java
deleted file mode 100644
index 651b9e6..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/GitServiceProvider.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Oak Ridge 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:
- *    John Eblen - initial implementation
- *******************************************************************************/
-package org.eclipse.ptp.rdt.sync.git.core;
-
-import java.util.EnumSet;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.eclipse.core.resources.IProject;
-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.remote.core.exception.RemoteConnectionException;
-import org.eclipse.ptp.services.core.ServiceProvider;
-
-public class GitServiceProvider extends ServiceProvider implements ISyncServiceProvider {
-	public static final String ID = "org.eclipse.ptp.rdt.sync.git.core.GitServiceProvider"; //$NON-NLS-1$
-
-	private static final String GIT_LOCATION = "location"; //$NON-NLS-1$
-
-	private static final String GIT_CONNECTION_NAME = "connectionName"; //$NON-NLS-1$
-	private static final String GIT_SERVICES_ID = "servicesId"; //$NON-NLS-1$
-	private static final String GIT_PROJECT_NAME = "projectName"; //$NON-NLS-1$
-	private IProject fProject = null;
-	private String fLocation = null;
-	private IRemoteConnection fConnection = null;
-	private GitRemoteSyncConnection fSyncConnection = null;
-	
-	private static final Lock syncLock = new ReentrantLock();
-
-	/**
-	 * Get the remote directory that will be used for synchronization
-	 * 
-	 * @return path
-	 */
-	public String getLocation() {
-		if (fLocation == null) {
-			fLocation = getString(GIT_LOCATION, null);
-		}
-		return fLocation;
-	}
-
-	/**
-	 * Get the project to be synchronized
-	 * 
-	 * @return project
-	 */
-	public IProject getProject() {
-		if (fProject == null) {
-			final String name = getString(GIT_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) {
-			final String name = getString(GIT_CONNECTION_NAME, null);
-			if (name != null) {
-				final 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() {
-		final String id = getString(GIT_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
-	 * @throws RuntimeException if already set. Changing these local parameters is not currently supported but should be possible.
-	 */
-	public void setLocation(String location) {
-		if (fLocation != null) {
-			throw new RuntimeException("Changing of remote location is not supported."); //$NON-NLS-1$
-		}
-		fLocation = location;
-		putString(GIT_LOCATION, location);
-	}
-
-	/**
-	 * Set the project that will be synchronized
-	 * 
-	 * @param project
-	 *            project to synchronize
-	 */
-	public void setProject(IProject project) {
-		if (fProject != null) {
-			throw new RuntimeException("Changing of project is not supported."); //$NON-NLS-1$
-		}
-		fProject = project;
-		putString(GIT_PROJECT_NAME, project.getName());
-	}
-
-	/**
-	 * set the remote connection used for synchronization
-	 * 
-	 * @param conn
-	 *            remote connection
-	 * @throws RuntimeException if already set. Changing these local parameters is not currently supported but should be possible.
-	 */
-	public void setRemoteConnection(IRemoteConnection conn) {
-		if (fConnection != null) {
-			throw new RuntimeException("Changing of remote connection is not supported."); //$NON-NLS-1$
-		}
-		fConnection = conn;
-		putString(GIT_CONNECTION_NAME, conn.getName());
-	}
-
-	/**
-	 * Set the remote services used for the connection
-	 * 
-	 * @param services
-	 *            remote services
-	 * @throws RuntimeException if already set. Changing these local parameters is not currently supported but should be possible.
-	 */
-	public void setRemoteServices(IRemoteServices services) {
-		putString(GIT_SERVICES_ID, services.getId());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.sync.core.serviceproviders.ISyncServiceProvider#
-	 * synchronize(org.eclipse.core.resources.IResourceDelta, org.eclipse.core.runtime.IProgressMonitor, boolean)
-	 * TODO: use the force
-	 */
-	public void synchronize(IResourceDelta delta, IProgressMonitor monitor, EnumSet<SyncFlag> syncFlags) throws CoreException {
-		try {
-			syncLock.lock();
-			// TODO: Use delta information
-			// 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,
-			// force);
-			// } else if (resource instanceof IFolder) {
-			// System.out.println("ensureSync folder=" +
-			// child.getResource().getName());
-			// synchronize(child, monitor, force);
-			// } else if (resource instanceof IFile) {
-			// System.out.println("ensureSync file=" + child.getResource().getName());
-			// }
-			// }
-
-			// TODO: Review exception handling
-			if (fSyncConnection == null) {
-				// Open a remote sync connection
-				try {
-					fSyncConnection = new GitRemoteSyncConnection(this.getRemoteConnection(),
-							this.getProject().getLocation().toString(),	this.getLocation());
-				} catch (final RemoteSyncException e) {
-					throw e;
-				}
-			}
-
-			// Open remote connection if necessary
-			if (this.getRemoteConnection().isOpen() == false) {
-				try {
-					this.getRemoteConnection().open(monitor);
-				} catch (final RemoteConnectionException e) {
-					throw new RemoteSyncException(e);
-				}
-			}
-
-			// Sync local and remote. For now, do both ways each time.
-			// TODO: Sync more efficiently and appropriately to the situation.
-			try {
-				fSyncConnection.syncLocalToRemote();
-			} catch (final RemoteSyncException e) {
-				throw e;
-			}
-
-			try {
-				fSyncConnection.syncRemoteToLocal();
-			} catch (final RemoteSyncException e) {
-				throw e;
-			}
-
-		} finally {
-			syncLock.unlock();
-		}
-	}
-}
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/RemoteExecutionException.java b/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/RemoteExecutionException.java
deleted file mode 100644
index 8143366..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/RemoteExecutionException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Oak Ridge 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:
- *    John Eblen - initial implementation
- *******************************************************************************/
-package org.eclipse.ptp.rdt.sync.git.core;
-
-// Used for cases when a remote command fails. If it fails with an unexpected non-zero exit code, include the error message in the
-// exception. If failure is indicated by another exception, nest the other exception.
-public class RemoteExecutionException extends Exception {
-	private static final long serialVersionUID = 1L;
-
-	public RemoteExecutionException() {
-		super();
-	}
-
-	public RemoteExecutionException(String arg0) {
-		super(arg0);
-	}
-
-	public RemoteExecutionException(String arg0, Throwable arg1) {
-		super(arg0, arg1);
-	}
-
-	public RemoteExecutionException(Throwable arg0) {
-		super(arg0);
-	}
-}
\ No newline at end of file
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/RemoteSyncException.java b/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/RemoteSyncException.java
deleted file mode 100644
index fb438b5..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.core/src/org/eclipse/ptp/rdt/sync/git/core/RemoteSyncException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Oak Ridge 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:
- *    John Eblen - initial implementation
- *******************************************************************************/
-package org.eclipse.ptp.rdt.sync.git.core;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-// An exception to wrap exceptions for which the Remote Sync services cannot recover.
-public class RemoteSyncException extends CoreException {
-	private static final String pluginID = "org.eclipse.ptp.rdt.sync.git.core"; //$NON-NLS-1$
-	private static final long serialVersionUID = 1L;
-
-	public RemoteSyncException(String arg0) {
-		super(new Status(IStatus.ERROR, pluginID, arg0));
-	}
-
-	public RemoteSyncException(String arg0, Throwable arg1) {
-		super(new Status(IStatus.ERROR, pluginID, arg0, arg1));
-
-	}
-
-	public RemoteSyncException(Throwable arg0) {
-		super(new Status(IStatus.ERROR, pluginID, "", arg0)); //$NON-NLS-1$
-	}
-}
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.ui/.classpath b/rdt/org.eclipse.ptp.rdt.sync.git.ui/.classpath
deleted file mode 100644
index 5e4c1fe..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.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.git.ui/.project b/rdt/org.eclipse.ptp.rdt.sync.git.ui/.project
deleted file mode 100644
index c1dc85c..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rdt.sync.git.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.git.ui/META-INF/MANIFEST.MF b/rdt/org.eclipse.ptp.rdt.sync.git.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 8b95d6f..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.ptp.rdt.sync.git.ui;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.ptp.rdt.sync.git.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.git.core,
- org.eclipse.ptp.services.core
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.ui/build.properties b/rdt/org.eclipse.ptp.rdt.sync.git.ui/build.properties
deleted file mode 100644
index 0dc34f7..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.ui/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin.properties
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.ui/plugin.properties b/rdt/org.eclipse.ptp.rdt.sync.git.ui/plugin.properties
deleted file mode 100644
index 22ed707..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.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 Git UI
-plugin.provider = Eclipse.org
-
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.ui/plugin.xml b/rdt/org.eclipse.ptp.rdt.sync.git.ui/plugin.xml
deleted file mode 100644
index 224c19f..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.ui/plugin.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.ptp.rdt.sync.ui.synchronizeParticipants">
-      <synchronizeParticipant
-            class="org.eclipse.ptp.rdt.sync.git.ui.GitParticipant"
-            id="org.eclipse.ptp.rdt.sync.git.ui.gitParticipant"
-            name="Git">
-      </synchronizeParticipant>
-   </extension>
-
-</plugin>
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.ui/src/org/eclipse/ptp/rdt/sync/git/ui/Activator.java b/rdt/org.eclipse.ptp.rdt.sync.git.ui/src/org/eclipse/ptp/rdt/sync/git/ui/Activator.java
deleted file mode 100644
index 9d099d2..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.ui/src/org/eclipse/ptp/rdt/sync/git/ui/Activator.java
+++ /dev/null
@@ -1,60 +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.git.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.git.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.git.ui/src/org/eclipse/ptp/rdt/sync/git/ui/GitParticipant.java b/rdt/org.eclipse.ptp.rdt.sync.git.ui/src/org/eclipse/ptp/rdt/sync/git/ui/GitParticipant.java
deleted file mode 100644
index 6c70dcc..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.ui/src/org/eclipse/ptp/rdt/sync/git/ui/GitParticipant.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Oak Ridge 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:
- *    John Eblen - initial implementation
- *******************************************************************************/
-
-package org.eclipse.ptp.rdt.sync.git.ui;
-
-import java.net.URI;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.ptp.rdt.sync.core.serviceproviders.ISyncServiceProvider;
-import org.eclipse.ptp.rdt.sync.core.services.IRemoteSyncServiceConstants;
-import org.eclipse.ptp.rdt.sync.git.ui.messages.Messages;
-import org.eclipse.ptp.rdt.sync.git.core.GitServiceProvider;
-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.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * 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 GitParticipant 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.GitParticipant_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.GitParticipant_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.GitParticipant_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.GitParticipant_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.GitParticipant_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);
-								}
-							}
-						}
-					}
-				}
-			}
-		});
-	}
-
-	/*
-	 * (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);
-		GitServiceProvider provider = (GitServiceProvider) smm.getServiceProvider(syncService
-				.getProviderDescriptor(GitServiceProvider.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$
-	}
-
-	/**
-	 * @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.git.ui/src/org/eclipse/ptp/rdt/sync/git/ui/messages/Messages.java b/rdt/org.eclipse.ptp.rdt.sync.git.ui/src/org/eclipse/ptp/rdt/sync/git/ui/messages/Messages.java
deleted file mode 100644
index d38389d..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.ui/src/org/eclipse/ptp/rdt/sync/git/ui/messages/Messages.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 Oak Ridge 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:
- *    John Eblen - initial implementation
- *******************************************************************************/
-
-package org.eclipse.ptp.rdt.sync.git.ui.messages;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rdt.sync.git.ui.messages.messages"; //$NON-NLS-1$
-	public static String GitParticipant_browse;
-	public static String GitParticipant_connection;
-	public static String GitParticipant_location;
-	public static String GitParticipant_new;
-	public static String GitParticipant_remoteProvider;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/rdt/org.eclipse.ptp.rdt.sync.git.ui/src/org/eclipse/ptp/rdt/sync/git/ui/messages/messages.properties b/rdt/org.eclipse.ptp.rdt.sync.git.ui/src/org/eclipse/ptp/rdt/sync/git/ui/messages/messages.properties
deleted file mode 100644
index 4b9b208..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.git.ui/src/org/eclipse/ptp/rdt/sync/git/ui/messages/messages.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-GitParticipant_browse=Browse...
-GitParticipant_connection=Connection:
-GitParticipant_location=Location:
-GitParticipant_new=New...
-GitParticipant_remoteProvider=Remote Provider:
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 072ee87..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +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
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 3f6ddff..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.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.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 6ec0296..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.core/src/org/eclipse/ptp/rdt/sync/rsync/core/RSyncServiceProvider.java
+++ /dev/null
@@ -1,189 +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());
-	}
-
-
-}
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 d28ec95..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +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
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
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 70d7db4..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/plugin.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <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 12d4dd1..0000000
--- a/rdt/org.eclipse.ptp.rdt.sync.rsync.ui/src/org/eclipse/ptp/rdt/sync/rsync/ui/RSyncParticipant.java
+++ /dev/null
@@ -1,333 +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.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.operation.IRunnableContext;
-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.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.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;
-
-/**
- * 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);
-								}
-							}
-						}
-					}
-				}
-			}
-		});
-	}
-
-	/*
-	 * (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$
-	}
-
-	/**
-	 * @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 eacf2d2..0000000
--- a/releng/org.eclipse.ptp.releng/build.xml
+++ /dev/null
@@ -1,1023 +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.7M6-201103101119/eclipse-SDK-3.7M6-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.I201103111317/cdt-master-8.0.0-I201103111317.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"/>
-
-		<!-- 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>
-		
-		<!-- 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.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.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.help"/>
-			<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.help"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.lapi"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.mpi.analysis"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>			
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.mpi.analysis.cdt"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.mpi.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.openmp.analysis"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.openmp.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.openmp.ui.pv"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.upc"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.wizards"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/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.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.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 cedcd06..0000000
--- a/releng/org.eclipse.ptp.releng/buildsite.xml
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-   <description url="http://download.eclipse.org/tools/ptp/updates/helios">
-      Parallel Tools Platform Helios Update Site
-   </description>
-   <feature url="features/org.eclipse.ptp_@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.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.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 3ed092f..0000000
--- a/releng/org.eclipse.ptp.releng/maps/ptp.map
+++ /dev/null
@@ -1,176 +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.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.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.help=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/doc/org.eclipse.ptp.help
-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.help=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.help
-plugin@org.eclipse.ptp.pldt.lapi=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.lapi
-plugin@org.eclipse.ptp.pldt.mpi.analysis=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.mpi.analysis
-plugin@org.eclipse.ptp.pldt.mpi.analysis.cdt=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.mpi.analysis.cdt
-plugin@org.eclipse.ptp.pldt.mpi.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.mpi.core
-plugin@org.eclipse.ptp.pldt.openmp.analysis=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.openmp.analysis
-plugin@org.eclipse.ptp.pldt.openmp.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.openmp.core
-plugin@org.eclipse.ptp.pldt.openmp.ui.pv=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.openmp.ui.pv
-plugin@org.eclipse.ptp.pldt.upc=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.upc
-plugin@org.eclipse.ptp.pldt.wizards=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.wizards
-
-! ETF Plugins
-plugin@org.eclipse.ptp.etfw=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw
-plugin@org.eclipse.ptp.etfw.tau=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau
-plugin@org.eclipse.ptp.etfw.tau.papiselect=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau.papiselect
-plugin@org.eclipse.ptp.etfw.tau.perfdmf=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau.perfdmf
-plugin@org.eclipse.ptp.etfw.tau.selinst=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau.selinst
-plugin@org.eclipse.ptp.etfw.tau.selinstfort=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau.selinstfort
-plugin@org.eclipse.ptp.etfw.toolopts=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.toolopts
-plugin@org.eclipse.ptp.etfw.feedback=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.feedback
-
-! RDT Plugins
-plugin@org.eclipse.ptp.rdt.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core
-plugin@org.eclipse.ptp.rdt.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.ui
-plugin@org.eclipse.ptp.rdt.doc.user=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.doc.user
-plugin@org.eclipse.ptp.rdt.managedbuilder.xlc.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.managedbuilder.xlc.ui
-plugin@org.eclipse.ptp.rdt.managedbuilder.xlupc.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.managedbuilder.xlupc.ui
-plugin@org.eclipse.ptp.rdt.xlc=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.xlc
-plugin@org.eclipse.ptp.rdt.make.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.make.ui
-plugin@org.eclipse.ptp.rdt.core.remotejars=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core.remotejars
-plugin@org.eclipse.ptp.rdt.core.stubs=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core.stubs
-plugin@org.eclipse.ptp.rdt.server.dstore=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.server.dstore
-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
-
-! GEM Plugins
-plugin@org.eclipse.ptp.gem=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/gem/org.eclipse.ptp.gem
-plugin@org.eclipse.ptp.gem.help=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/gem/org.eclipse.ptp.gem.help
-
-! PPW Plugin
-plugin@org.eclipse.ptp.etfw.ppw=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/ppw/org.eclipse.ptp.etfw.ppw
-
-! SCI Plugin
-plugin@org.eclipse.ptp.sci=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/sci/org.eclipse.ptp.sci
-
-! Fragments
-fragment@org.eclipse.ptp.aix.ppc=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.aix.ppc
-fragment@org.eclipse.ptp.linux.ppc=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.linux.ppc
-fragment@org.eclipse.ptp.linux.x86=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.linux.x86
-fragment@org.eclipse.ptp.linux.x86_64=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.linux.x86_64
-fragment@org.eclipse.ptp.macosx.ppc=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.macosx.ppc
-fragment@org.eclipse.ptp.macosx.x86=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.macosx.x86
-fragment@org.eclipse.ptp.etfw.parallel=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.parallel
-
-! Tests
-plugin@org.eclipse.ptp.rdt.core.tests=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core.tests
-
diff --git a/releng/org.eclipse.ptp.releng/master/build.properties b/releng/org.eclipse.ptp.releng/master/build.properties
deleted file mode 100644
index bd40fe9..0000000
--- a/releng/org.eclipse.ptp.releng/master/build.properties
+++ /dev/null
@@ -1,104 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-#####################
-# Parameters describing how and where to execute the build.
-# Typical users need only update the following properties:
-#    baseLocation - where things you are building against are installed
-#    bootclasspath - The base jars to compile against (typicaly rt.jar)
-#    configs - the list of {os, ws, arch} configurations to build.  
-#
-# Of course any of the settings here can be overridden by spec'ing 
-# them on the command line (e.g., -DbaseLocation=d:/eclipse
-
-############# CVS CONTROL ################
-# The CVS tag to use when fetching the map files from the repository
-mapVersionTag=HEAD
-
-# The CVS tag to use when fetching elements to build.  By default the
-# builder will use whatever is in the maps.  Use this value to override
-# for example, when doing a nightly build out of HEAD
-# fetchTag=HEAD
-
-ptpTag=HEAD
-photranTag=HEAD
-
-############## BUILD / GENERATION CONTROL ################
-# The directory into which the build elements will be fetched and where
-# the build will take place.  buildDirectory and install should be the same
-# value.
-buildDirectory=build
-
-# Type of build.  Used in naming the build output.  Typically this value is
-# one of I, N, M, S, ...
-buildType=I
-
-# ID of the build.  Used in naming the build output.
-buildId=TestBuild
-
-# Label for the build.  Used in naming the build output
-buildLabel=${buildType}.${buildId}
-
-# Timestamp for the build.  Used in naming the build output
-timestamp=007
-
-# Base location for anything the build needs to compile against.  For example,
-# when building GEF, the baseLocation should be the location of a previously
-# installed Eclipse against which the GEF code will be compiled.
-baseLocation=
-
-#Os/Ws/Arch/nl of the eclipse specified by baseLocation
-#baseos
-#basews
-#basearch
-#basenl
-
-# The location underwhich all of the build output will be collected.  This will be
-# the root path in the resultant zip file.
-collPlace=eclipse
-
-# The directory  in which to execute zip of the ${collPlace} directory
-collBase=.
-
-# The list of {os, ws, arch} configurations to build.  This 
-# value is a '&' separated list of ',' separate triples.  For example, 
-#     configs=win32,win32,x86 & linux,motif,x86
-# By default the value is *,*,*
-configs= \
-	  aix,motif,ppc \
-    & linux,gtk,x86 \
-    & linux,gtk,x86_64 \
-    & linux,gtk,ppc \
-    & macosx,cocoa,ppc \
-    & macosx,cocoa,x86 \
-    & macosx,cocoa,x86_64 \
-    & win32,win32,x86
-
-outputUpdateJars=true
-groupConfigurations=true
-
-#Arguments to send to the zip executable
-zipargs=
-
-flattenDependencies=true
-
-############# JAVA COMPILER OPTIONS ##############
-# The location of the Java jars to compile against.  Typically the rt.jar for your JDK/JRE
-#bootclasspath=d:/ibm1.3.1/jre/lib/rt.jar
-
-javacDebugInfo=on
-javacVerbose=true
-javacFailOnError=false
-
-# The version of the source code
-javacSource=1.5
-
-# The version of the byte code targeted
-javacTarget=1.5
diff --git a/releng/org.eclipse.ptp.releng/master/customTargets.xml b/releng/org.eclipse.ptp.releng/master/customTargets.xml
deleted file mode 100644
index 77666e2..0000000
--- a/releng/org.eclipse.ptp.releng/master/customTargets.xml
+++ /dev/null
@@ -1,195 +0,0 @@
-<project name="Build specific targets and properties" default="noDefault" >
-
-<!-- ===================================================================== -->
-<!-- Run a given ${target} on all elements being built -->
-<!-- Add on <ant> task for each top level element being built. -->
-<!-- ===================================================================== -->
-<target name="allElements">
-	<ant antfile="${genericTargets}" target="${target}">
-		<property name="type" value="feature"/>
-		<property name="id" value="org.eclipse.ptp.master"/>
-	</ant>
-</target>
-
-<!-- ===================================================================== -->
-<!-- Targets to assemble the built elements for particular configurations  -->
-<!-- These generally call the generated assemble scripts (named in -->
-<!-- ${assembleScriptName}) but may also add pre and post processing -->
-<!-- Add one target for each root element and each configuration -->
-<!-- ===================================================================== -->
-
-<target name="assemble.org.eclipse.ptp.master.group.group.group">
-	<ant antfile="${assembleScriptName}" dir="${buildDirectory}">
-		<property name="archiveName" value="ptp-master-${ptpBranchVersion}-${buildId}.zip"/>
-	</ant>
-</target>
-	
-<!-- ===================================================================== -->
-<!-- Check out map files from correct repository -->
-<!-- Replace values for cvsRoot, package and mapVersionTag as desired. -->
-<!-- ===================================================================== -->
-<target name="getMapFiles">
-	<copy file="${builder}/../maps/ptp.map" todir="${buildDirectory}/maps"/>
-	<replace file="${buildDirectory}/maps/ptp.map">
-		<replacefilter token="@ptpTag@" value="${ptpTag}"/>
-	</replace>
-	<copy file="${builder}/../maps/photran.map" todir="${buildDirectory}/maps"/>
-	<replace file="${buildDirectory}/maps/photran.map">
-		<replacefilter token="@photranTag@" value="${photranTag}"/>
-	</replace>
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do before setup -->
-<!-- ===================================================================== -->
-<target name="preSetup">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do after setup but before starting the build proper -->
-<!-- ===================================================================== -->
-<target name="postSetup">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do before fetching the build elements -->
-<!-- ===================================================================== -->
-<target name="preFetch">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do after fetching the build elements -->
-<!-- ===================================================================== -->
-<target name="postFetch">
-	<condition property="patchesAvailable">
-		<available file="${builder}/patch.xml"/>
-	</condition>
-	<antcall target="applyPatches"/>
-</target>
-
-<target name="applyPatches" if="patchesAvailable">
-	<ant antfile="${builder}/patch.xml"/>
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do before generating the build scripts. -->
-<!-- ===================================================================== -->
-<target name="preGenerate">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do after generating the build scripts. -->
-<!-- ===================================================================== -->
-<target name="postGenerate">
-</target>
-
-
-<!-- ===================================================================== -->
-<!-- Steps to do before running the build.xmls for the elements being built. -->
-<!-- ===================================================================== -->
-<target name="preProcess">
-	<replace dir="${buildDirectory}/plugins" value="${timestamp}" token="@build@">
-		<include name="**/about.mappings" />
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.aix.ppc/BUILD">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.linux.ppc/BUILD">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.linux.x86/BUILD">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.linux.x86_64/BUILD">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.macosx.ppc/BUILD">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.macosx.x86/BUILD">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.debug.sdm/configure">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.debug.sdm/configure.in">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.proxy/configure">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.proxy/configure.in">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.utils/configure">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.utils/configure.in">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.rm.ibm.ll.proxy/configure">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.rm.ibm.ll.proxy/configure.in">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.rm.ibm.pe.proxy/configure">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.rm.ibm.pe.proxy/configure.in">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.rm.slurm.proxy/configure">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.rm.slurm.proxy/configure.in">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do after running the build.xmls for the elements being built. -->
-<!-- ===================================================================== -->
-<target name="postProcess">
-</target>
-
-
-<!-- ===================================================================== -->
-<!-- Steps to do before running assemble. -->
-<!-- ===================================================================== -->
-<target name="preAssemble">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do after  running assemble. -->
-<!-- ===================================================================== -->
-<target name="postAssemble">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do after the build is done. -->
-<!-- ===================================================================== -->
-<target name="postBuild">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do to test the build results -->
-<!-- ===================================================================== -->
-<target name="test">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do to publish the build results -->
-<!-- ===================================================================== -->
-<target name="publish">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Default target                                                        -->
-<!-- ===================================================================== -->
-<target name="noDefault">
-	<echo message="You must specify a target when invoking this file" />
-</target>
-
-</project>
diff --git a/releng/org.eclipse.ptp.releng/pack.properties b/releng/org.eclipse.ptp.releng/pack.properties
deleted file mode 100644
index 1cb5a5e..0000000
--- a/releng/org.eclipse.ptp.releng/pack.properties
+++ /dev/null
@@ -1 +0,0 @@
-pack200.default.args=-E4
diff --git a/releng/org.eclipse.ptp.releng/ptpbuild b/releng/org.eclipse.ptp.releng/ptpbuild
deleted file mode 100644
index 373c1b8..0000000
--- a/releng/org.eclipse.ptp.releng/ptpbuild
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/sh
-#
-# ptpbuild wrapper script
-#
-# Usage: ptpbuild [-t tag] [-d build_dir] [build_args]
-#
-# where
-#
-# tag is the CVS tag used to check out the releng project (default HEAD)
-# build_dir is the location that the build will take place
-# build_args are any arguments you want to pass to the build script
-#
-# set up anything environment specific that needs to be done before
-# launching the build script in the releng project
-
-LANG=en_US
-TAG=HEAD
-CDT_TAG=HEAD
-
-# main staging directory
-BUILD_DIR=/opt/public/download-staging.priv/tools/ptp/releng
-
-args=`getopt c:d:t: $*`
-
-if [ $? != 0 ]; then
-	echo "usage: ptpbuild [-t tag] [-c cdt_tag] [-d build_dir] [build_args]"
-	exit 1
-fi
-
-set -- $args
-for i
-do
-	case "$i"
-	in
-	-c) CDT_TAG="$2"; shift; shift;;
-	-d) BUILD_DIR="$2"; shift; shift;;
-	-t) TAG="$2"; shift; shift;;
-	--) shift; break;;
-	esac
-done
-
-BUILD_LOG=$BUILD_DIR/ptpbuild_${TAG}_`date +%Y%m%d%H%M`.log
-
-touch $BUILD_LOG
-chmod a+r $BUILD_LOG
-
-{
-# create the releng staging directory and go there
-mkdir -p $BUILD_DIR && cd $BUILD_DIR
-
-# remove the old build
-rm -fr org.eclipse.ptp_${TAG}
-
-# Check out the releng project
-cvs -d /cvsroot/tools co -r $TAG -d org.eclipse.ptp_${TAG} org.eclipse.ptp/releng/org.eclipse.ptp.releng
-
-# run the main script
-cd org.eclipse.ptp_${TAG}
-sh build.sh $*
-
-} >$BUILD_LOG 2>&1
-
-if grep -q 'BUILD FAILED' $BUILD_LOG; then
-	echo "BUILD FAILED. See $BUILD_LOG for details."
-fi
-
-exit 0
diff --git a/releng/org.eclipse.ptp.releng/update_versions b/releng/org.eclipse.ptp.releng/update_versions
deleted file mode 100644
index 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.core/.classpath b/rms/org.eclipse.ptp.rm.jaxb.core/.classpath
deleted file mode 100644
index c0b0b1f..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.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="eclipse"/>
-</classpath>
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/.project b/rms/org.eclipse.ptp.rm.jaxb.core/.project
deleted file mode 100644
index cdc22f8..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rm.jaxb.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/rms/org.eclipse.ptp.rm.jaxb.core/.settings/org.eclipse.jdt.core.prefs b/rms/org.eclipse.ptp.rm.jaxb.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 69ea46c..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Thu Feb 10 08:41:05 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.core/META-INF/MANIFEST.MF b/rms/org.eclipse.ptp.rm.jaxb.core/META-INF/MANIFEST.MF
deleted file mode 100644
index 5a2ac73..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,35 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.rm.jaxb.core;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.ptp.rm.jaxb.core.JAXBCorePlugin
-Bundle-Vendor: %pluginProvider
-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.eclipse.core.variables;bundle-version="3.2.400"
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.ptp.rm.jaxb.core,
- org.eclipse.ptp.rm.jaxb.core.data,
- org.eclipse.ptp.rm.jaxb.core.data.impl,
- org.eclipse.ptp.rm.jaxb.core.exceptions,
- org.eclipse.ptp.rm.jaxb.core.messages,
- org.eclipse.ptp.rm.jaxb.core.rm,
- org.eclipse.ptp.rm.jaxb.core.runnable,
- org.eclipse.ptp.rm.jaxb.core.runnable.command,
- org.eclipse.ptp.rm.jaxb.core.utils,
- org.eclipse.ptp.rm.jaxb.core.variables
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/about.html b/rms/org.eclipse.ptp.rm.jaxb.core/about.html
deleted file mode 100644
index 3f81093..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/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.jaxb.core/about.ini b/rms/org.eclipse.ptp.rm.jaxb.core/about.ini
deleted file mode 100644
index b26762a..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/about.ini
+++ /dev/null
@@ -1,27 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.png
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (not translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/about.mappings b/rms/org.eclipse.ptp.rm.jaxb.core/about.mappings
deleted file mode 100644
index bddaab4..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/about.properties b/rms/org.eclipse.ptp.rm.jaxb.core/about.properties
deleted file mode 100644
index 3eb8ef5..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/about.properties
+++ /dev/null
@@ -1,22 +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
-###############################################################################
-
-# NLS_MESSAGEFORMAT_NONE
-# NLS_ENCODING=UTF-8
-
-blurb=PTP Open MPI Support\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-Copyright (c) 2008 IBM Corporation, and others.  All rights reserved.\n\
-Visit http://www.eclipse.org/ptp\n
-
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/build.properties b/rms/org.eclipse.ptp.rm.jaxb.core/build.properties
deleted file mode 100644
index cbacfa1..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = eclipse/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               data/
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/data/defaults.properties b/rms/org.eclipse.ptp.rm.jaxb.core/data/defaults.properties
deleted file mode 100644
index fd2bd05..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/data/defaults.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-LAUNCH_CMD=${execPath}/${execName} ${progArgs}
-DEBUG_CMD=${debugExecPath}/${debugExecName} --server=0 ${debugArgs}
-PATH=
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/data/pbs-torque-generic.xml b/rms/org.eclipse.ptp.rm.jaxb.core/data/pbs-torque-generic.xml
deleted file mode 100644
index 99ca802..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/data/pbs-torque-generic.xml
+++ /dev/null
@@ -1,712 +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="pbs-torque-generic">
-	<control-data>
-		<property name="queues" visible="false"/>
-		<property name="stdout" visible="false">
-			<default>${rm:directory#value}/${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 ${rm:Account_Name#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -c">#PBS -c ${rm:Checkpoint#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -W depend=">#PBS -W depend=${rm:depend#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -q">#PBS -q ${rm:destination#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -C">#PBS -C ${rm:line#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -e">#PBS -e ${rm:Error_Path#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -V">#PBS -V ${rm:export_all#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -W group_list=">#PBS -W group_list=${rm:group_list#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -h">#PBS -h ${rm:Hold_Types#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -N">#PBS -N ${rm:Job_Name#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -j">#PBS -j ${rm:Join_Path#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -k">#PBS -k ${rm:Keep_Files#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -m">#PBS -m ${rm:Mail_Points#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -M">#PBS -M ${rm:Mail_Users#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -o">#PBS -o ${rm:Output_Path#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -p">#PBS -p ${rm:Priority#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -r">#PBS -r ${rm:Rerunnable#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -l arch=">#PBS -l arch=${rm:Resource_List.arch#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -l cput=">#PBS -l cput=${rm:Resource_List.cput#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -l file=">#PBS -l file=${rm:Resource_List.file#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -l host=">#PBS -l host=${rm:Resource_List.host#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -l mem=">#PBS -l mem=${rm:Resource_List.mem#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -l nice=">#PBS -l nice=${rm:Resource_List.nice#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -l nodes=">#PBS -l nodes=${rm:Resource_List.nodes#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -l ompthreads=">#PBS -l ompthreads=${rm:Resource_List.ompthreads#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -l pcput=">#PBS -l pcput=${rm:Resource_List.pcput#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -l pmem=">#PBS -l pmem=${rm:Resource_List.pmem#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -l pvmem=">#PBS -l pvmem=${rm:Resource_List.pvmem#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -l vmem=">#PBS -l vmem=${rm:Resource_List.vmem#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -l walltime=">#PBS -l walltime=${rm:Resource_List.walltime#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -S">#PBS -S ${rm:Shell_Path_List#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -W stagein=">#PBS -W stagein=${rm:stagein#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -W stageout=">#PBS -W stageout=${rm:stageout#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -u">#PBS -u ${rm:User_List#value}</arg>
-			</line>
-			<line>
-				<arg isUndefinedIfMatches="#PBS -v">#PBS -v ${rm:Variable_List#value}</arg>
-			</line>
-			<line>
-				<arg>MPI_ARGS="-np ${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=${rm:Job_Name#value}.out</arg>
-			</line>
-			<line>
-				<arg>MPI_COMMAND=${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 ${rm:directory#value}</arg>
-			</line>
-			<line>
-				<arg resolve="false">${MPI_COMMAND} </arg>
-				<arg>${rm:executablePath#value} ${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>${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>${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>${rm:@jobId#name}</arg>
-		</terminate-job>
-		<launch-tab>
-			<basic>
-				<!-- <basic sharedEnvironment="true"> -->
-				<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>${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>${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>${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>${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>${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>${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>${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>${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>${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>${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>${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>${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>${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>${rm:allAttributes#value}</arg>
-								<arg isUndefinedIfMatches=" destination=''"> destination='${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"/>
-</resource-manager-builder>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/data/resource_manager_type.xsd b/rms/org.eclipse.ptp.rm.jaxb.core/data/resource_manager_type.xsd
deleted file mode 100644
index b96a08a..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/data/resource_manager_type.xsd
+++ /dev/null
@@ -1,1046 +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 -->
-<!-- ****************************************************************************** -->
-<xs:schema targetNamespace="http://org.eclipse.ptp/rm" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:rm="http://org.eclipse.ptp/rm"
-	elementFormDefault="qualified">
-	<xs:element name="resource-manager-builder" type="rm:resource-manager-data"/>
-	<xs:complexType name="resource-manager-data">
-		<xs:annotation>
-			<xs:documentation>
-				It is assumed that the xml instance of the schema will bear a name which sufficiently distinguishes it from others
-				of a similar type; e.g., pbs-torque-v_2.3.7_abe is specific to an installation on the host abe, ll-v_4.0 suits all installations of
-				LoadLeveler version 4, etc.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="site-data" minOccurs="0" type="rm:site-type"/>
-			<xs:element name="control-data" type="rm:control-type"/>
-			<xs:element name="monitor-data" type="rm:monitor-type"/>
-		</xs:sequence>
-		<xs:attribute name="name" type="xs:string"/>
-	</xs:complexType>
-	<xs:complexType name="site-type">
-		<xs:annotation>
-			<xs:documentation>
-				An optional place to set default remote site information. The connections strings are URIs.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element minOccurs="0" name="control-connection" type="xs:string"/>
-			<xs:element minOccurs="0" name="monitor-connection" type="xs:string"/>
-		</xs:sequence>
-	</xs:complexType>
-	<xs:complexType name="control-type">
-		<xs:annotation>
-			<xs:documentation>
-				The top-level control elements define the properties and attributes, files to be staged, job script to be generated, commands
-				specific to the resource manager, and the layout of the Launch Tab.
-				The resource manager implementation constructs a variable map
-				serving as the resource manager "environment"; variables are dereferenced in the configuration file via ${rm:name} or
-				${rm:name#getterName}; all properties and attributes defined in the configuration are mapped. The following hard-coded variables
-				are also added at runtime:
-				<!-- from runtime configuration information -->
-				control.user.name
-				control.address
-				<!-- from the other Run Configuration tabs -->
-				executablePath
-				progArgs
-				directory
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="property" minOccurs="0" maxOccurs="unbounded" type="rm:property-type"/>
-			<xs:element name="attribute" minOccurs="0" maxOccurs="unbounded" type="rm:attribute-type"/>
-			<xs:element name="managed-files" minOccurs="0" type="rm:managed-files-type"/>
-			<xs:element name="script" minOccurs="0" type="rm:script-type"/>
-			<xs:element name="start-up-command" minOccurs="0" maxOccurs="unbounded" type="rm:command-type">
-				<xs:annotation>
-					<xs:documentation>
-						Arbitrary commands which need to be run on startup.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:choice>
-				<xs:annotation>
-					<xs:documentation>
-						Currently a configuration may have only a batch or an interactive mode. Thus it may have only two submission
-						modes, a run and a debug, for the given type. In the future we may allow all four to coexist in a single configuration.
-					</xs:documentation>
-				</xs:annotation>
-				<xs:sequence>
-					<xs:element name="submit-interactive" type="rm:command-type"/>
-					<xs:element name="submit-interactive-debug" type="rm:command-type" minOccurs="0"/>
-				</xs:sequence>
-				<xs:sequence>
-					<xs:element name="submit-batch" type="rm:command-type"/>
-					<xs:element name="submit-batch-debug" type="rm:command-type" minOccurs="0"/>
-				</xs:sequence>
-			</xs:choice>
-			<xs:element name="get-job-status" type="rm:command-type" minOccurs="0">
-				<xs:annotation>
-					<xs:documentation>
-						A user-initiated (on demand) request to refresh the status information for a submission. Normal (polled) updates
-						are the responsibility of the monitor. The command nevertheless needs to be implemented in most cases, as it will be called
-						internally just after submission.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="terminate-job" type="rm:command-type" minOccurs="0">
-				<xs:annotation>
-					<xs:documentation>
-						NOTE: if the submission type is interactive, this command does not need to be implemented, as the process
-						termination will be handled
-						internally.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="suspend-job" type="rm:command-type" minOccurs="0"/>
-			<xs:element name="resume-job" type="rm:command-type" minOccurs="0"/>
-			<xs:element name="hold-job" type="rm:command-type" minOccurs="0"/>
-			<xs:element name="release-job" type="rm:command-type" minOccurs="0"/>
-			<xs:element name="shut-down-command" minOccurs="0" maxOccurs="unbounded" type="rm:command-type">
-				<xs:annotation>
-					<xs:documentation>
-						Arbitrary commands which need to be run on shutdown.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="launch-tab" minOccurs="0" type="rm:launch-tab-type"/>
-		</xs:sequence>
-	</xs:complexType>
-	<xs:complexType name="property-type">
-		<xs:annotation>
-			<xs:documentation>
-				A property is any variable necessary for the functioning of the resource manager. Properties often (but not
-				necessarily) are not visible. The value for properties can by any primitive type, or lists or maps of strings. If stdout from a
-				scheduled job is to be delivered to the client, the "stdout" property should be included in the resource manager property set.
-				NOTE: the untyped "value" element on properties is for internal use only; to give a predefined (primitive) value, use the "default"
-				element along with the "type" attribute.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="default" minOccurs="0" type="xs:string"/>
-			<xs:element name="value" minOccurs="0"/>
-		</xs:sequence>
-		<xs:attribute name="name" type="xs:string"/>
-		<xs:attribute name="type" type="xs:string" default="java.lang.String"/>
-		<xs:attribute name="visible" type="xs:boolean" default="true">
-			<xs:annotation>
-				<xs:documentation>
-					If this is set to false, the property or attribute is marked as being for internal use only, and will not be made
-					available for representation via Launch Tab widgets.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="readOnly" type="xs:boolean" default="false">
-			<xs:annotation>
-				<xs:documentation>
-					Attribute or property has a predetermined value which the user can inspect but not modify.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="attribute-type">
-		<xs:annotation>
-			<xs:documentation>
-				An attribute is an externally defined variable, most often associated with the scheduler system itself; the most
-				common attributes are those pertaining to the job dimensions and requested resources. The value for attribute can by any primitive
-				type. NOTE: the untyped "value" element on attributes is for internal use only; to give a predefined (primitive) value, use the
-				"default" element along with the "type" attribute.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="description" type="xs:string">
-				<xs:annotation>
-					<xs:documentation>
-						A brief (one sentence) explanation of the attribute.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="tooltip" minOccurs="0" type="xs:string">
-				<xs:annotation>
-					<xs:documentation>
-						A somewhat more detailed explanation of format and usage. This will be displayed as a tooltip in the UI.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="choice" minOccurs="0" type="xs:string">
-				<xs:annotation>
-					<xs:documentation>
-						A predetermined, fixed set of values to choose from; these are comma-delimited and will appear as the items of a
-						combo-box.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="default" minOccurs="0" type="xs:string"/>
-			<xs:element name="value" minOccurs="0"/>
-			<xs:element name="validator" minOccurs="0" type="rm:validator-type">
-				<xs:annotation>
-					<xs:documentation>
-						The user-entered value is immediately checked against these constraints.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-		</xs:sequence>
-		<xs:attribute name="name" use="required" type="xs:string"/>
-		<xs:attribute name="type" use="required" type="xs:string"/>
-		<xs:attribute name="visible" type="xs:boolean" default="true"/>
-		<xs:attribute name="status" type="xs:string"/>
-		<xs:attribute name="readOnly" type="xs:boolean" default="false">
-			<xs:annotation>
-				<xs:documentation>
-					Attribute or property has a predetermined value which the user can inspect but not modify.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="min" type="xs:int">
-			<xs:annotation>
-				<xs:documentation>
-					For integer values, to be displayed as spinner boxes.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="max" type="xs:int">
-			<xs:annotation>
-				<xs:documentation>
-					For integer values, to be displayed as spinner boxes.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="managed-files-type">
-		<xs:annotation>
-			<xs:documentation>
-				List of files to be staged in connection with the job submission. NOTE: if the resource manager uses a script, its
-				staging as a file is handled automatically and need not be included among the set of managed files. A reserved property,
-				"managed_file_for_script", should be used to reference this file's path on the target resource.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="file-staging-location" minOccurs="0" type="xs:string">
-				<xs:annotation>
-					<xs:documentation>
-						The default is $USER_HOME/.eclipsesettings on the target resource.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="file" maxOccurs="unbounded" type="rm:managed-file-type"/>
-		</xs:sequence>
-	</xs:complexType>
-	<xs:complexType name="script-type">
-		<xs:annotation>
-			<xs:documentation>
-				The script element specifies the contents line by line. Each line can be an arbitrary set of arguments, each of
-				which can be optionally resolved in the environment, and which can be checked to see if the result after resolution should be
-				considered undefined and thus not included in the contents. The insertEnvironmentAfter (line number) indicates where to insert
-				extra environment variable definitions passed in from the Environment Tab, if any.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="line" maxOccurs="unbounded" type="rm:line-type"/>
-		</xs:sequence>
-		<xs:attribute name="insertEnvironmentAfter" type="xs:int" default="-1"/>
-	</xs:complexType>
-	<xs:complexType name="line-type">
-		<xs:sequence>
-			<xs:element name="arg" minOccurs="0" maxOccurs="unbounded" type="rm:arg-type"/>
-		</xs:sequence>
-	</xs:complexType>
-	<xs:complexType name="command-type">
-		<xs:sequence>
-			<xs:element name="arg" maxOccurs="unbounded" type="rm:arg-type"/>
-			<xs:element name="environment" minOccurs="0" maxOccurs="unbounded" type="rm:name-value-pair-type"/>
-			<xs:element name="stdout-parser" minOccurs="0" type="rm:tokenizer-type"/>
-			<xs:element name="stderr-parser" minOccurs="0" type="rm:tokenizer-type"/>
-			<xs:element name="redirect-parser" minOccurs="0" type="rm:tokenizer-type"/>
-		</xs:sequence>
-		<xs:attribute name="name" use="required" type="xs:string"/>
-		<xs:attribute name="directory" type="xs:string"/>
-		<xs:attribute name="redirectStderr" type="xs:boolean" default="false"/>
-		<xs:attribute name="streamBufferLimit" type="xs:int" default="-1"/>
-		<xs:attribute name="replaceEnvironment" type="xs:boolean" default="false"/>
-		<xs:attribute name="waitForId" type="xs:boolean" default="true"/>
-		<xs:attribute name="ignoreExitStatus" type="xs:boolean" default="false"/>
-	</xs:complexType>
-	<xs:complexType name="launch-tab-type">
-		<xs:annotation>
-			<xs:documentation>
-				A recursive description of the UI element associated with the control part, the Launch Tab.
-				As in:
-				org.eclipse.ptp.rm.ui.launch.ExtendableRMLaunchConfigurationDynamicTab, provides a top-level "switch" between controllers. There
-				are a maximum of three top-level tabs or "pages"; the basic and advanced (the names are placeholders which need not correspond to
-				their actual content or usage, and can be changed) controllers are configurable; for the custom controller, see below. (see below).
-				The SWT-related types generally expose the fields of their associated Java class.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="basic" minOccurs="0" type="rm:tab-controller-type"/>
-			<xs:element name="advanced" minOccurs="0" type="rm:tab-controller-type"/>
-			<xs:element name="custom-controller" minOccurs="0" type="xs:string">
-				<xs:annotation>
-					<xs:documentation>
-						Fixed type; to be used with scheduler systems which accept submission scripts. Allows the user to browse the
-						workspace to open and edit a custom script. Set the text of this element to the title to appear in the top-level folder tab.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-		</xs:sequence>
-	</xs:complexType>
-	<xs:complexType name="validator-type">
-		<xs:annotation>
-			<xs:documentation>
-				A regular expression or an EFS string used to validate an attribute value.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:sequence>
-				<xs:element name="regex" minOccurs="0" type="rm:regex-type"/>
-				<xs:element name="file-info" minOccurs="0" type="rm:file-match-type"/>
-			</xs:sequence>
-			<xs:element name="error-message" minOccurs="0" type="xs:string"/>
-		</xs:sequence>
-	</xs:complexType>
-	<xs:complexType name="managed-file-type">
-		<xs:annotation>
-			<xs:documentation>
-				If 'contents' is present, the file is written.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:choice>
-			<xs:element name="contents" type="xs:string"/>
-			<xs:element name="path" type="xs:string"/>
-		</xs:choice>
-		<xs:attribute name="name" use="required"/>
-		<xs:attribute name="uniqueIdPrefix" type="xs:boolean" default="false"/>
-		<xs:attribute name="resolveContents" type="xs:boolean" default="true"/>
-		<xs:attribute name="deleteAfterUse" type="xs:boolean" default="false"/>
-	</xs:complexType>
-	<xs:complexType name="file-match-type">
-		<xs:attribute name="efsAttributes" type="xs:string">
-			<xs:annotation>
-				<xs:documentation>
-					An or'd string of tags corresponding to the EFS integer constants; these include:
-					ATTRIBUTE_READ_ONLY
-					ATTRIBUTE_IMMUTABLE
-					ATTRIBUTE_OWNER_READ
-					ATTRIBUTE_OWNER_WRITE
-					ATTRIBUTE_OWNER_EXECUTE
-					ATTRIBUTE_GROUP_READ
-					ATTRIBUTE_GROUP_WRITE
-					ATTRIBUTE_GROUP_EXECUTE
-					ATTRIBUTE_OTHER_READ
-					ATTRIBUTE_OTHER_WRITE
-					ATTRIBUTE_OTHER_EXECUTE
-					ATTRIBUTE_EXECUTABLE
-					ATTRIBUTE_ARCHIVE
-					ATTRIBUTE_HIDDEN
-					ATTRIBUTE_SYMLINK
-					ATTRIBUTE_LINK_TARGET
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="lastModifiedBefore" type="xs:string">
-			<xs:annotation>
-				<xs:documentation>
-					use "yyyy/MM/dd HH:mm:ss" as format.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="lastModifiedAfter" type="xs:string">
-			<xs:annotation>
-				<xs:documentation>
-					use "yyyy/MM/dd HH:mm:ss" as format.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="length" type="xs:long"/>
-		<xs:attribute name="isDirectory" type="xs:boolean" default="false"/>
-	</xs:complexType>
-	<xs:complexType name="name-value-pair-type">
-		<xs:attribute name="name" use="required" type="xs:string"/>
-		<xs:attribute name="value" type="xs:string"/>
-	</xs:complexType>
-	<xs:complexType name="tab-controller-type">
-		<xs:sequence>
-			<xs:element name="title" type="xs:string"/>
-			<xs:choice maxOccurs="unbounded">
-				<xs:element name="tab-folder" type="rm:tab-folder-type"/>
-				<xs:element name="composite" type="rm:composite-type"/>
-			</xs:choice>
-		</xs:sequence>
-		<xs:attribute name="sharedEnvironment" type="xs:boolean" default="false">
-			<xs:annotation>
-				<xs:documentation>
-					The default means that each tab is a separate view or selection into the global env, and it is this subset which
-					will be passed on the launch command. Setting this property to true means that the tab will pass all selected elements of the
-					entire shared enviroment to the resource manager at launch.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="regex-type" mixed="true">
-		<xs:attribute name="flags" type="xs:string">
-			<xs:annotation>
-				<xs:documentation>
-					An or'd string of the Java Regex flags:
-					CASE_INSENSITIVE
-					MULTILINE
-					DOTALL
-					UNICODE_CASE
-					CANON_EQ
-					LITERAL
-					COMMENTS
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="split" type="xs:boolean" default="false">
-			<xs:annotation>
-				<xs:documentation>
-					Use the regex to perform a Java "split" on the segment rather than a match.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="expression" type="xs:string">
-			<xs:annotation>
-				<xs:documentation>
-					The actual pattern to match.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:complexType mixed="true" name="arg-type">
-		<xs:attribute name="isUndefinedIfMatches" type="xs:string">
-			<xs:annotation>
-				<xs:documentation>
-					If this regex is defined, an equality check on the arg will be run and if satisfied the arg will be eliminated
-					from the list (the default behavior is not to include null or zero-length args).
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="resolve" type="xs:boolean" default="true">
-			<xs:annotation>
-				<xs:documentation>
-					The text of the argument will be resolved in the resource manager environment. It is important to turn this off
-					if
-					you wish to embed, for instance, shell variables (e.g., $HOME).
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="tokenizer-type">
-		<xs:annotation>
-			<xs:documentation>
-				These are attached to the stdout or stderr streams in order to capture the output of the command and add values to
-				or side-effect the resource manager environment.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:choice>
-				<xs:element name="type" type="xs:string">
-					<xs:annotation>
-						<xs:documentation>
-							Place to provide a custom tokenizer; type is the extension id contributing to
-							"org.eclipse.ptp.rm.jaxb.core.streamParserTokenizer".
-						</xs:documentation>
-					</xs:annotation>
-				</xs:element>
-				<xs:element name="target" maxOccurs="unbounded" type="rm:target-type"/>
-			</xs:choice>
-			<xs:element name="exit-on" minOccurs="0" type="rm:regex-type">
-				<xs:annotation>
-					<xs:documentation>
-						Stop tokenization and exit the parser read operation when this pattern is encountered.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="exit-after" minOccurs="0" type="rm:regex-type">
-				<xs:annotation>
-					<xs:documentation>
-						Stop tokenization and exit the parser read operation after processing the segment matching this pattern.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-		</xs:sequence>
-		<xs:attribute name="delim" type="xs:string">
-			<xs:annotation>
-				<xs:documentation>
-					Segment the stream using this delimiter. Must be a single character (escaped or non-escaped).
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="includeDelim" type="xs:boolean" default="false">
-			<xs:annotation>
-				<xs:documentation>
-					Include the delimiting character in the segment to be matched.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="maxMatchLen" type="xs:int" default="0">
-			<xs:annotation>
-				<xs:documentation>
-					Do not break up the stream according to a delimiter, but read this many characters at a time from it. NOTE: in
-					this mode, the user should be sure that an expected expansion the regex pattern will not exceed the buffer length (and should
-					adjust that length accordingly).
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="all" type="xs:boolean" default="false">
-			<xs:annotation>
-				<xs:documentation>
-					Instead of reading "forward", consume the entire stream, holding only the last portion in a buffer, to be matched
-					after the end of the stream has been reached. This is useful if you need to look for a segment or segments whose position is
-					defined from the end of the output, but you do not know in advance the actual output length.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="save" type="xs:int" default="0">
-			<xs:annotation>
-				<xs:documentation>
-					Use this in connection with "all": save the last N segments (i.e, chars, lines, etc.).
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="applyToAll" type="xs:boolean" default="false">
-			<xs:annotation>
-				<xs:documentation>
-					Means take the unmatched part of the read stream and pass it to the next target, even if there was a previous
-					match; this allows you to capture more than one regex pattern per delimited stream segment (see tokenizer-examples.xml, ex. 6).
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="tab-folder-type">
-		<xs:sequence>
-			<xs:element name="layout" minOccurs="0" type="rm:layout-type"/>
-			<xs:element name="layout-data" minOccurs="0" type="rm:layout-data-type"/>
-			<xs:element name="item" maxOccurs="unbounded" type="rm:tab-item-type"/>
-			<xs:element name="tooltip" minOccurs="0" type="xs:string"/>
-			<xs:element name="font" minOccurs="0" type="rm:font-type"/>
-		</xs:sequence>
-		<xs:attribute name="style" type="xs:string">
-			<xs:annotation>
-				<xs:documentation>
-					The style attribute on the UI parts is a string which looks like the OR'd integer specification; e.g.,
-					"SWT.BORDER | SWT.LEFT".
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="background" type="xs:string"/>
-	</xs:complexType>
-	<xs:complexType name="composite-type">
-		<xs:sequence>
-			<xs:element name="layout" minOccurs="0" type="rm:layout-type"/>
-			<xs:element name="layout-data" minOccurs="0" type="rm:layout-data-type"/>
-			<xs:element name="font" minOccurs="0" type="rm:font-type"/>
-			<xs:element name="title" minOccurs="0" type="xs:string"/>
-			<xs:choice maxOccurs="unbounded">
-				<xs:element name="tab-folder" type="rm:tab-folder-type"/>
-				<xs:element name="composite" type="rm:composite-type"/>
-				<xs:element name="widget" type="rm:widget-type"/>
-				<xs:element name="viewer" type="rm:attribute-viewer-type"/>
-			</xs:choice>
-		</xs:sequence>
-		<xs:attribute name="group" type="xs:boolean" default="false"/>
-		<xs:attribute name="style" type="xs:string"/>
-		<xs:attribute name="background" type="xs:string"/>
-	</xs:complexType>
-	<xs:complexType name="tab-item-type">
-		<xs:sequence>
-			<xs:element name="title" type="xs:string"/>
-			<xs:element name="tooltip" minOccurs="0" type="xs:string"/>
-			<xs:element name="font" minOccurs="0" type="rm:font-type"/>
-			<xs:choice maxOccurs="unbounded">
-				<xs:element name="composite" type="rm:composite-type"/>
-				<xs:element name="tab-folder" type="rm:tab-folder-type"/>
-				<xs:element name="widget" type="rm:widget-type"/>
-			</xs:choice>
-		</xs:sequence>
-		<xs:attribute name="style" type="xs:string"/>
-		<xs:attribute name="background" type="xs:string"/>
-	</xs:complexType>
-	<xs:complexType name="layout-type">
-		<xs:choice>
-			<xs:element name="fill-layout" type="rm:fill-layout-type"/>
-			<xs:element name="row-layout" type="rm:row-layout-type"/>
-			<xs:element name="grid-layout" type="rm:grid-layout-type"/>
-			<xs:element name="form-layout" type="rm:form-layout-type"/>
-		</xs:choice>
-	</xs:complexType>
-	<xs:complexType name="layout-data-type">
-		<xs:choice>
-			<xs:element name="row-data" type="rm:row-data-type"/>
-			<xs:element name="grid-data" type="rm:grid-data-type"/>
-			<xs:element name="form-data" type="rm:form-data-type"/>
-		</xs:choice>
-	</xs:complexType>
-	<xs:complexType name="fill-layout-type">
-		<xs:attribute name="type" type="xs:string"/>
-		<xs:attribute name="marginHeight" type="xs:int"/>
-		<xs:attribute name="marginWidth" type="xs:int"/>
-		<xs:attribute name="spacing" type="xs:int"/>
-	</xs:complexType>
-	<xs:complexType name="row-layout-type">
-		<xs:attribute name="center" type="xs:boolean" default="false"/>
-		<xs:attribute name="justify" type="xs:boolean" default="false"/>
-		<xs:attribute name="fill" type="xs:boolean" default="false"/>
-		<xs:attribute name="pack" type="xs:boolean" default="false"/>
-		<xs:attribute name="marginHeight" type="xs:int"/>
-		<xs:attribute name="marginWidth" type="xs:int"/>
-		<xs:attribute name="marginTop" type="xs:int"/>
-		<xs:attribute name="marginBottom" type="xs:int"/>
-		<xs:attribute name="marginLeft" type="xs:int"/>
-		<xs:attribute name="marginRight" type="xs:int"/>
-		<xs:attribute name="spacing" type="xs:int"/>
-	</xs:complexType>
-	<xs:complexType name="grid-layout-type">
-		<xs:attribute name="numColumns" type="xs:int"/>
-		<xs:attribute name="makeColumnsEqualWidth" type="xs:boolean" default="true"/>
-		<xs:attribute name="marginHeight" type="xs:int"/>
-		<xs:attribute name="marginWidth" type="xs:int"/>
-		<xs:attribute name="marginTop" type="xs:int"/>
-		<xs:attribute name="marginBottom" type="xs:int"/>
-		<xs:attribute name="marginLeft" type="xs:int"/>
-		<xs:attribute name="marginRight" type="xs:int"/>
-		<xs:attribute name="horizontalSpacing" type="xs:int"/>
-		<xs:attribute name="verticalSpacing" type="xs:int"/>
-	</xs:complexType>
-	<xs:complexType name="form-layout-type">
-		<xs:attribute name="marginHeight" type="xs:int"/>
-		<xs:attribute name="marginWidth" type="xs:int"/>
-		<xs:attribute name="marginTop" type="xs:int"/>
-		<xs:attribute name="marginBottom" type="xs:int"/>
-		<xs:attribute name="marginLeft" type="xs:int"/>
-		<xs:attribute name="marginRight" type="xs:int"/>
-		<xs:attribute name="spacing" type="xs:int"/>
-	</xs:complexType>
-	<xs:complexType name="row-data-type">
-		<xs:attribute name="height" type="xs:int"/>
-		<xs:attribute name="width" type="xs:int"/>
-		<xs:attribute name="exclude" type="xs:boolean" default="false"/>
-	</xs:complexType>
-	<xs:complexType name="grid-data-type">
-		<xs:attribute name="style" type="xs:string"/>
-		<xs:attribute name="horizontalAlign" type="xs:string"/>
-		<xs:attribute name="verticalAlign" type="xs:string"/>
-		<xs:attribute name="grabExcessHorizontal" type="xs:boolean" default="true"/>
-		<xs:attribute name="grabExcessVertical" type="xs:boolean" default="false"/>
-		<xs:attribute name="horizontalSpan" type="xs:int"/>
-		<xs:attribute name="verticalSpan" type="xs:int"/>
-		<xs:attribute name="horizontalIndent" type="xs:int"/>
-		<xs:attribute name="verticalIndent" type="xs:int"/>
-		<xs:attribute name="minHeight" type="xs:int"/>
-		<xs:attribute name="minWidth" type="xs:int"/>
-		<xs:attribute name="heightHint" type="xs:int"/>
-		<xs:attribute name="widthHint" type="xs:int"/>
-	</xs:complexType>
-	<xs:complexType name="form-data-type">
-		<xs:sequence>
-			<xs:element name="top" minOccurs="0" type="rm:form-attachment-type"/>
-			<xs:element name="bottom" minOccurs="0" type="rm:form-attachment-type"/>
-			<xs:element name="left" minOccurs="0" type="rm:form-attachment-type"/>
-			<xs:element name="right" minOccurs="0" type="rm:form-attachment-type"/>
-		</xs:sequence>
-		<xs:attribute name="height" type="xs:int"/>
-		<xs:attribute name="width" type="xs:int"/>
-	</xs:complexType>
-	<xs:complexType name="form-attachment-type">
-		<xs:attribute name="alignment" type="xs:string"/>
-		<xs:attribute name="numerator" type="xs:int"/>
-		<xs:attribute name="denominator" type="xs:int"/>
-		<xs:attribute name="offset" type="xs:int"/>
-	</xs:complexType>
-	<xs:complexType name="widget-type">
-		<xs:annotation>
-			<xs:documentation>
-				Widget foreground, background (color) and font are in principle configurable, though the font setting may not
-				always work.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="layout-data" minOccurs="0" type="rm:layout-data-type"/>
-			<xs:element name="font" minOccurs="0" type="rm:font-type"/>
-			<xs:element name="tooltip" minOccurs="0" type="xs:string"/>
-			<xs:element name="items-from" minOccurs="0" type="xs:string">
-				<xs:annotation>
-					<xs:documentation>
-						Combo items taken from the value field of an attribute or property.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="fixed-text" minOccurs="0" type="xs:string">
-				<xs:annotation>
-					<xs:documentation>
-						Display text set once from the environment on loading; e.g, ${rm:Job_Name#description}.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="dynamic-text" minOccurs="0">
-				<xs:annotation>
-					<xs:documentation>
-						Changing display text; the args will be refreshed against the environment each time the Launch Tab is updated.
-					</xs:documentation>
-				</xs:annotation>
-				<xs:complexType>
-					<xs:sequence>
-						<xs:element name="arg" maxOccurs="unbounded" type="rm:arg-type"/>
-					</xs:sequence>
-				</xs:complexType>
-			</xs:element>
-		</xs:sequence>
-		<xs:attribute name="type" default="text">
-			<xs:simpleType>
-				<xs:restriction base="xs:string">
-					<xs:enumeration value="label"/>
-					<xs:enumeration value="text"/>
-					<xs:enumeration value="checkbox"/>
-					<xs:enumeration value="spinner"/>
-					<xs:enumeration value="combo"/>
-					<xs:enumeration value="radioButton"/>
-					<xs:enumeration value="browseLocal">
-						<xs:annotation>
-							<xs:documentation>
-								Creates a read-only text widget followed by a push button allowing the user to browse the local file system.
-							</xs:documentation>
-						</xs:annotation>
-					</xs:enumeration>
-					<xs:enumeration value="browseRemote">
-						<xs:annotation>
-							<xs:documentation>
-								Creates a read-only text widget followed by a push button allowing the user to browse a remote file system.
-							</xs:documentation>
-						</xs:annotation>
-					</xs:enumeration>
-				</xs:restriction>
-			</xs:simpleType>
-		</xs:attribute>
-		<xs:attribute name="title" type="xs:string"/>
-		<xs:attribute name="style" type="xs:string"/>
-		<xs:attribute name="readOnly" type="xs:boolean" default="false">
-			<xs:annotation>
-				<xs:documentation>
-					Only applicable to text areas and combo boxes.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="saveValueTo" type="xs:string">
-			<xs:annotation>
-				<xs:documentation>
-					The widget is directly mapped to a property or attribute in the environment which will receive the entered value.
-					Use of this attribute is mutually exclusive with the "fixed-" and "dynamic-text" elements.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="foreground" type="xs:string"/>
-		<xs:attribute name="background" type="xs:string"/>
-	</xs:complexType>
-	<xs:complexType name="attribute-viewer-type">
-		<xs:annotation>
-			<xs:documentation>
-				These display their value columns as editable widgets. They are provided with checkboxes to indicate which
-				attributes have been chosen. A checkbox button is also placed above the viewer to allow for filtering the unchecked items. The
-				viewer outputs its checked values to the environment (and on update removes unselected ones). The name of the viewer is also stored
-				against a string of all selected values, constructed from a template.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="layout-data" minOccurs="0" type="rm:layout-data-type"/>
-			<xs:element name="layout" minOccurs="0" type="rm:layout-type"/>
-			<xs:element name="label" minOccurs="0" type="xs:string"/>
-			<xs:element name="column-data" minOccurs="0" maxOccurs="7" type="rm:column-data-type"/>
-			<xs:element name="items" type="rm:viewer-items-type"/>
-			<xs:element name="value" minOccurs="0" type="rm:template-type"/>
-		</xs:sequence>
-		<xs:attribute name="type" default="table">
-			<xs:simpleType>
-				<xs:restriction base="xs:string">
-					<xs:enumeration value="table"/>
-					<xs:enumeration value="tree"/>
-				</xs:restriction>
-			</xs:simpleType>
-		</xs:attribute>
-		<xs:attribute name="name" type="xs:string"/>
-		<xs:attribute name="sort" type="xs:boolean" default="true">
-			<xs:annotation>
-				<xs:documentation>
-					On the name field/column. This is a toggle sort, such that alternate clicks reverse the sort direction.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="headerVisible" type="xs:boolean" default="true"/>
-		<xs:attribute name="linesVisible" type="xs:boolean" default="true"/>
-		<xs:attribute name="tooltipEnabled" type="xs:boolean" default="true">
-			<xs:annotation>
-				<xs:documentation>
-					Enables column-viewer label provider tooltip support. The tooltip defined for an attribute will appear on the row
-					of the table or the parent node of the tree. The attribute description will also appear as a tooltip on the description columns if
-					they exist.
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="style" type="xs:string"/>
-	</xs:complexType>
-	<xs:complexType name="viewer-items-type">
-		<xs:annotation>
-			<xs:documentation>
-				Which attributes or properties to include in or exclude from (if using the "all" attributes) the viewer.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="include" minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
-			<xs:element name="exclude" minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
-		</xs:sequence>
-		<xs:attribute name="allPredefined" type="xs:boolean" default="false"/>
-		<xs:attribute name="allDiscovered" type="xs:boolean" default="false"/>
-	</xs:complexType>
-	<xs:complexType name="font-type">
-		<xs:attribute name="name" type="xs:string"/>
-		<xs:attribute name="size" type="xs:int" default="9"/>
-		<xs:attribute name="style" default="normal">
-			<xs:simpleType>
-				<xs:restriction base="xs:string">
-					<xs:enumeration value="normal"/>
-					<xs:enumeration value="bold"/>
-					<xs:enumeration value="italic"/>
-				</xs:restriction>
-			</xs:simpleType>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="template-type">
-		<xs:attribute name="pattern" type="xs:string">
-			<xs:annotation>
-				<xs:documentation>
-					Express the template using @name and @value markers. Example: '@name="@value"' would generate a string of
-					name-value assignments (the default separator being whitespace).
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="separator" type="xs:string" default=" "/>
-	</xs:complexType>
-	<xs:complexType name="target-type">
-		<xs:annotation>
-			<xs:documentation>
-				The top-level tokenizer element: refers to an object, either to be constructed at match time, or which pre-exists
-				in the environment, on which to apply the actions associated with matches and tests, along with a set of possible matches and
-				tests. All tests are run at the conclusion of the parse operation. NOTE: when new targets are constructed, there is a merge
-				operation at the end of tokenization which attempts to combine objects into a single instance identified by the 'name' attribute.
-				This assumes that such names will be unique and that any other values to be set on the object which are not explicitly bound in
-				some way to that name through the pattern will appear on the stream before a new name does.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="match" maxOccurs="unbounded" type="rm:match-type"/>
-			<xs:element name="test" minOccurs="0" maxOccurs="unbounded" type="rm:test-type"/>
-		</xs:sequence>
-		<xs:attribute name="ref" type="xs:string">
-			<xs:annotation>
-				<xs:documentation>
-					The name of the object in the environment (either attribute or property; do not include here the "${rm:" / "}"
-					used for resolving).
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-		<xs:attribute name="type" default="property">
-			<xs:annotation>
-				<xs:documentation>
-					Create an object of this type when there is a match.
-				</xs:documentation>
-			</xs:annotation>
-			<xs:simpleType>
-				<xs:restriction base="xs:string">
-					<xs:enumeration value="property"/>
-					<xs:enumeration value="attribute"/>
-				</xs:restriction>
-			</xs:simpleType>
-		</xs:attribute>
-		<xs:attribute name="matchAll" type="xs:boolean" default="false">
-			<xs:annotation>
-				<xs:documentation>
-					Means do not try to match an already matched expression until all the others are matched (i.e., a logical AND
-					instead of OR governs the set of matches at successive calls to the target match operation); this allows one to use, for instance,
-					.* repeatedly but set different fields of the object with the resulting match (see tokenizer-examples.xml, ex. 5).
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="match-type">
-		<xs:annotation>
-			<xs:documentation>
-				If the match is satisfied, the apply operations are immediately called on the current target property or
-				attribute.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="expression" minOccurs="0" type="rm:regex-type"/>
-			<xs:choice minOccurs="0" maxOccurs="unbounded">
-				<xs:element name="add" type="rm:add-type"/>
-				<xs:element name="append" type="rm:append-type"/>
-				<xs:element name="put" type="rm:put-type"/>
-				<xs:element name="set" type="rm:set-type"/>
-			</xs:choice>
-		</xs:sequence>
-		<xs:attribute name="moveToTop" type="xs:boolean" default="false">
-			<xs:annotation>
-				<xs:documentation>
-					Indicates to the tokenizer that the matched target be promoted to first position in the list of targets. This is
-					useful when there is an ordering which expects types of attributes or properties to be grouped in sequence on the stream (see
-					tokenizer-examples.xml, ex. 4).
-				</xs:documentation>
-			</xs:annotation>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="column-data-type">
-		<xs:annotation>
-			<xs:documentation>
-				A caveat on the foreground and background settings. They are exposed here but may not work as expected: these are
-				currently applied to the column through the cell label provider; foreground seems not to change the font color but to color the
-				entire cell.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="font" minOccurs="0" type="rm:font-type"/>
-			<xs:element name="tooltip" minOccurs="0" type="xs:string"/>
-		</xs:sequence>
-		<xs:attribute name="name" type="xs:string"/>
-		<xs:attribute name="width" type="xs:int" default="-1"/>
-		<xs:attribute name="alignment" type="xs:string"/>
-		<xs:attribute name="resizable" type="xs:boolean" default="true"/>
-		<xs:attribute name="moveable" type="xs:boolean" default="false"/>
-		<xs:attribute name="foreground" type="xs:string"/>
-		<xs:attribute name="background" type="xs:string"/>
-	</xs:complexType>
-	<xs:complexType name="set-type">
-		<xs:annotation>
-			<xs:documentation>
-				Calls "setField(entry value)" on the target.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="entry" minOccurs="0" type="rm:entry-type"/>
-		</xs:sequence>
-		<xs:attribute name="field" type="xs:string"/>
-	</xs:complexType>
-	<xs:complexType name="add-type">
-		<xs:annotation>
-			<xs:documentation>
-				References (or creates) a list as the value of the target field, and adds the entry values to it.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="entry" minOccurs="0" maxOccurs="unbounded" type="rm:entry-type"/>
-		</xs:sequence>
-		<xs:attribute name="field" type="xs:string"/>
-	</xs:complexType>
-	<xs:complexType name="append-type">
-		<xs:annotation>
-			<xs:documentation>
-				References (or creates) a string (buffer) as the value of the target field, and appends the entry values to it.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="entry" minOccurs="0" maxOccurs="unbounded" type="rm:entry-type"/>
-		</xs:sequence>
-		<xs:attribute name="field" type="xs:string"/>
-		<xs:attribute name="separator" type="xs:string"/>
-	</xs:complexType>
-	<xs:complexType name="put-type">
-		<xs:annotation>
-			<xs:documentation>
-				References (or creates) a map as the value of the target field, and adds the entry (key, value) to it.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="entry" minOccurs="0" maxOccurs="unbounded" type="rm:entry-type"/>
-		</xs:sequence>
-		<xs:attribute name="field" type="xs:string"/>
-	</xs:complexType>
-	<xs:complexType name="entry-type">
-		<xs:annotation>
-			<xs:documentation>
-				Value abstraction. "key" and "value" can be arbitrary strings; the "Group" attributes refer to the value of the
-				matched regex group;
-				"Index" attributes refer to the index of the string array created by using the regex to split the segment.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:attribute name="key" type="xs:string"/>
-		<xs:attribute name="keyGroup" type="xs:int" default="0"/>
-		<xs:attribute name="keyIndex" type="xs:int" default="0"/>
-		<xs:attribute name="value" type="xs:string"/>
-		<xs:attribute name="valueGroup" type="xs:int" default="0"/>
-		<xs:attribute name="valueIndex" type="xs:int" default="0"/>
-	</xs:complexType>
-	<xs:complexType name="test-type">
-		<xs:annotation>
-			<xs:documentation>
-				Useful for setting values based on other values produced during tokenization. A test is one or more comparison
-				operations (with arbitrary nesting inside the three boolean operators), plus a set of actions to apply to the target fields in the
-				case of either success or failure (the "else" element). See tokenizer-examples-xml, ex. 3, or the "get-job-status" example.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="test" minOccurs="0" maxOccurs="unbounded" type="rm:test-type"/>
-			<xs:element name="value" type="xs:string" minOccurs="0" maxOccurs="2">
-				<xs:annotation>
-					<xs:documentation>
-						.*[${rm:}]*.* refers to a variable in the RM environment; "#FIELD" refers to the value of the given field on the
-						current target; other strings will be converted in conformity with the inferred type of the comparison.
-					</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:choice minOccurs="0" maxOccurs="unbounded">
-				<xs:element name="add" type="rm:add-type"/>
-				<xs:element name="append" type="rm:append-type"/>
-				<xs:element name="put" type="rm:put-type"/>
-				<xs:element name="set" type="rm:set-type"/>
-			</xs:choice>
-			<xs:element name="else" minOccurs="0">
-				<xs:complexType>
-					<xs:choice maxOccurs="unbounded">
-						<xs:element name="add" type="rm:add-type"/>
-						<xs:element name="append" type="rm:append-type"/>
-						<xs:element name="put" type="rm:put-type"/>
-						<xs:element name="set" type="rm:set-type"/>
-					</xs:choice>
-				</xs:complexType>
-			</xs:element>
-		</xs:sequence>
-		<xs:attribute name="op">
-			<xs:annotation>
-				<xs:documentation>
-					Enumeration avoids XML escaping. EQ = equals, LT = less than, GT = greater than, LE = less than or equal to, GE =
-					greater than or equal to.
-				</xs:documentation>
-			</xs:annotation>
-			<xs:simpleType>
-				<xs:restriction base="xs:string">
-					<xs:enumeration value="EQ"/>
-					<xs:enumeration value="LT"/>
-					<xs:enumeration value="GT"/>
-					<xs:enumeration value="LE"/>
-					<xs:enumeration value="GE"/>
-					<xs:enumeration value="AND"/>
-					<xs:enumeration value="OR"/>
-					<xs:enumeration value="NOT"/>
-				</xs:restriction>
-			</xs:simpleType>
-		</xs:attribute>
-	</xs:complexType>
-	<xs:complexType name="monitor-type">
-		<xs:annotation>
-			<xs:documentation>
-				This is a minimal definition.
-			</xs:documentation>
-		</xs:annotation>
-		<xs:sequence>
-			<xs:element name="property" minOccurs="0" maxOccurs="unbounded" type="rm:property-type"/>
-		</xs:sequence>
-		<xs:attribute name="schedulerType" type="xs:string"/>
-		<xs:attribute name="refreshFrequencyInSeconds" type="xs:int" default="60"/>
-	</xs:complexType>
-</xs:schema>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/eclipse32.png b/rms/org.eclipse.ptp.rm.jaxb.core/eclipse32.png
deleted file mode 100644
index 568fac1..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/plugin.properties b/rms/org.eclipse.ptp.rm.jaxb.core/plugin.properties
deleted file mode 100644
index 9197b7b..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/plugin.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 IBM Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-###############################################################################
-
-pluginName=PTP Generic RM Support
-pluginProvider=Eclipse.org
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/plugin.xml b/rms/org.eclipse.ptp.rm.jaxb.core/plugin.xml
deleted file mode 100644
index 5a14380..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/plugin.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension-point id="streamParserTokenizer" name="StreamParserTokenizer" schema="schema/streamParserTokenizer.exsd"/>
-   <extension-point id="JAXBResourceManagerConfigurations" name="JAXBResourceManagerConfigurations" schema="schema/JAXBResourceManagerConfigurations.exsd"/>
-   <extension
-         point="org.eclipse.ptp.rm.jaxb.core.JAXBResourceManagerConfigurations">
-      <JAXBResourceManagerConfiguration
-            configurationFile="data/pbs-torque-generic.xml"
-            id="org.eclipse.ptp.rm.jaxb.JAXBServiceProvider"
-            name="PBS Torque (Generic)">
-      </JAXBResourceManagerConfiguration>
-   </extension>
-   <extension
-         point="org.eclipse.ptp.services.core.providers">
-      <provider
-            class="org.eclipse.ptp.rmsystem.ResourceManagerServiceProvider"
-            id="org.eclipse.ptp.rm.jaxb.JAXBServiceProvider"
-            name="JAXB (test monitor)"
-            serviceId="org.eclipse.ptp.core.LaunchService">
-      </provider>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.ptp.rm.jaxb.core.JAXBPreferenceManager">
-      </initializer>
-   </extension>
-   <extension
-         point="org.eclipse.core.variables.dynamicVariables">
-      <variable
-            description="Dynamic resource manager configuration variable"
-            name="rm"
-            resolver="org.eclipse.ptp.rm.jaxb.core.variables.RMVariableResolver"
-            supportsArgument="true">
-      </variable>
-      <variable
-            description="Dynamic launch tab configuration variable"
-            name="lt"
-            resolver="org.eclipse.ptp.rm.jaxb.core.variables.LTVariableResolver">
-      </variable>
-      <variable
-            description="Dynamic variable backed by LaunchConfiguration"
-            name="lc"
-            resolver="org.eclipse.ptp.rm.jaxb.core.variables.LCVariableResolver">
-      </variable>
-   </extension>
-   <extension
-         point="org.eclipse.ptp.rm.jaxb.core.streamParserTokenizer">
-      <StreamParserTokenizer
-            class="org.eclipse.ptp.rm.jaxb.core.runnable.ConfigurableRegexTokenizer"
-            id="org.eclipse.ptp.rm.jaxb.configurableRegexTokenizer"
-            name="Configurable Regex Tokenizer">
-      </StreamParserTokenizer>
-   </extension>
-   <extension
-         point="org.eclipse.ptp.core.resourceManagers">
-      <resourceManager
-            class="org.eclipse.ptp.rm.jaxb.core.rm.JAXBResourceManagerFactory"
-            id="org.eclipse.ptp.rm.jaxb.JAXBServiceProvider">
-         <resourceManagerControl
-             class="org.eclipse.ptp.rm.jaxb.core.rm.JAXBResourceManagerFactory"
-             id="org.eclipse.ptp.rm.jaxb.control">
-         </resourceManagerControl>
-         <resourceManagerMonitor
-            class="org.eclipse.ptp.rm.jaxb.core.rm.JAXBResourceManagerMonitorFactory"
-            id="org.eclipse.ptp.rm.jaxb.monitor">
-         </resourceManagerMonitor>
-      </resourceManager>
-   </extension>
-</plugin>
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/schema/JAXBResourceManagerConfigurations.exsd b/rms/org.eclipse.ptp.rm.jaxb.core/schema/JAXBResourceManagerConfigurations.exsd
deleted file mode 100644
index ae4c8b7..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/schema/JAXBResourceManagerConfigurations.exsd
+++ /dev/null
@@ -1,116 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ptp.rm.jaxb.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ptp.rm.jaxb.ui" id="JAXBResourceManagers" name="JAXBResourceManagers"/>
-      </appinfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="1" maxOccurs="unbounded">
-            <element ref="JAXBResourceManagerConfiguration"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="JAXBResourceManagerConfiguration">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  ID of the resource manager that this configuration file is for.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Name of the contributed resource manager to display in the selection dialog. This string must be unique across all resource managers.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="configurationFile" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Location of the configuration file for the resource manager
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/schema/streamParserTokenizer.exsd b/rms/org.eclipse.ptp.rm.jaxb.core/schema/streamParserTokenizer.exsd
deleted file mode 100644
index d6829b0..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/schema/streamParserTokenizer.exsd
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ptp.rm.jaxb.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ptp.rm.jaxb.core" id="streamParserTokenizer" name="StreamParserTokenizer"/>
-      </appinfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="streamParserTokenizer" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="streamParserTokenizer">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.ptp.rm.jaxb.core.IStreamParserTokenizer"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique identifier for this stream parser tokenizer
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A human readable name for the stream parser tokenizer
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IAssign.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IAssign.java
deleted file mode 100644
index 021aa6b..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IAssign.java
+++ /dev/null
@@ -1,38 +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.core;
-
-/**
- * Defines methods for an Assign action connected to the stream parser
- * (tokenizer).
- * 
- * @author arossi
- * 
- */
-public interface IAssign {
-
-	/**
-	 * @param values
-	 *            parsed values from match expression
-	 * @throws Throwable
-	 */
-	void assign(String[] values) throws Throwable;
-
-	/**
-	 * @return index of assign action next target
-	 */
-	int getIndex();
-
-	/**
-	 * @param target
-	 *            current target for the assign action
-	 */
-	void setTarget(Object target);
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/ICommandJobStatus.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/ICommandJobStatus.java
deleted file mode 100644
index a6c240c..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/ICommandJobStatus.java
+++ /dev/null
@@ -1,76 +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.core;
-
-import org.eclipse.ptp.remote.core.IRemoteProcess;
-import org.eclipse.ptp.rmsystem.IJobStatus;
-
-/**
- * CommandJob-specific extension to IJobStatus.
- * 
- * @see org.eclipse.ptp.rmsystem.IJobStatus
- * @author arossi
- * 
- */
-public interface ICommandJobStatus extends IJobStatus {
-	/**
-	 * for throttling requests which may trigger remote calls
-	 */
-	final long UPDATE_REQUEST_INTERVAL = 30 * 1000;
-
-	/**
-	 * Cancel the Job process (if interactive).
-	 */
-	void cancel();
-
-	/**
-	 * Notify all waiting on the job id of its arrival.
-	 */
-	void cancelWait();
-
-	/**
-	 * timestamp of last update request issued to remote resource
-	 * 
-	 * @return update in milliseconds
-	 */
-	long getLastUpdateRequest();
-
-	/**
-	 * @return whether the associated Job was launched interactively or not.
-	 */
-	boolean isInteractive();
-
-	/**
-	 * @param process
-	 *            if the Job is interactive.
-	 */
-	void setProcess(IRemoteProcess process);
-
-	/**
-	 * @param state
-	 *            of the launched Job, not of the submission call.
-	 */
-	void setState(String state);
-
-	/**
-	 * @param time
-	 *            in milliseconds of last update request issued to remote
-	 *            resource
-	 */
-	void setUpdateRequestTime(long update);
-
-	/**
-	 * Do a monitor wait until the job id arrives.
-	 * 
-	 * @param uuid
-	 *            internal id which the job id will be mapped to.
-	 */
-	void waitForJobId(String uuid);
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/ICommandJobStreamMonitor.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/ICommandJobStreamMonitor.java
deleted file mode 100644
index 44213c6..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/ICommandJobStreamMonitor.java
+++ /dev/null
@@ -1,49 +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.core;
-
-import org.eclipse.debug.core.model.IStreamMonitor;
-
-/**
- * CommandJob-specific extension of the stream monitor.
- * 
- * @see org.eclipse.debug.core.model.IStreamMonitor
- * @author arossi
- * 
- */
-public interface ICommandJobStreamMonitor extends IStreamMonitor {
-
-	/**
-	 * Manually close the monitor/streams.
-	 */
-	void close();
-
-	/**
-	 * Initialize file path from current env.
-	 * 
-	 * @param jobId
-	 *            from status
-	 */
-	void initializeFilePath(String jobId);
-
-	/**
-	 * Tune the monitor's buffer size
-	 * 
-	 * @param limit
-	 *            in chars
-	 * 
-	 */
-	void setBufferLimit(int limit);
-
-	/**
-	 * Starts the reading from the stream.
-	 */
-	void startMonitoring();
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/ICommandJobStreamsProxy.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/ICommandJobStreamsProxy.java
deleted file mode 100644
index f9ae47e..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/ICommandJobStreamsProxy.java
+++ /dev/null
@@ -1,48 +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.core;
-
-import org.eclipse.debug.core.model.IStreamsProxy;
-import org.eclipse.debug.core.model.IStreamsProxy2;
-
-/**
- * CommandJob-specific extension of the stream proxy.
- * 
- * @see org.eclipse.debug.core.model.IStreamsProxy
- * @see org.eclipse.debug.core.model.IStreamsProxy2
- * 
- * @author arossi
- * 
- */
-public interface ICommandJobStreamsProxy extends IStreamsProxy, IStreamsProxy2 {
-
-	/**
-	 * Manually close the proxy.
-	 */
-	void close();
-
-	/**
-	 * @param err
-	 *            monitor for error stream
-	 */
-	void setErrMonitor(ICommandJobStreamMonitor err);
-
-	/**
-	 * 
-	 * @param out
-	 *            monitor for out stream
-	 */
-	void setOutMonitor(ICommandJobStreamMonitor out);
-
-	/**
-	 * Attaches monitor to stream and begins reading.
-	 */
-	void startMonitors();
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IJAXBNonNLSConstants.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IJAXBNonNLSConstants.java
deleted file mode 100644
index 728fb7e..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IJAXBNonNLSConstants.java
+++ /dev/null
@@ -1,226 +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.core;
-
-/**
- * Gathers all internal, unmodifiable string constants into a single place for
- * convenience and the interest of uncluttered code.
- * 
- * @since 5.0
- */
-public interface IJAXBNonNLSConstants {
-
-	int UNDEFINED = -1;
-	int COPY_BUFFER_SIZE = 64 * 1024;
-	int STREAM_BUFFER_SIZE = 8 * 1024;
-	int EOF = -1;
-	long MINUTE_IN_MS = 60 * 60 * 1000;
-	long VALIDATE_TIMER = 500;
-	long TAILF_PAUSE = 1000;
-
-	/* CHARACTERS */
-	String LEN = "N";//$NON-NLS-1$
-	String ZEROSTR = "";//$NON-NLS-1$
-	String TAB = "\t"; //$NON-NLS-1$
-	String SP = " ";//$NON-NLS-1$
-	String EQ = "=";//$NON-NLS-1$
-	String QT = "\"";//$NON-NLS-1$
-	String QM = "?";//$NON-NLS-1$
-	String PD = "#";//$NON-NLS-1$
-	String PDRX = "[#]";//$NON-NLS-1$
-	String CM = ",";//$NON-NLS-1$
-	String CO = ":";//$NON-NLS-1$
-	String SC = ";";//$NON-NLS-1$
-	String LT = "<"; //$NON-NLS-1$
-	String LTS = "</";//$NON-NLS-1$
-	String GT = ">";//$NON-NLS-1$
-	String GTLT = "><";//$NON-NLS-1$
-	String HYPH = "-";//$NON-NLS-1$
-	String AT = "@";//$NON-NLS-1$
-	String DOL = "$";//$NON-NLS-1$
-	String PIP = "|";//$NON-NLS-1$
-	String DOT = ".";//$NON-NLS-1$
-	String Z3 = "000";//$NON-NLS-1$
-	String OPENP = "(";//$NON-NLS-1$
-	String OPENSQ = "[";//$NON-NLS-1$
-	String OPENV = "${";//$NON-NLS-1$
-	String OPENVRM = "${rm:";//$NON-NLS-1$
-	String OPENVLT = "${lt:";//$NON-NLS-1$
-	String VRM = "rm:";//$NON-NLS-1$
-	String VLC = "lc:";//$NON-NLS-1$
-	String CLOSP = ")";//$NON-NLS-1$
-	String CLOSSQ = "]";//$NON-NLS-1$
-	String CLOSV = "}";//$NON-NLS-1$
-	String CLOSVAL = "#value}";//$NON-NLS-1$
-	String BKESC = "\\\\";//$NON-NLS-1$
-	String BKBKESC = "\\\\\\\\";//$NON-NLS-1$
-	String DLESC = "\\$";//$NON-NLS-1$
-	String DLESCESC = "\\\\\\$";//$NON-NLS-1$
-	String SPESC = "\\\\s";//$NON-NLS-1$
-	String LNSEPESC = "\\\\n";//$NON-NLS-1$
-	String TBESC = "\\t";//$NON-NLS-1$
-	String TBESCESC = "\\\\t";//$NON-NLS-1$
-	String LNESC = "\\n";//$NON-NLS-1$
-	String RTESC = "\\r";//$NON-NLS-1$
-	String LINE_SEP = System.getProperty("line.separator"); //$NON-NLS-1$
-	String REMOTE_LINE_SEP = "\n"; //$NON-NLS-1$
-	String REMOTE_PATH_SEP = "/"; //$NON-NLS-1$
-	String PATH_SEP = System.getProperty("file.separator"); //$NON-NLS-1$
-
-	/* KEY WORDS */
-	String TRUE = "true";//$NON-NLS-1$
-	String FALSE = "false";//$NON-NLS-1$
-	String YES = "yes";//$NON-NLS-1$
-	String NO = "no";//$NON-NLS-1$
-	String NOT = "not";//$NON-NLS-1$
-	String OR = "or";//$NON-NLS-1$
-	String AND = "and";//$NON-NLS-1$
-	String xEQ = "EQ";//$NON-NLS-1$
-	String xLT = "LT";//$NON-NLS-1$
-	String xGT = "GT";//$NON-NLS-1$
-	String xLE = "LE";//$NON-NLS-1$
-	String xGE = "GE";//$NON-NLS-1$
-	String GET = "get";//$NON-NLS-1$
-	String SET = "set";//$NON-NLS-1$
-	String IS = "is";//$NON-NLS-1$
-	String CLASS = "class";//$NON-NLS-1$
-	String STRING = "string";//$NON-NLS-1$
-	String NAME = "name";//$NON-NLS-1$
-	String VALUE = "value";//$NON-NLS-1$
-	String BASIC = "basic";//$NON-NLS-1$
-	String CHOICE = "choice";//$NON-NLS-1$
-	String sDEFAULT = "default";//$NON-NLS-1$
-	String DESC = "description";//$NON-NLS-1$
-	String MAX = "max";//$NON-NLS-1$
-	String MIN = "min";//$NON-NLS-1$
-	String READONLY = "readOnly";//$NON-NLS-1$
-	String STATUS = "status";//$NON-NLS-1$
-	String TOOLTIP = "tooltip";//$NON-NLS-1$
-	String TYPE = "type";//$NON-NLS-1$
-	String VALIDATOR = "validator";//$NON-NLS-1$
-	String SELECTED = "visible";//$NON-NLS-1$
-	String LOCAL = "local";//$NON-NLS-1$
-	String JOB_ID_TAG = "@jobId";//$NON-NLS-1$
-	String NAME_TAG = AT + NAME;
-	String VALUE_TAG = AT + VALUE;
-
-	/* TYPE MATCHING */
-	String NT = "nt";//$NON-NLS-1$
-	String BOOL = "bool";//$NON-NLS-1$
-	String ET = "et";//$NON-NLS-1$
-	String IST = "ist";//$NON-NLS-1$
-	String ECTOR = "ector";//$NON-NLS-1$
-
-	/* STANDARD PROPERTIES */
-	String ID = "id";//$NON-NLS-1$
-	String JAVA_USER_HOME = "user.home";//$NON-NLS-1$
-	String JAVA_TMP_DIR = "java.io.tmpdir";//$NON-NLS-1$
-	String FILE_SCHEME = "file";//$NON-NLS-1$
-	String XMLSchema = "http://www.w3.org/2001/XMLSchema"; //$NON-NLS-1$
-	String DATA = "data/"; //$NON-NLS-1$
-	String RM_XSD = DATA + "resource_manager_type.xsd";//$NON-NLS-1$
-	String JAXB = "JAXB";//$NON-NLS-1$
-	String JAXB_CONTEXT = "org.eclipse.ptp.rm.jaxb.core.data";//$NON-NLS-1$
-	String RM_CONFIG_PROPS = "rm_configurations.properties";//$NON-NLS-1$
-	String RM_XSD_PATH = "rm_schema_path";//$NON-NLS-1$
-	String RM_XSD_URL = "rm_schema_url";//$NON-NLS-1$
-	String PREV_RM_XSD_PATH = "prev_rm_schema_path";//$NON-NLS-1$
-	String EXTERNAL_RM_XSD_PATHS = "external_rm_schema_paths";//$NON-NLS-1$
-	String CHECKED_ATTRIBUTES = "checked_attributes";//$NON-NLS-1$
-	String SHOW_ONLY_CHECKED = "show_only_checked";//$NON-NLS-1$
-	String IS_PRESET = "is_preset";//$NON-NLS-1$
-	String SCRIPT_PATH = "script_path";//$NON-NLS-1$
-	String SCRIPT = "script";//$NON-NLS-1$
-	String SCRIPT_FILE = "managed_file_for_script";//$NON-NLS-1$
-	String CSH = "csh";//$NON-NLS-1$
-	String SH = ".sh";//$NON-NLS-1$
-	String SETENV = "setenv";//$NON-NLS-1$
-	String EXPORT = "export";//$NON-NLS-1$
-	String STDOUT = "stdout";//$NON-NLS-1$
-	String STDERR = "stderr";//$NON-NLS-1$
-	String DATE_FORMAT = "yyyy/MM/dd HH:mm:ss";//$NON-NLS-1$
-
-	String RESOURCE_MANAGERS = "resourceManagers";//$NON-NLS-1$
-	String CUSTOM = "custom";//$NON-NLS-1$
-	String CONTROL_USER_NAME = "controlUserName";//$NON-NLS-1$
-	String MONITOR_USER_NAME = "monitorUserName";//$NON-NLS-1$
-	String CONTROL_CONNECTION_NAME = "controlConnectionName";//$NON-NLS-1$
-	String MONITOR_CONNECTION_NAME = "monitorConnectionName";//$NON-NLS-1$
-	String LOCALHOST = "localhost";//$NON-NLS-1$
-	String CONTROL_PATH = "controlPath"; //$NON-NLS-1$
-	String MONITOR_PATH = "monitorPath"; //$NON-NLS-1$
-	String CONTROL_OPTIONS = "controlOptions"; //$NON-NLS-1$
-	String MONITOR_OPTIONS = "monitorOptions"; //$NON-NLS-1$
-	String CONTROL_INVOCATION_OPTIONS = "controlInvocationOptions"; //$NON-NLS-1$
-	String MONITOR_INVOCATION_OPTIONS = "monitorInvocationOptions"; //$NON-NLS-1$
-	String CONTROL_ADDRESS = "controlAddress"; //$NON-NLS-1$
-	String LOCAL_ADDRESS = "localAddress"; //$NON-NLS-1$
-	String MONITOR_ADDRESS = "monitorAddress"; //$NON-NLS-1$
-	String CONTROL_USER_VAR = "control.user.name";//$NON-NLS-1$
-	String CONTROL_ADDRESS_VAR = "control.address";//$NON-NLS-1$
-	String MONITOR_USER_VAR = "monitor.user.name";//$NON-NLS-1$
-	String MONITOR_ADDRESS_VAR = "monitor.address";//$NON-NLS-1$
-	String ARPA = ".in-addr.arpa";//$NON-NLS-1$
-	String ECLIPSESETTINGS = ".eclipsesettings";//$NON-NLS-1$
-	String DEBUG_PACKAGE = "org.eclipse.debug";//$NON-NLS-1$
-	String PTP_PACKAGE = "org.eclipse.ptp";//$NON-NLS-1$
-
-	String STARTUP = "OnStartUp";//$NON-NLS-1$
-	String SHUTDOWN = "OnShutDown";//$NON-NLS-1$
-	String DISCATTR = "DiscoverAttributes";//$NON-NLS-1$
-	String JOBSTATUS = "GetJobStatus";//$NON-NLS-1$
-	String VALIDATE = "ValidateJob";//$NON-NLS-1$
-
-	String JOB_ATTRIBUTE = "jobAttribute";//$NON-NLS-1$
-	String ATTRIBUTE = "attribute";//$NON-NLS-1$
-	String PROPERTY = "property";//$NON-NLS-1$
-	String QUEUES = "available_queues";//$NON-NLS-1$
-	String JOB_ID = "jobId";//$NON-NLS-1$
-	String EXEC_PATH = "executablePath";//$NON-NLS-1$
-	String PROG_ARGS = "progArgs";//$NON-NLS-1$
-	String DIRECTORY = "directory";//$NON-NLS-1$
-	String MPI_CMD = "mpiCommand";//$NON-NLS-1$
-	String MPI_ARGS = "mpiArgs";//$NON-NLS-1$
-
-	String CASE_INSENSITIVE = "CASE_INSENSITIVE";//$NON-NLS-1$
-	String MULTILINE = "MULTILINE";//$NON-NLS-1$
-	String DOTALL = "DOTALL";//$NON-NLS-1$
-	String UNICODE_CASE = "UNICODE_CASE";//$NON-NLS-1$
-	String CANON_EQ = "CANON_EQ";//$NON-NLS-1$
-	String LITERAL = "LITERAL";//$NON-NLS-1$
-	String COMMENTS = "COMMENTS";//$NON-NLS-1$
-
-	String DOT_XML = ".xml";//$NON-NLS-1$
-	String TOKENIZER_EXT_PT = "streamParserTokenizer";//$NON-NLS-1$
-	String TAIL = "tail";//$NON-NLS-1$
-	String MINUS_F = "-F";//$NON-NLS-1$
-	String CONFIGURATION_FILE_ATTRIBUTE = "configurationFile"; //$NON-NLS-1$
-	String RM_CONFIG_EXTENSION_POINT = "org.eclipse.ptp.rm.jaxb.core.JAXBResourceManagerConfigurations"; //$NON-NLS-1$
-	String JAXB_SERVICE_PROVIDER_EXTPT = "org.eclipse.ptp.rm.jaxb.JAXBServiceProvider"; //$NON-NLS-1$
-	/*
-	 * EFS Attributes
-	 */
-	String ATTRIBUTE_READ_ONLY = "ATTRIBUTE_READ_ONLY";//$NON-NLS-1$
-	String ATTRIBUTE_IMMUTABLE = "ATTRIBUTE_IMMUTABLE";//$NON-NLS-1$
-	String ATTRIBUTE_OWNER_READ = "ATTRIBUTE_OWNER_READ";//$NON-NLS-1$
-	String ATTRIBUTE_OWNER_WRITE = "ATTRIBUTE_OWNER_WRITE";//$NON-NLS-1$
-	String ATTRIBUTE_OWNER_EXECUTE = "ATTRIBUTE_OWNER_EXECUTE";//$NON-NLS-1$
-	String ATTRIBUTE_GROUP_READ = "ATTRIBUTE_GROUP_READ";//$NON-NLS-1$
-	String ATTRIBUTE_GROUP_WRITE = "ATTRIBUTE_GROUP_WRITE";//$NON-NLS-1$
-	String ATTRIBUTE_GROUP_EXECUTE = "ATTRIBUTE_GROUP_EXECUTE";//$NON-NLS-1$
-	String ATTRIBUTE_OTHER_READ = "ATTRIBUTE_OTHER_READ";//$NON-NLS-1$
-	String ATTRIBUTE_OTHER_WRITE = "ATTRIBUTE_OTHER_WRITE";//$NON-NLS-1$
-	String ATTRIBUTE_OTHER_EXECUTE = "ATTRIBUTE_OTHER_EXECUTE";//$NON-NLS-1$
-	String ATTRIBUTE_EXECUTABLE = "ATTRIBUTE_EXECUTABLE";//$NON-NLS-1$
-	String ATTRIBUTE_ARCHIVE = "ATTRIBUTE_ARCHIVE";//$NON-NLS-1$
-	String ATTRIBUTE_HIDDEN = "ATTRIBUTE_HIDDEN";//$NON-NLS-1$
-	String ATTRIBUTE_SYMLINK = "ATTRIBUTE_SYMLINK";//$NON-NLS-1$
-	String ATTRIBUTE_LINK_TARGET = "ATTRIBUTE_LINK_TARGET";//$NON-NLS-1$
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IJAXBResourceManager.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IJAXBResourceManager.java
deleted file mode 100644
index cb0070f..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IJAXBResourceManager.java
+++ /dev/null
@@ -1,32 +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.core;
-
-import org.eclipse.ptp.rm.jaxb.core.rm.JAXBResourceManagerControl;
-import org.eclipse.ptp.rmsystem.IResourceManager;
-
-/**
- * JAXB specific resource manager.
- * 
- * @author arossi
- * 
- */
-public interface IJAXBResourceManager extends IResourceManager {
-
-	/**
-	 * @return the control sub-manager.
-	 */
-	JAXBResourceManagerControl getControl();
-
-	/**
-	 * @return the associated service provider (configuration)
-	 */
-	IJAXBResourceManagerConfiguration getJAXBConfiguration();
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IJAXBResourceManagerConfiguration.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IJAXBResourceManagerConfiguration.java
deleted file mode 100644
index 2dcab4b..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IJAXBResourceManagerConfiguration.java
+++ /dev/null
@@ -1,52 +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.core;
-
-import java.net.URL;
-
-import org.eclipse.ptp.rm.core.rmsystem.IRemoteResourceManagerConfiguration;
-import org.eclipse.ptp.rm.jaxb.core.data.ResourceManagerData;
-
-/**
- * JAXB-specific service provider (configuration) interface.
- * 
- * @author arossi
- * 
- */
-public interface IJAXBResourceManagerConfiguration extends IRemoteResourceManagerConfiguration {
-	/**
-	 * Resets internal (in-memory) data objects.
-	 * 
-	 * @since 5.0
-	 */
-	void clearReferences();
-
-	/**
-	 * @return the JAXB resource manager data element tree.
-	 * 
-	 * @since 5.0
-	 */
-	ResourceManagerData getResourceManagerData() throws Throwable;
-
-	/**
-	 * Export the resource manager environment as the currently active one.
-	 * 
-	 * @since 5.0
-	 */
-	void setActive() throws Throwable;
-
-	/**
-	 * @param location
-	 *            of the XML configuration for this resource manager.
-	 * 
-	 * @since 5.0
-	 */
-	void setRMConfigurationURL(URL location);
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IJAXBResourceManagerControl.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IJAXBResourceManagerControl.java
deleted file mode 100644
index 471102e..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IJAXBResourceManagerControl.java
+++ /dev/null
@@ -1,42 +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.core;
-
-import java.util.Map;
-
-import org.eclipse.ptp.rm.jaxb.core.utils.RemoteServicesDelegate;
-import org.eclipse.ptp.rmsystem.IResourceManagerControl;
-
-/**
- * Allows sharing of control-specific data among (internal) elements.
- * 
- * @author arossi
- * 
- */
-public interface IJAXBResourceManagerControl extends IResourceManagerControl {
-
-	/**
-	 * 
-	 * @return whether the launch environment should be appended to (or replace)
-	 *         the environment for a given command execution.
-	 */
-	boolean getAppendEnv();
-
-	/**
-	 * @return the user-defined environment (from the Environment Tab)
-	 */
-	Map<String, String> getLaunchEnv();
-
-	/**
-	 * @return connection information for this resource manager
-	 */
-	RemoteServicesDelegate getRemoteServicesDelegate();
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IMatchable.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IMatchable.java
deleted file mode 100644
index d0bab33..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IMatchable.java
+++ /dev/null
@@ -1,49 +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.core;
-
-/**
- * Defines object for tokenizer to call to process matches against.
- * 
- * @author arossi
- * 
- */
-public interface IMatchable {
-
-	/**
-	 * Match against the current stream segment.
-	 * 
-	 * @param segment
-	 *            passed in from the tokenizer
-	 * @return whether there was a successful match
-	 * @throws Throwable
-	 */
-	boolean doMatch(StringBuffer segment) throws Throwable;
-
-	/**
-	 * @return whether the tokenizer should promote this object to first in its
-	 *         list.
-	 */
-	boolean isSelected();
-
-	/**
-	 * Run post-processing operations on the object.
-	 * 
-	 * @throws Throwable
-	 */
-	void postProcess() throws Throwable;
-
-	/**
-	 * @param selected
-	 *            whether the tokenizer should promote this object to first in
-	 *            its list.
-	 */
-	void setSelected(boolean selected);
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IStreamParserTokenizer.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IStreamParserTokenizer.java
deleted file mode 100644
index 0e08249..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IStreamParserTokenizer.java
+++ /dev/null
@@ -1,39 +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.core;
-
-import java.io.InputStream;
-
-/**
- * Interface for tokenizer (parser) attached to process streams. These can be
- * custom implementations of the extension point. The reference implementation
- * is directly configurable from the ResourceManager XML.<br>
- * <br>
- * Extension point: org.eclipse.ptp.rm.jaxb.core.streamParserTokenizer<br>
- * <br>
- * 
- * @see org.eclipse.ptp.rm.jaxb.core.runnable.command.ConfigurableRegexTokenizer
- * 
- * @author arossi
- * 
- */
-public interface IStreamParserTokenizer extends Runnable {
-
-	/**
-	 * @return any fatal exception raised during parsing
-	 */
-	Throwable getInternalError();
-
-	/**
-	 * @param stream
-	 *            to be parsed
-	 */
-	void setInputStream(InputStream stream);
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IVariableMap.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IVariableMap.java
deleted file mode 100644
index 6bb77a6..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/IVariableMap.java
+++ /dev/null
@@ -1,40 +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.core;
-
-/**
- * High-level interface for resolver environments.
- * 
- * Implementations:
- * 
- * @see org.eclipse.ptp.rm.jaxb.core.variables.LCVariableMap
- * @see org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap
- * 
- * @author arossi
- * 
- */
-public interface IVariableMap {
-
-	/**
-	 * @param value
-	 *            expression to resolve.
-	 * @return resolved expression
-	 */
-	String getString(String value);
-
-	/**
-	 * @param uuid
-	 *            internal identifier associate with a job submission
-	 * @param value
-	 *            expression to resolve.
-	 * @return resolved expression
-	 */
-	String getString(String uuid, String value);
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/JAXBCorePlugin.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/JAXBCorePlugin.java
deleted file mode 100644
index c35254b..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/JAXBCorePlugin.java
+++ /dev/null
@@ -1,174 +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.core;
-
-import java.io.File;
-import java.io.IOException;
-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.messages.Messages;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-
-public class JAXBCorePlugin extends Plugin implements IJAXBNonNLSConstants {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.ptp.rm.jaxb.core"; //$NON-NLS-1$
-
-	// The shared instance
-	private static JAXBCorePlugin fPlugin;
-
-	/**
-	 * The constructor
-	 */
-	public JAXBCorePlugin() {
-		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 exception
-	 */
-	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 exception
-	 */
-	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 JAXBCorePlugin getDefault() {
-		return fPlugin;
-	}
-
-	public static JAXBCorePlugin 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(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();
-	}
-
-	/**
-	 * 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, Messages.JAXBCorePlugin_Exception_InternalError, e));
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/JAXBDefaults.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/JAXBDefaults.java
deleted file mode 100644
index 4d40085..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/JAXBDefaults.java
+++ /dev/null
@@ -1,40 +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.core;
-
-import java.util.Properties;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.ptp.rm.core.AbstractRMDefaults;
-import org.osgi.framework.Bundle;
-
-public class JAXBDefaults extends AbstractRMDefaults {
-
-	public static String LAUNCH_CMD = null;
-	public static String DEBUG_CMD = null;
-	public static String PATH = null;
-
-	private static String defaultsResourcePath = "/data/defaults.properties"; //$NON-NLS-1$
-
-	public static void loadDefaults() throws CoreException {
-		Path defaultsPropertiesPath = new Path(defaultsResourcePath);
-		Bundle bundle = JAXBCorePlugin.getDefault().getBundle();
-		Properties properties = read(defaultsPropertiesPath, bundle);
-
-		LAUNCH_CMD = getString(bundle, properties, "LAUNCH_CMD"); //$NON-NLS-1$
-		DEBUG_CMD = getString(bundle, properties, "DEBUG_CMD"); //$NON-NLS-1$
-		PATH = getString(bundle, properties, "PATH"); //$NON-NLS-1$
-
-		assert LAUNCH_CMD != null;
-		assert DEBUG_CMD != null;
-		assert PATH != null;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/JAXBPreferenceManager.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/JAXBPreferenceManager.java
deleted file mode 100644
index a21d5d7..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/JAXBPreferenceManager.java
+++ /dev/null
@@ -1,34 +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.core;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ptp.core.Preferences;
-import org.eclipse.ptp.rm.core.AbstractToolsPreferenceManager;
-
-public class JAXBPreferenceManager extends AbstractToolsPreferenceManager {
-
-	@Override
-	public void initializeDefaultPreferences() {
-		try {
-			JAXBDefaults.loadDefaults();
-		} catch (CoreException e) {
-			JAXBCorePlugin.log(e);
-		}
-		Preferences.setDefaultString(JAXBCorePlugin.getUniqueIdentifier(), PREFS_LAUNCH_CMD, JAXBDefaults.LAUNCH_CMD);
-		Preferences.setDefaultString(JAXBCorePlugin.getUniqueIdentifier(), PREFS_DEBUG_CMD, JAXBDefaults.DEBUG_CMD);
-		Preferences.setDefaultString(JAXBCorePlugin.getUniqueIdentifier(), PREFS_REMOTE_INSTALL_PATH, JAXBDefaults.PATH);
-	}
-
-	public static void savePreferences() {
-		Preferences.savePreferences(JAXBCorePlugin.getUniqueIdentifier());
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/AddType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/AddType.java
deleted file mode 100644
index 8899c04..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/AddType.java
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * References (or creates) a list as the value of the target field, and adds the
- * entry values to it.
- * 
- * 
- * <p>
- * Java class for add-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="add-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="entry" type="{http://org.eclipse.ptp/rm}entry-type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="field" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "add-type", propOrder = { "entry" })
-public class AddType {
-
-	protected List<EntryType> entry;
-	@XmlAttribute
-	protected String field;
-
-	/**
-	 * Gets the value of the entry property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the entry property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getEntry().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link EntryType }
-	 * 
-	 * 
-	 */
-	public List<EntryType> getEntry() {
-		if (entry == null) {
-			entry = new ArrayList<EntryType>();
-		}
-		return this.entry;
-	}
-
-	/**
-	 * Gets the value of the field property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getField() {
-		return field;
-	}
-
-	/**
-	 * Sets the value of the field property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setField(String value) {
-		this.field = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/AppendType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/AppendType.java
deleted file mode 100644
index 9a81f67..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/AppendType.java
+++ /dev/null
@@ -1,129 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * References (or creates) a string (buffer) as the value of the target field,
- * and appends the entry values to it.
- * 
- * 
- * <p>
- * Java class for append-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="append-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="entry" type="{http://org.eclipse.ptp/rm}entry-type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="field" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="separator" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "append-type", propOrder = { "entry" })
-public class AppendType {
-
-	protected List<EntryType> entry;
-	@XmlAttribute
-	protected String field;
-	@XmlAttribute
-	protected String separator;
-
-	/**
-	 * Gets the value of the entry property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the entry property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getEntry().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link EntryType }
-	 * 
-	 * 
-	 */
-	public List<EntryType> getEntry() {
-		if (entry == null) {
-			entry = new ArrayList<EntryType>();
-		}
-		return this.entry;
-	}
-
-	/**
-	 * Gets the value of the field property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getField() {
-		return field;
-	}
-
-	/**
-	 * Gets the value of the separator property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getSeparator() {
-		return separator;
-	}
-
-	/**
-	 * Sets the value of the field property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setField(String value) {
-		this.field = value;
-	}
-
-	/**
-	 * Sets the value of the separator property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setSeparator(String value) {
-		this.separator = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ArgType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ArgType.java
deleted file mode 100644
index cf00cdc..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ArgType.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.XmlValue;
-
-/**
- * <p>
- * Java class for arg-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="arg-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="isUndefinedIfMatches" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="resolve" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "arg-type", propOrder = { "content" })
-public class ArgType {
-
-	@XmlValue
-	protected String content;
-	@XmlAttribute
-	protected String isUndefinedIfMatches;
-	@XmlAttribute
-	protected Boolean resolve;
-
-	/**
-	 * Gets the value of the content property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getContent() {
-		return content;
-	}
-
-	/**
-	 * Gets the value of the isUndefinedIfMatches property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getIsUndefinedIfMatches() {
-		return isUndefinedIfMatches;
-	}
-
-	/**
-	 * Gets the value of the resolve property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isResolve() {
-		if (resolve == null) {
-			return true;
-		} else {
-			return resolve;
-		}
-	}
-
-	/**
-	 * Sets the value of the content property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setContent(String value) {
-		this.content = value;
-	}
-
-	/**
-	 * Sets the value of the isUndefinedIfMatches property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setIsUndefinedIfMatches(String value) {
-		this.isUndefinedIfMatches = value;
-	}
-
-	/**
-	 * Sets the value of the resolve property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setResolve(Boolean value) {
-		this.resolve = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/AttributeType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/AttributeType.java
deleted file mode 100644
index 0473e39..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/AttributeType.java
+++ /dev/null
@@ -1,367 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * An attribute is an externally defined variable, most often associated with
- * the scheduler system itself; the most common attributes are those pertaining
- * to the job dimensions and requested resources. The value for attribute can by
- * any primitive type. NOTE: the untyped "value" element on attributes is for
- * internal use only; to give a predefined (primitive) value, use the "default"
- * element along with the "type" attribute.
- * 
- * 
- * <p>
- * Java class for attribute-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="attribute-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="description" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         &lt;element name="tooltip" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="choice" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="default" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="value" type="{http://www.w3.org/2001/XMLSchema}anyType" minOccurs="0"/>
- *         &lt;element name="validator" type="{http://org.eclipse.ptp/rm}validator-type" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="max" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="min" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="readOnly" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="status" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="type" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="visible" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "attribute-type", propOrder = { "description", "tooltip", "choice", "_default", "value", "validator" })
-public class AttributeType {
-
-	@XmlElement(required = true)
-	protected String description;
-	protected String tooltip;
-	protected String choice;
-	@XmlElement(name = "default")
-	protected String _default;
-	protected Object value;
-	protected ValidatorType validator;
-	@XmlAttribute
-	protected Integer max;
-	@XmlAttribute
-	protected Integer min;
-	@XmlAttribute(required = true)
-	protected String name;
-	@XmlAttribute
-	protected Boolean readOnly;
-	@XmlAttribute
-	protected String status;
-	@XmlAttribute(required = true)
-	protected String type;
-	@XmlAttribute
-	protected Boolean visible;
-
-	/**
-	 * Gets the value of the choice property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getChoice() {
-		return choice;
-	}
-
-	/**
-	 * Gets the value of the default property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getDefault() {
-		return _default;
-	}
-
-	/**
-	 * Gets the value of the description property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/**
-	 * Gets the value of the max property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMax() {
-		return max;
-	}
-
-	/**
-	 * Gets the value of the min property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMin() {
-		return min;
-	}
-
-	/**
-	 * Gets the value of the name property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the value of the status property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getStatus() {
-		return status;
-	}
-
-	/**
-	 * Gets the value of the tooltip property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getTooltip() {
-		return tooltip;
-	}
-
-	/**
-	 * Gets the value of the type property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getType() {
-		return type;
-	}
-
-	/**
-	 * Gets the value of the validator property.
-	 * 
-	 * @return possible object is {@link ValidatorType }
-	 * 
-	 */
-	public ValidatorType getValidator() {
-		return validator;
-	}
-
-	/**
-	 * Gets the value of the value property.
-	 * 
-	 * @return possible object is {@link Object }
-	 * 
-	 */
-	public Object getValue() {
-		return value;
-	}
-
-	/**
-	 * Gets the value of the readOnly property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isReadOnly() {
-		if (readOnly == null) {
-			return false;
-		} else {
-			return readOnly;
-		}
-	}
-
-	/**
-	 * Gets the value of the visible property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isVisible() {
-		if (visible == null) {
-			return true;
-		} else {
-			return visible;
-		}
-	}
-
-	/**
-	 * Sets the value of the choice property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setChoice(String value) {
-		this.choice = value;
-	}
-
-	/**
-	 * Sets the value of the default property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setDefault(String value) {
-		this._default = value;
-	}
-
-	/**
-	 * Sets the value of the description property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setDescription(String value) {
-		this.description = value;
-	}
-
-	/**
-	 * Sets the value of the max property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMax(Integer value) {
-		this.max = value;
-	}
-
-	/**
-	 * Sets the value of the min property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMin(Integer value) {
-		this.min = value;
-	}
-
-	/**
-	 * Sets the value of the name property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setName(String value) {
-		this.name = value;
-	}
-
-	/**
-	 * Sets the value of the readOnly property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setReadOnly(Boolean value) {
-		this.readOnly = value;
-	}
-
-	/**
-	 * Sets the value of the status property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setStatus(String value) {
-		this.status = value;
-	}
-
-	/**
-	 * Sets the value of the tooltip property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setTooltip(String value) {
-		this.tooltip = value;
-	}
-
-	/**
-	 * Sets the value of the type property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setType(String value) {
-		this.type = value;
-	}
-
-	/**
-	 * Sets the value of the validator property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link ValidatorType }
-	 * 
-	 */
-	public void setValidator(ValidatorType value) {
-		this.validator = value;
-	}
-
-	/**
-	 * Sets the value of the value property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Object }
-	 * 
-	 */
-	public void setValue(Object value) {
-		this.value = value;
-	}
-
-	/**
-	 * Sets the value of the visible property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setVisible(Boolean value) {
-		this.visible = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/AttributeViewerType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/AttributeViewerType.java
deleted file mode 100644
index 0a8b958..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/AttributeViewerType.java
+++ /dev/null
@@ -1,399 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * These display their value columns as editable widgets. They are provided with
- * checkboxes to indicate which attributes have been chosen. A checkbox button
- * is also placed above the viewer to allow for filtering the unchecked items.
- * The viewer outputs its checked values to the environment (and on update
- * removes unselected ones). The name of the viewer is also stored against a
- * string of all selected values, constructed from a template.
- * 
- * 
- * <p>
- * Java class for attribute-viewer-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="attribute-viewer-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="layout-data" type="{http://org.eclipse.ptp/rm}layout-data-type" minOccurs="0"/>
- *         &lt;element name="layout" type="{http://org.eclipse.ptp/rm}layout-type" minOccurs="0"/>
- *         &lt;element name="label" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="column-data" type="{http://org.eclipse.ptp/rm}column-data-type" maxOccurs="7" minOccurs="0"/>
- *         &lt;element name="items" type="{http://org.eclipse.ptp/rm}viewer-items-type"/>
- *         &lt;element name="value" type="{http://org.eclipse.ptp/rm}template-type" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="headerVisible" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *       &lt;attribute name="linesVisible" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="sort" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *       &lt;attribute name="style" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="tooltipEnabled" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *       &lt;attribute name="type" default="table">
- *         &lt;simpleType>
- *           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
- *             &lt;enumeration value="table"/>
- *             &lt;enumeration value="tree"/>
- *           &lt;/restriction>
- *         &lt;/simpleType>
- *       &lt;/attribute>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "attribute-viewer-type", propOrder = { "layoutData", "layout", "label", "columnData", "items", "value" })
-public class AttributeViewerType {
-
-	@XmlElement(name = "layout-data")
-	protected LayoutDataType layoutData;
-	protected LayoutType layout;
-	protected String label;
-	@XmlElement(name = "column-data")
-	protected List<ColumnDataType> columnData;
-	@XmlElement(required = true)
-	protected ViewerItemsType items;
-	protected TemplateType value;
-	@XmlAttribute
-	protected Boolean headerVisible;
-	@XmlAttribute
-	protected Boolean linesVisible;
-	@XmlAttribute
-	protected String name;
-	@XmlAttribute
-	protected Boolean sort;
-	@XmlAttribute
-	protected String style;
-	@XmlAttribute
-	protected Boolean tooltipEnabled;
-	@XmlAttribute
-	protected String type;
-
-	/**
-	 * Gets the value of the columnData property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the columnData property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getColumnData().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link ColumnDataType }
-	 * 
-	 * 
-	 */
-	public List<ColumnDataType> getColumnData() {
-		if (columnData == null) {
-			columnData = new ArrayList<ColumnDataType>();
-		}
-		return this.columnData;
-	}
-
-	/**
-	 * Gets the value of the items property.
-	 * 
-	 * @return possible object is {@link ViewerItemsType }
-	 * 
-	 */
-	public ViewerItemsType getItems() {
-		return items;
-	}
-
-	/**
-	 * Gets the value of the label property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getLabel() {
-		return label;
-	}
-
-	/**
-	 * Gets the value of the layout property.
-	 * 
-	 * @return possible object is {@link LayoutType }
-	 * 
-	 */
-	public LayoutType getLayout() {
-		return layout;
-	}
-
-	/**
-	 * Gets the value of the layoutData property.
-	 * 
-	 * @return possible object is {@link LayoutDataType }
-	 * 
-	 */
-	public LayoutDataType getLayoutData() {
-		return layoutData;
-	}
-
-	/**
-	 * Gets the value of the name property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the value of the style property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getStyle() {
-		return style;
-	}
-
-	/**
-	 * Gets the value of the type property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getType() {
-		if (type == null) {
-			return "table"; //$NON-NLS-1$
-		} else {
-			return type;
-		}
-	}
-
-	/**
-	 * Gets the value of the value property.
-	 * 
-	 * @return possible object is {@link TemplateType }
-	 * 
-	 */
-	public TemplateType getValue() {
-		return value;
-	}
-
-	/**
-	 * Gets the value of the headerVisible property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isHeaderVisible() {
-		if (headerVisible == null) {
-			return true;
-		} else {
-			return headerVisible;
-		}
-	}
-
-	/**
-	 * Gets the value of the linesVisible property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isLinesVisible() {
-		if (linesVisible == null) {
-			return true;
-		} else {
-			return linesVisible;
-		}
-	}
-
-	/**
-	 * Gets the value of the sort property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isSort() {
-		if (sort == null) {
-			return true;
-		} else {
-			return sort;
-		}
-	}
-
-	/**
-	 * Gets the value of the tooltipEnabled property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isTooltipEnabled() {
-		if (tooltipEnabled == null) {
-			return true;
-		} else {
-			return tooltipEnabled;
-		}
-	}
-
-	/**
-	 * Sets the value of the headerVisible property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setHeaderVisible(Boolean value) {
-		this.headerVisible = value;
-	}
-
-	/**
-	 * Sets the value of the items property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link ViewerItemsType }
-	 * 
-	 */
-	public void setItems(ViewerItemsType value) {
-		this.items = value;
-	}
-
-	/**
-	 * Sets the value of the label property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setLabel(String value) {
-		this.label = value;
-	}
-
-	/**
-	 * Sets the value of the layout property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link LayoutType }
-	 * 
-	 */
-	public void setLayout(LayoutType value) {
-		this.layout = value;
-	}
-
-	/**
-	 * Sets the value of the layoutData property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link LayoutDataType }
-	 * 
-	 */
-	public void setLayoutData(LayoutDataType value) {
-		this.layoutData = value;
-	}
-
-	/**
-	 * Sets the value of the linesVisible property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setLinesVisible(Boolean value) {
-		this.linesVisible = value;
-	}
-
-	/**
-	 * Sets the value of the name property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setName(String value) {
-		this.name = value;
-	}
-
-	/**
-	 * Sets the value of the sort property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setSort(Boolean value) {
-		this.sort = value;
-	}
-
-	/**
-	 * Sets the value of the style property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setStyle(String value) {
-		this.style = value;
-	}
-
-	/**
-	 * Sets the value of the tooltipEnabled property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setTooltipEnabled(Boolean value) {
-		this.tooltipEnabled = value;
-	}
-
-	/**
-	 * Sets the value of the type property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setType(String value) {
-		this.type = value;
-	}
-
-	/**
-	 * Sets the value of the value property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link TemplateType }
-	 * 
-	 */
-	public void setValue(TemplateType value) {
-		this.value = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ColumnDataType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ColumnDataType.java
deleted file mode 100644
index 71404d8..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ColumnDataType.java
+++ /dev/null
@@ -1,274 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * A caveat on the foreground and background settings. They are exposed here but
- * may not work as expected: these are currently applied to the column through
- * the cell label provider; foreground seems not to change the font color but to
- * color the entire cell.
- * 
- * 
- * <p>
- * Java class for column-data-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="column-data-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="font" type="{http://org.eclipse.ptp/rm}font-type" minOccurs="0"/>
- *         &lt;element name="tooltip" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="alignment" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="background" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="foreground" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="moveable" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="resizable" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *       &lt;attribute name="width" type="{http://www.w3.org/2001/XMLSchema}int" default="-1" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "column-data-type", propOrder = { "font", "tooltip" })
-public class ColumnDataType {
-
-	protected FontType font;
-	protected String tooltip;
-	@XmlAttribute
-	protected String alignment;
-	@XmlAttribute
-	protected String background;
-	@XmlAttribute
-	protected String foreground;
-	@XmlAttribute
-	protected Boolean moveable;
-	@XmlAttribute
-	protected String name;
-	@XmlAttribute
-	protected Boolean resizable;
-	@XmlAttribute
-	protected Integer width;
-
-	/**
-	 * Gets the value of the alignment property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getAlignment() {
-		return alignment;
-	}
-
-	/**
-	 * Gets the value of the background property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getBackground() {
-		return background;
-	}
-
-	/**
-	 * Gets the value of the font property.
-	 * 
-	 * @return possible object is {@link FontType }
-	 * 
-	 */
-	public FontType getFont() {
-		return font;
-	}
-
-	/**
-	 * Gets the value of the foreground property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getForeground() {
-		return foreground;
-	}
-
-	/**
-	 * Gets the value of the name property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the value of the tooltip property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getTooltip() {
-		return tooltip;
-	}
-
-	/**
-	 * Gets the value of the width property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public int getWidth() {
-		if (width == null) {
-			return -1;
-		} else {
-			return width;
-		}
-	}
-
-	/**
-	 * Gets the value of the moveable property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isMoveable() {
-		if (moveable == null) {
-			return false;
-		} else {
-			return moveable;
-		}
-	}
-
-	/**
-	 * Gets the value of the resizable property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isResizable() {
-		if (resizable == null) {
-			return true;
-		} else {
-			return resizable;
-		}
-	}
-
-	/**
-	 * Sets the value of the alignment property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setAlignment(String value) {
-		this.alignment = value;
-	}
-
-	/**
-	 * Sets the value of the background property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setBackground(String value) {
-		this.background = value;
-	}
-
-	/**
-	 * Sets the value of the font property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link FontType }
-	 * 
-	 */
-	public void setFont(FontType value) {
-		this.font = value;
-	}
-
-	/**
-	 * Sets the value of the foreground property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setForeground(String value) {
-		this.foreground = value;
-	}
-
-	/**
-	 * Sets the value of the moveable property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setMoveable(Boolean value) {
-		this.moveable = value;
-	}
-
-	/**
-	 * Sets the value of the name property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setName(String value) {
-		this.name = value;
-	}
-
-	/**
-	 * Sets the value of the resizable property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setResizable(Boolean value) {
-		this.resizable = value;
-	}
-
-	/**
-	 * Sets the value of the tooltip property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setTooltip(String value) {
-		this.tooltip = value;
-	}
-
-	/**
-	 * Sets the value of the width property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setWidth(Integer value) {
-		this.width = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/CommandType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/CommandType.java
deleted file mode 100644
index 674e539..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/CommandType.java
+++ /dev/null
@@ -1,369 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for command-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="command-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="arg" type="{http://org.eclipse.ptp/rm}arg-type" maxOccurs="unbounded"/>
- *         &lt;element name="environment" type="{http://org.eclipse.ptp/rm}name-value-pair-type" maxOccurs="unbounded" minOccurs="0"/>
- *         &lt;element name="stdout-parser" type="{http://org.eclipse.ptp/rm}tokenizer-type" minOccurs="0"/>
- *         &lt;element name="stderr-parser" type="{http://org.eclipse.ptp/rm}tokenizer-type" minOccurs="0"/>
- *         &lt;element name="redirect-parser" type="{http://org.eclipse.ptp/rm}tokenizer-type" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="directory" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="ignoreExitStatus" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="redirectStderr" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="replaceEnvironment" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="streamBufferLimit" type="{http://www.w3.org/2001/XMLSchema}int" default="-1" />
- *       &lt;attribute name="waitForId" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "command-type", propOrder = { "arg", "environment", "stdoutParser", "stderrParser", "redirectParser" })
-public class CommandType {
-
-	@XmlElement(required = true)
-	protected List<ArgType> arg;
-	protected List<NameValuePairType> environment;
-	@XmlElement(name = "stdout-parser")
-	protected TokenizerType stdoutParser;
-	@XmlElement(name = "stderr-parser")
-	protected TokenizerType stderrParser;
-	@XmlElement(name = "redirect-parser")
-	protected TokenizerType redirectParser;
-	@XmlAttribute
-	protected String directory;
-	@XmlAttribute
-	protected Boolean ignoreExitStatus;
-	@XmlAttribute(required = true)
-	protected String name;
-	@XmlAttribute
-	protected Boolean redirectStderr;
-	@XmlAttribute
-	protected Boolean replaceEnvironment;
-	@XmlAttribute
-	protected Integer streamBufferLimit;
-	@XmlAttribute
-	protected Boolean waitForId;
-
-	/**
-	 * Gets the value of the arg property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the arg property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getArg().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list {@link ArgType }
-	 * 
-	 * 
-	 */
-	public List<ArgType> getArg() {
-		if (arg == null) {
-			arg = new ArrayList<ArgType>();
-		}
-		return this.arg;
-	}
-
-	/**
-	 * Gets the value of the directory property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getDirectory() {
-		return directory;
-	}
-
-	/**
-	 * Gets the value of the environment property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the environment property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getEnvironment().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link NameValuePairType }
-	 * 
-	 * 
-	 */
-	public List<NameValuePairType> getEnvironment() {
-		if (environment == null) {
-			environment = new ArrayList<NameValuePairType>();
-		}
-		return this.environment;
-	}
-
-	/**
-	 * Gets the value of the name property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the value of the redirectParser property.
-	 * 
-	 * @return possible object is {@link TokenizerType }
-	 * 
-	 */
-	public TokenizerType getRedirectParser() {
-		return redirectParser;
-	}
-
-	/**
-	 * Gets the value of the stderrParser property.
-	 * 
-	 * @return possible object is {@link TokenizerType }
-	 * 
-	 */
-	public TokenizerType getStderrParser() {
-		return stderrParser;
-	}
-
-	/**
-	 * Gets the value of the stdoutParser property.
-	 * 
-	 * @return possible object is {@link TokenizerType }
-	 * 
-	 */
-	public TokenizerType getStdoutParser() {
-		return stdoutParser;
-	}
-
-	/**
-	 * Gets the value of the streamBufferLimit property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public int getStreamBufferLimit() {
-		if (streamBufferLimit == null) {
-			return -1;
-		} else {
-			return streamBufferLimit;
-		}
-	}
-
-	/**
-	 * Gets the value of the ignoreExitStatus property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isIgnoreExitStatus() {
-		if (ignoreExitStatus == null) {
-			return false;
-		} else {
-			return ignoreExitStatus;
-		}
-	}
-
-	/**
-	 * Gets the value of the redirectStderr property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isRedirectStderr() {
-		if (redirectStderr == null) {
-			return false;
-		} else {
-			return redirectStderr;
-		}
-	}
-
-	/**
-	 * Gets the value of the replaceEnvironment property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isReplaceEnvironment() {
-		if (replaceEnvironment == null) {
-			return false;
-		} else {
-			return replaceEnvironment;
-		}
-	}
-
-	/**
-	 * Gets the value of the waitForId property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isWaitForId() {
-		if (waitForId == null) {
-			return true;
-		} else {
-			return waitForId;
-		}
-	}
-
-	/**
-	 * Sets the value of the directory property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setDirectory(String value) {
-		this.directory = value;
-	}
-
-	/**
-	 * Sets the value of the ignoreExitStatus property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setIgnoreExitStatus(Boolean value) {
-		this.ignoreExitStatus = value;
-	}
-
-	/**
-	 * Sets the value of the name property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setName(String value) {
-		this.name = value;
-	}
-
-	/**
-	 * Sets the value of the redirectParser property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link TokenizerType }
-	 * 
-	 */
-	public void setRedirectParser(TokenizerType value) {
-		this.redirectParser = value;
-	}
-
-	/**
-	 * Sets the value of the redirectStderr property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setRedirectStderr(Boolean value) {
-		this.redirectStderr = value;
-	}
-
-	/**
-	 * Sets the value of the replaceEnvironment property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setReplaceEnvironment(Boolean value) {
-		this.replaceEnvironment = value;
-	}
-
-	/**
-	 * Sets the value of the stderrParser property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link TokenizerType }
-	 * 
-	 */
-	public void setStderrParser(TokenizerType value) {
-		this.stderrParser = value;
-	}
-
-	/**
-	 * Sets the value of the stdoutParser property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link TokenizerType }
-	 * 
-	 */
-	public void setStdoutParser(TokenizerType value) {
-		this.stdoutParser = value;
-	}
-
-	/**
-	 * Sets the value of the streamBufferLimit property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setStreamBufferLimit(Integer value) {
-		this.streamBufferLimit = value;
-	}
-
-	/**
-	 * Sets the value of the waitForId property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setWaitForId(Boolean value) {
-		this.waitForId = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/CompositeType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/CompositeType.java
deleted file mode 100644
index bfceda3..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/CompositeType.java
+++ /dev/null
@@ -1,256 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElements;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for composite-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="composite-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="layout" type="{http://org.eclipse.ptp/rm}layout-type" minOccurs="0"/>
- *         &lt;element name="layout-data" type="{http://org.eclipse.ptp/rm}layout-data-type" minOccurs="0"/>
- *         &lt;element name="font" type="{http://org.eclipse.ptp/rm}font-type" minOccurs="0"/>
- *         &lt;element name="title" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;choice maxOccurs="unbounded">
- *           &lt;element name="tab-folder" type="{http://org.eclipse.ptp/rm}tab-folder-type"/>
- *           &lt;element name="composite" type="{http://org.eclipse.ptp/rm}composite-type"/>
- *           &lt;element name="widget" type="{http://org.eclipse.ptp/rm}widget-type"/>
- *           &lt;element name="viewer" type="{http://org.eclipse.ptp/rm}attribute-viewer-type"/>
- *         &lt;/choice>
- *       &lt;/sequence>
- *       &lt;attribute name="background" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="group" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="style" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "composite-type", propOrder = { "layout", "layoutData", "font", "title", "tabFolderOrCompositeOrWidget" })
-public class CompositeType {
-
-	protected LayoutType layout;
-	@XmlElement(name = "layout-data")
-	protected LayoutDataType layoutData;
-	protected FontType font;
-	protected String title;
-	@XmlElements({ @XmlElement(name = "tab-folder", type = TabFolderType.class),
-			@XmlElement(name = "viewer", type = AttributeViewerType.class),
-			@XmlElement(name = "composite", type = CompositeType.class), @XmlElement(name = "widget", type = WidgetType.class) })
-	protected List<Object> tabFolderOrCompositeOrWidget;
-	@XmlAttribute
-	protected String background;
-	@XmlAttribute
-	protected Boolean group;
-	@XmlAttribute
-	protected String style;
-
-	/**
-	 * Gets the value of the background property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getBackground() {
-		return background;
-	}
-
-	/**
-	 * Gets the value of the font property.
-	 * 
-	 * @return possible object is {@link FontType }
-	 * 
-	 */
-	public FontType getFont() {
-		return font;
-	}
-
-	/**
-	 * Gets the value of the layout property.
-	 * 
-	 * @return possible object is {@link LayoutType }
-	 * 
-	 */
-	public LayoutType getLayout() {
-		return layout;
-	}
-
-	/**
-	 * Gets the value of the layoutData property.
-	 * 
-	 * @return possible object is {@link LayoutDataType }
-	 * 
-	 */
-	public LayoutDataType getLayoutData() {
-		return layoutData;
-	}
-
-	/**
-	 * Gets the value of the style property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getStyle() {
-		return style;
-	}
-
-	/**
-	 * Gets the value of the tabFolderOrCompositeOrWidget property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the tabFolderOrCompositeOrWidget property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getTabFolderOrCompositeOrWidget().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link TabFolderType } {@link AttributeViewerType } {@link CompositeType }
-	 * {@link WidgetType }
-	 * 
-	 * 
-	 */
-	public List<Object> getTabFolderOrCompositeOrWidget() {
-		if (tabFolderOrCompositeOrWidget == null) {
-			tabFolderOrCompositeOrWidget = new ArrayList<Object>();
-		}
-		return this.tabFolderOrCompositeOrWidget;
-	}
-
-	/**
-	 * Gets the value of the title property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getTitle() {
-		return title;
-	}
-
-	/**
-	 * Gets the value of the group property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isGroup() {
-		if (group == null) {
-			return false;
-		} else {
-			return group;
-		}
-	}
-
-	/**
-	 * Sets the value of the background property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setBackground(String value) {
-		this.background = value;
-	}
-
-	/**
-	 * Sets the value of the font property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link FontType }
-	 * 
-	 */
-	public void setFont(FontType value) {
-		this.font = value;
-	}
-
-	/**
-	 * Sets the value of the group property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setGroup(Boolean value) {
-		this.group = value;
-	}
-
-	/**
-	 * Sets the value of the layout property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link LayoutType }
-	 * 
-	 */
-	public void setLayout(LayoutType value) {
-		this.layout = value;
-	}
-
-	/**
-	 * Sets the value of the layoutData property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link LayoutDataType }
-	 * 
-	 */
-	public void setLayoutData(LayoutDataType value) {
-		this.layoutData = value;
-	}
-
-	/**
-	 * Sets the value of the style property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setStyle(String value) {
-		this.style = value;
-	}
-
-	/**
-	 * Sets the value of the title property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setTitle(String value) {
-		this.title = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ControlType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ControlType.java
deleted file mode 100644
index 1a65de6..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ControlType.java
+++ /dev/null
@@ -1,508 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * The top-level control elements define the properties and attributes, files to
- * be staged, job script to be generated, commands specific to the resource
- * manager, and the layout of the Launch Tab. The resource manager
- * implementation constructs a variable map serving as the resource manager
- * "environment"; variables are dereferenced in the configuration file via
- * ${rm:name} or ${rm:name#getterName}; all properties and attributes defined in
- * the configuration are mapped. The following hard-coded variables are also
- * added at runtime:
- * 
- * control.user.name control.address
- * 
- * executablePath progArgs directory
- * 
- * 
- * <p>
- * Java class for control-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="control-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="property" type="{http://org.eclipse.ptp/rm}property-type" maxOccurs="unbounded" minOccurs="0"/>
- *         &lt;element name="attribute" type="{http://org.eclipse.ptp/rm}attribute-type" maxOccurs="unbounded" minOccurs="0"/>
- *         &lt;element name="managed-files" type="{http://org.eclipse.ptp/rm}managed-files-type" minOccurs="0"/>
- *         &lt;element name="script" type="{http://org.eclipse.ptp/rm}script-type" minOccurs="0"/>
- *         &lt;element name="start-up-command" type="{http://org.eclipse.ptp/rm}command-type" maxOccurs="unbounded" minOccurs="0"/>
- *         &lt;choice>
- *           &lt;sequence>
- *             &lt;element name="submit-interactive" type="{http://org.eclipse.ptp/rm}command-type"/>
- *             &lt;element name="submit-interactive-debug" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
- *           &lt;/sequence>
- *           &lt;sequence>
- *             &lt;element name="submit-batch" type="{http://org.eclipse.ptp/rm}command-type"/>
- *             &lt;element name="submit-batch-debug" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
- *           &lt;/sequence>
- *         &lt;/choice>
- *         &lt;element name="get-job-status" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
- *         &lt;element name="terminate-job" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
- *         &lt;element name="suspend-job" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
- *         &lt;element name="resume-job" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
- *         &lt;element name="hold-job" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
- *         &lt;element name="release-job" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
- *         &lt;element name="shut-down-command" type="{http://org.eclipse.ptp/rm}command-type" maxOccurs="unbounded" minOccurs="0"/>
- *         &lt;element name="launch-tab" type="{http://org.eclipse.ptp/rm}launch-tab-type" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "control-type", propOrder = { "property", "attribute", "managedFiles", "script", "startUpCommand",
-		"submitInteractive", "submitInteractiveDebug", "submitBatch", "submitBatchDebug", "getJobStatus", "terminateJob",
-		"suspendJob", "resumeJob", "holdJob", "releaseJob", "shutDownCommand", "launchTab" })
-public class ControlType {
-
-	protected List<PropertyType> property;
-	protected List<AttributeType> attribute;
-	@XmlElement(name = "managed-files")
-	protected ManagedFilesType managedFiles;
-	protected ScriptType script;
-	@XmlElement(name = "start-up-command")
-	protected List<CommandType> startUpCommand;
-	@XmlElement(name = "submit-interactive")
-	protected CommandType submitInteractive;
-	@XmlElement(name = "submit-interactive-debug")
-	protected CommandType submitInteractiveDebug;
-	@XmlElement(name = "submit-batch")
-	protected CommandType submitBatch;
-	@XmlElement(name = "submit-batch-debug")
-	protected CommandType submitBatchDebug;
-	@XmlElement(name = "get-job-status")
-	protected CommandType getJobStatus;
-	@XmlElement(name = "terminate-job")
-	protected CommandType terminateJob;
-	@XmlElement(name = "suspend-job")
-	protected CommandType suspendJob;
-	@XmlElement(name = "resume-job")
-	protected CommandType resumeJob;
-	@XmlElement(name = "hold-job")
-	protected CommandType holdJob;
-	@XmlElement(name = "release-job")
-	protected CommandType releaseJob;
-	@XmlElement(name = "shut-down-command")
-	protected List<CommandType> shutDownCommand;
-	@XmlElement(name = "launch-tab")
-	protected LaunchTabType launchTab;
-
-	/**
-	 * Gets the value of the attribute property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the attribute property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getAttribute().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link AttributeType }
-	 * 
-	 * 
-	 */
-	public List<AttributeType> getAttribute() {
-		if (attribute == null) {
-			attribute = new ArrayList<AttributeType>();
-		}
-		return this.attribute;
-	}
-
-	/**
-	 * Gets the value of the getJobStatus property.
-	 * 
-	 * @return possible object is {@link CommandType }
-	 * 
-	 */
-	public CommandType getGetJobStatus() {
-		return getJobStatus;
-	}
-
-	/**
-	 * Gets the value of the holdJob property.
-	 * 
-	 * @return possible object is {@link CommandType }
-	 * 
-	 */
-	public CommandType getHoldJob() {
-		return holdJob;
-	}
-
-	/**
-	 * Gets the value of the launchTab property.
-	 * 
-	 * @return possible object is {@link LaunchTabType }
-	 * 
-	 */
-	public LaunchTabType getLaunchTab() {
-		return launchTab;
-	}
-
-	/**
-	 * Gets the value of the managedFiles property.
-	 * 
-	 * @return possible object is {@link ManagedFilesType }
-	 * 
-	 */
-	public ManagedFilesType getManagedFiles() {
-		return managedFiles;
-	}
-
-	/**
-	 * Gets the value of the property property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the property property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getProperty().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link PropertyType }
-	 * 
-	 * 
-	 */
-	public List<PropertyType> getProperty() {
-		if (property == null) {
-			property = new ArrayList<PropertyType>();
-		}
-		return this.property;
-	}
-
-	/**
-	 * Gets the value of the releaseJob property.
-	 * 
-	 * @return possible object is {@link CommandType }
-	 * 
-	 */
-	public CommandType getReleaseJob() {
-		return releaseJob;
-	}
-
-	/**
-	 * Gets the value of the resumeJob property.
-	 * 
-	 * @return possible object is {@link CommandType }
-	 * 
-	 */
-	public CommandType getResumeJob() {
-		return resumeJob;
-	}
-
-	/**
-	 * Gets the value of the script property.
-	 * 
-	 * @return possible object is {@link ScriptType }
-	 * 
-	 */
-	public ScriptType getScript() {
-		return script;
-	}
-
-	/**
-	 * Gets the value of the shutDownCommand property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the shutDownCommand property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getShutDownCommand().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link CommandType }
-	 * 
-	 * 
-	 */
-	public List<CommandType> getShutDownCommand() {
-		if (shutDownCommand == null) {
-			shutDownCommand = new ArrayList<CommandType>();
-		}
-		return this.shutDownCommand;
-	}
-
-	/**
-	 * Gets the value of the startUpCommand property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the startUpCommand property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getStartUpCommand().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link CommandType }
-	 * 
-	 * 
-	 */
-	public List<CommandType> getStartUpCommand() {
-		if (startUpCommand == null) {
-			startUpCommand = new ArrayList<CommandType>();
-		}
-		return this.startUpCommand;
-	}
-
-	/**
-	 * Gets the value of the submitBatch property.
-	 * 
-	 * @return possible object is {@link CommandType }
-	 * 
-	 */
-	public CommandType getSubmitBatch() {
-		return submitBatch;
-	}
-
-	/**
-	 * Gets the value of the submitBatchDebug property.
-	 * 
-	 * @return possible object is {@link CommandType }
-	 * 
-	 */
-	public CommandType getSubmitBatchDebug() {
-		return submitBatchDebug;
-	}
-
-	/**
-	 * Gets the value of the submitInteractive property.
-	 * 
-	 * @return possible object is {@link CommandType }
-	 * 
-	 */
-	public CommandType getSubmitInteractive() {
-		return submitInteractive;
-	}
-
-	/**
-	 * Gets the value of the submitInteractiveDebug property.
-	 * 
-	 * @return possible object is {@link CommandType }
-	 * 
-	 */
-	public CommandType getSubmitInteractiveDebug() {
-		return submitInteractiveDebug;
-	}
-
-	/**
-	 * Gets the value of the suspendJob property.
-	 * 
-	 * @return possible object is {@link CommandType }
-	 * 
-	 */
-	public CommandType getSuspendJob() {
-		return suspendJob;
-	}
-
-	/**
-	 * Gets the value of the terminateJob property.
-	 * 
-	 * @return possible object is {@link CommandType }
-	 * 
-	 */
-	public CommandType getTerminateJob() {
-		return terminateJob;
-	}
-
-	/**
-	 * Sets the value of the getJobStatus property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link CommandType }
-	 * 
-	 */
-	public void setGetJobStatus(CommandType value) {
-		this.getJobStatus = value;
-	}
-
-	/**
-	 * Sets the value of the holdJob property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link CommandType }
-	 * 
-	 */
-	public void setHoldJob(CommandType value) {
-		this.holdJob = value;
-	}
-
-	/**
-	 * Sets the value of the launchTab property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link LaunchTabType }
-	 * 
-	 */
-	public void setLaunchTab(LaunchTabType value) {
-		this.launchTab = value;
-	}
-
-	/**
-	 * Sets the value of the managedFiles property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link ManagedFilesType }
-	 * 
-	 */
-	public void setManagedFiles(ManagedFilesType value) {
-		this.managedFiles = value;
-	}
-
-	/**
-	 * Sets the value of the releaseJob property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link CommandType }
-	 * 
-	 */
-	public void setReleaseJob(CommandType value) {
-		this.releaseJob = value;
-	}
-
-	/**
-	 * Sets the value of the resumeJob property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link CommandType }
-	 * 
-	 */
-	public void setResumeJob(CommandType value) {
-		this.resumeJob = value;
-	}
-
-	/**
-	 * Sets the value of the script property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link ScriptType }
-	 * 
-	 */
-	public void setScript(ScriptType value) {
-		this.script = value;
-	}
-
-	/**
-	 * Sets the value of the submitBatch property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link CommandType }
-	 * 
-	 */
-	public void setSubmitBatch(CommandType value) {
-		this.submitBatch = value;
-	}
-
-	/**
-	 * Sets the value of the submitBatchDebug property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link CommandType }
-	 * 
-	 */
-	public void setSubmitBatchDebug(CommandType value) {
-		this.submitBatchDebug = value;
-	}
-
-	/**
-	 * Sets the value of the submitInteractive property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link CommandType }
-	 * 
-	 */
-	public void setSubmitInteractive(CommandType value) {
-		this.submitInteractive = value;
-	}
-
-	/**
-	 * Sets the value of the submitInteractiveDebug property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link CommandType }
-	 * 
-	 */
-	public void setSubmitInteractiveDebug(CommandType value) {
-		this.submitInteractiveDebug = value;
-	}
-
-	/**
-	 * Sets the value of the suspendJob property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link CommandType }
-	 * 
-	 */
-	public void setSuspendJob(CommandType value) {
-		this.suspendJob = value;
-	}
-
-	/**
-	 * Sets the value of the terminateJob property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link CommandType }
-	 * 
-	 */
-	public void setTerminateJob(CommandType value) {
-		this.terminateJob = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/EntryType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/EntryType.java
deleted file mode 100644
index 6ef6778..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/EntryType.java
+++ /dev/null
@@ -1,206 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * Value abstraction. "key" and "value" can be arbitrary strings; the "Group"
- * attributes refer to the value of the matched regex group; "Index" attributes
- * refer to the index of the string array created by using the regex to split
- * the segment.
- * 
- * 
- * <p>
- * Java class for entry-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="entry-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="key" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="keyGroup" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
- *       &lt;attribute name="keyIndex" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
- *       &lt;attribute name="value" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="valueGroup" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
- *       &lt;attribute name="valueIndex" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "entry-type")
-public class EntryType {
-
-	@XmlAttribute
-	protected String key;
-	@XmlAttribute
-	protected Integer keyGroup;
-	@XmlAttribute
-	protected Integer keyIndex;
-	@XmlAttribute
-	protected String value;
-	@XmlAttribute
-	protected Integer valueGroup;
-	@XmlAttribute
-	protected Integer valueIndex;
-
-	/**
-	 * Gets the value of the key property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getKey() {
-		return key;
-	}
-
-	/**
-	 * Gets the value of the keyGroup property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public int getKeyGroup() {
-		if (keyGroup == null) {
-			return 0;
-		} else {
-			return keyGroup;
-		}
-	}
-
-	/**
-	 * Gets the value of the keyIndex property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public int getKeyIndex() {
-		if (keyIndex == null) {
-			return 0;
-		} else {
-			return keyIndex;
-		}
-	}
-
-	/**
-	 * Gets the value of the value property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * Gets the value of the valueGroup property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public int getValueGroup() {
-		if (valueGroup == null) {
-			return 0;
-		} else {
-			return valueGroup;
-		}
-	}
-
-	/**
-	 * Gets the value of the valueIndex property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public int getValueIndex() {
-		if (valueIndex == null) {
-			return 0;
-		} else {
-			return valueIndex;
-		}
-	}
-
-	/**
-	 * Sets the value of the key property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setKey(String value) {
-		this.key = value;
-	}
-
-	/**
-	 * Sets the value of the keyGroup property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setKeyGroup(Integer value) {
-		this.keyGroup = value;
-	}
-
-	/**
-	 * Sets the value of the keyIndex property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setKeyIndex(Integer value) {
-		this.keyIndex = value;
-	}
-
-	/**
-	 * Sets the value of the value property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setValue(String value) {
-		this.value = value;
-	}
-
-	/**
-	 * Sets the value of the valueGroup property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setValueGroup(Integer value) {
-		this.valueGroup = value;
-	}
-
-	/**
-	 * Sets the value of the valueIndex property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setValueIndex(Integer value) {
-		this.valueIndex = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FileMatchType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FileMatchType.java
deleted file mode 100644
index 497e92e..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FileMatchType.java
+++ /dev/null
@@ -1,163 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for file-match-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="file-match-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="efsAttributes" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="isDirectory" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="lastModifiedAfter" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="lastModifiedBefore" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="length" type="{http://www.w3.org/2001/XMLSchema}long" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "file-match-type")
-public class FileMatchType {
-
-	@XmlAttribute
-	protected String efsAttributes;
-	@XmlAttribute
-	protected Boolean isDirectory;
-	@XmlAttribute
-	protected String lastModifiedAfter;
-	@XmlAttribute
-	protected String lastModifiedBefore;
-	@XmlAttribute
-	protected Long length;
-
-	/**
-	 * Gets the value of the efsAttributes property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getEfsAttributes() {
-		return efsAttributes;
-	}
-
-	/**
-	 * Gets the value of the lastModifiedAfter property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getLastModifiedAfter() {
-		return lastModifiedAfter;
-	}
-
-	/**
-	 * Gets the value of the lastModifiedBefore property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getLastModifiedBefore() {
-		return lastModifiedBefore;
-	}
-
-	/**
-	 * Gets the value of the length property.
-	 * 
-	 * @return possible object is {@link Long }
-	 * 
-	 */
-	public Long getLength() {
-		return length;
-	}
-
-	/**
-	 * Gets the value of the isDirectory property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isIsDirectory() {
-		if (isDirectory == null) {
-			return false;
-		} else {
-			return isDirectory;
-		}
-	}
-
-	/**
-	 * Sets the value of the efsAttributes property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setEfsAttributes(String value) {
-		this.efsAttributes = value;
-	}
-
-	/**
-	 * Sets the value of the isDirectory property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setIsDirectory(Boolean value) {
-		this.isDirectory = value;
-	}
-
-	/**
-	 * Sets the value of the lastModifiedAfter property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setLastModifiedAfter(String value) {
-		this.lastModifiedAfter = value;
-	}
-
-	/**
-	 * Sets the value of the lastModifiedBefore property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setLastModifiedBefore(String value) {
-		this.lastModifiedBefore = value;
-	}
-
-	/**
-	 * Sets the value of the length property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Long }
-	 * 
-	 */
-	public void setLength(Long value) {
-		this.length = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FillLayoutType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FillLayoutType.java
deleted file mode 100644
index df8ae66..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FillLayoutType.java
+++ /dev/null
@@ -1,135 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for fill-layout-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="fill-layout-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="marginHeight" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginWidth" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="spacing" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "fill-layout-type")
-public class FillLayoutType {
-
-	@XmlAttribute
-	protected Integer marginHeight;
-	@XmlAttribute
-	protected Integer marginWidth;
-	@XmlAttribute
-	protected Integer spacing;
-	@XmlAttribute
-	protected String type;
-
-	/**
-	 * Gets the value of the marginHeight property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginHeight() {
-		return marginHeight;
-	}
-
-	/**
-	 * Gets the value of the marginWidth property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginWidth() {
-		return marginWidth;
-	}
-
-	/**
-	 * Gets the value of the spacing property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getSpacing() {
-		return spacing;
-	}
-
-	/**
-	 * Gets the value of the type property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getType() {
-		return type;
-	}
-
-	/**
-	 * Sets the value of the marginHeight property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginHeight(Integer value) {
-		this.marginHeight = value;
-	}
-
-	/**
-	 * Sets the value of the marginWidth property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginWidth(Integer value) {
-		this.marginWidth = value;
-	}
-
-	/**
-	 * Sets the value of the spacing property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setSpacing(Integer value) {
-		this.spacing = value;
-	}
-
-	/**
-	 * Sets the value of the type property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setType(String value) {
-		this.type = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FontType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FontType.java
deleted file mode 100644
index 2f91d34..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FontType.java
+++ /dev/null
@@ -1,127 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for font-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="font-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="size" type="{http://www.w3.org/2001/XMLSchema}int" default="9" />
- *       &lt;attribute name="style" default="normal">
- *         &lt;simpleType>
- *           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
- *             &lt;enumeration value="normal"/>
- *             &lt;enumeration value="bold"/>
- *             &lt;enumeration value="italic"/>
- *           &lt;/restriction>
- *         &lt;/simpleType>
- *       &lt;/attribute>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "font-type")
-public class FontType {
-
-	@XmlAttribute
-	protected String name;
-	@XmlAttribute
-	protected Integer size;
-	@XmlAttribute
-	protected String style;
-
-	/**
-	 * Gets the value of the name property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the value of the size property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public int getSize() {
-		if (size == null) {
-			return 9;
-		} else {
-			return size;
-		}
-	}
-
-	/**
-	 * Gets the value of the style property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getStyle() {
-		if (style == null) {
-			return "normal"; //$NON-NLS-1$
-		} else {
-			return style;
-		}
-	}
-
-	/**
-	 * Sets the value of the name property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setName(String value) {
-		this.name = value;
-	}
-
-	/**
-	 * Sets the value of the size property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setSize(Integer value) {
-		this.size = value;
-	}
-
-	/**
-	 * Sets the value of the style property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setStyle(String value) {
-		this.style = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FormAttachmentType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FormAttachmentType.java
deleted file mode 100644
index a9b2e5a..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FormAttachmentType.java
+++ /dev/null
@@ -1,135 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for form-attachment-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="form-attachment-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="alignment" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="denominator" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="numerator" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="offset" type="{http://www.w3.org/2001/XMLSchema}int" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "form-attachment-type")
-public class FormAttachmentType {
-
-	@XmlAttribute
-	protected String alignment;
-	@XmlAttribute
-	protected Integer denominator;
-	@XmlAttribute
-	protected Integer numerator;
-	@XmlAttribute
-	protected Integer offset;
-
-	/**
-	 * Gets the value of the alignment property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getAlignment() {
-		return alignment;
-	}
-
-	/**
-	 * Gets the value of the denominator property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getDenominator() {
-		return denominator;
-	}
-
-	/**
-	 * Gets the value of the numerator property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getNumerator() {
-		return numerator;
-	}
-
-	/**
-	 * Gets the value of the offset property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getOffset() {
-		return offset;
-	}
-
-	/**
-	 * Sets the value of the alignment property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setAlignment(String value) {
-		this.alignment = value;
-	}
-
-	/**
-	 * Sets the value of the denominator property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setDenominator(Integer value) {
-		this.denominator = value;
-	}
-
-	/**
-	 * Sets the value of the numerator property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setNumerator(Integer value) {
-		this.numerator = value;
-	}
-
-	/**
-	 * Sets the value of the offset property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setOffset(Integer value) {
-		this.offset = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FormDataType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FormDataType.java
deleted file mode 100644
index 9029c81..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FormDataType.java
+++ /dev/null
@@ -1,181 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for form-data-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="form-data-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="top" type="{http://org.eclipse.ptp/rm}form-attachment-type" minOccurs="0"/>
- *         &lt;element name="bottom" type="{http://org.eclipse.ptp/rm}form-attachment-type" minOccurs="0"/>
- *         &lt;element name="left" type="{http://org.eclipse.ptp/rm}form-attachment-type" minOccurs="0"/>
- *         &lt;element name="right" type="{http://org.eclipse.ptp/rm}form-attachment-type" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="height" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="width" type="{http://www.w3.org/2001/XMLSchema}int" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "form-data-type", propOrder = { "top", "bottom", "left", "right" })
-public class FormDataType {
-
-	protected FormAttachmentType top;
-	protected FormAttachmentType bottom;
-	protected FormAttachmentType left;
-	protected FormAttachmentType right;
-	@XmlAttribute
-	protected Integer height;
-	@XmlAttribute
-	protected Integer width;
-
-	/**
-	 * Gets the value of the bottom property.
-	 * 
-	 * @return possible object is {@link FormAttachmentType }
-	 * 
-	 */
-	public FormAttachmentType getBottom() {
-		return bottom;
-	}
-
-	/**
-	 * Gets the value of the height property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getHeight() {
-		return height;
-	}
-
-	/**
-	 * Gets the value of the left property.
-	 * 
-	 * @return possible object is {@link FormAttachmentType }
-	 * 
-	 */
-	public FormAttachmentType getLeft() {
-		return left;
-	}
-
-	/**
-	 * Gets the value of the right property.
-	 * 
-	 * @return possible object is {@link FormAttachmentType }
-	 * 
-	 */
-	public FormAttachmentType getRight() {
-		return right;
-	}
-
-	/**
-	 * Gets the value of the top property.
-	 * 
-	 * @return possible object is {@link FormAttachmentType }
-	 * 
-	 */
-	public FormAttachmentType getTop() {
-		return top;
-	}
-
-	/**
-	 * Gets the value of the width property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getWidth() {
-		return width;
-	}
-
-	/**
-	 * Sets the value of the bottom property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link FormAttachmentType }
-	 * 
-	 */
-	public void setBottom(FormAttachmentType value) {
-		this.bottom = value;
-	}
-
-	/**
-	 * Sets the value of the height property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setHeight(Integer value) {
-		this.height = value;
-	}
-
-	/**
-	 * Sets the value of the left property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link FormAttachmentType }
-	 * 
-	 */
-	public void setLeft(FormAttachmentType value) {
-		this.left = value;
-	}
-
-	/**
-	 * Sets the value of the right property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link FormAttachmentType }
-	 * 
-	 */
-	public void setRight(FormAttachmentType value) {
-		this.right = value;
-	}
-
-	/**
-	 * Sets the value of the top property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link FormAttachmentType }
-	 * 
-	 */
-	public void setTop(FormAttachmentType value) {
-		this.top = value;
-	}
-
-	/**
-	 * Sets the value of the width property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setWidth(Integer value) {
-		this.width = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FormLayoutType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FormLayoutType.java
deleted file mode 100644
index a087176..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/FormLayoutType.java
+++ /dev/null
@@ -1,207 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for form-layout-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="form-layout-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="marginBottom" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginHeight" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginLeft" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginRight" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginTop" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginWidth" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="spacing" type="{http://www.w3.org/2001/XMLSchema}int" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "form-layout-type")
-public class FormLayoutType {
-
-	@XmlAttribute
-	protected Integer marginBottom;
-	@XmlAttribute
-	protected Integer marginHeight;
-	@XmlAttribute
-	protected Integer marginLeft;
-	@XmlAttribute
-	protected Integer marginRight;
-	@XmlAttribute
-	protected Integer marginTop;
-	@XmlAttribute
-	protected Integer marginWidth;
-	@XmlAttribute
-	protected Integer spacing;
-
-	/**
-	 * Gets the value of the marginBottom property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginBottom() {
-		return marginBottom;
-	}
-
-	/**
-	 * Gets the value of the marginHeight property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginHeight() {
-		return marginHeight;
-	}
-
-	/**
-	 * Gets the value of the marginLeft property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginLeft() {
-		return marginLeft;
-	}
-
-	/**
-	 * Gets the value of the marginRight property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginRight() {
-		return marginRight;
-	}
-
-	/**
-	 * Gets the value of the marginTop property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginTop() {
-		return marginTop;
-	}
-
-	/**
-	 * Gets the value of the marginWidth property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginWidth() {
-		return marginWidth;
-	}
-
-	/**
-	 * Gets the value of the spacing property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getSpacing() {
-		return spacing;
-	}
-
-	/**
-	 * Sets the value of the marginBottom property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginBottom(Integer value) {
-		this.marginBottom = value;
-	}
-
-	/**
-	 * Sets the value of the marginHeight property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginHeight(Integer value) {
-		this.marginHeight = value;
-	}
-
-	/**
-	 * Sets the value of the marginLeft property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginLeft(Integer value) {
-		this.marginLeft = value;
-	}
-
-	/**
-	 * Sets the value of the marginRight property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginRight(Integer value) {
-		this.marginRight = value;
-	}
-
-	/**
-	 * Sets the value of the marginTop property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginTop(Integer value) {
-		this.marginTop = value;
-	}
-
-	/**
-	 * Sets the value of the marginWidth property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginWidth(Integer value) {
-		this.marginWidth = value;
-	}
-
-	/**
-	 * Sets the value of the spacing property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setSpacing(Integer value) {
-		this.spacing = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/GridDataType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/GridDataType.java
deleted file mode 100644
index b6dbc54..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/GridDataType.java
+++ /dev/null
@@ -1,359 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for grid-data-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="grid-data-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="grabExcessHorizontal" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *       &lt;attribute name="grabExcessVertical" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="heightHint" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="horizontalAlign" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="horizontalIndent" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="horizontalSpan" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="minHeight" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="minWidth" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="style" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="verticalAlign" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="verticalIndent" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="verticalSpan" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="widthHint" type="{http://www.w3.org/2001/XMLSchema}int" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "grid-data-type")
-public class GridDataType {
-
-	@XmlAttribute
-	protected Boolean grabExcessHorizontal;
-	@XmlAttribute
-	protected Boolean grabExcessVertical;
-	@XmlAttribute
-	protected Integer heightHint;
-	@XmlAttribute
-	protected String horizontalAlign;
-	@XmlAttribute
-	protected Integer horizontalIndent;
-	@XmlAttribute
-	protected Integer horizontalSpan;
-	@XmlAttribute
-	protected Integer minHeight;
-	@XmlAttribute
-	protected Integer minWidth;
-	@XmlAttribute
-	protected String style;
-	@XmlAttribute
-	protected String verticalAlign;
-	@XmlAttribute
-	protected Integer verticalIndent;
-	@XmlAttribute
-	protected Integer verticalSpan;
-	@XmlAttribute
-	protected Integer widthHint;
-
-	/**
-	 * Gets the value of the heightHint property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getHeightHint() {
-		return heightHint;
-	}
-
-	/**
-	 * Gets the value of the horizontalAlign property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getHorizontalAlign() {
-		return horizontalAlign;
-	}
-
-	/**
-	 * Gets the value of the horizontalIndent property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getHorizontalIndent() {
-		return horizontalIndent;
-	}
-
-	/**
-	 * Gets the value of the horizontalSpan property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getHorizontalSpan() {
-		return horizontalSpan;
-	}
-
-	/**
-	 * Gets the value of the minHeight property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMinHeight() {
-		return minHeight;
-	}
-
-	/**
-	 * Gets the value of the minWidth property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMinWidth() {
-		return minWidth;
-	}
-
-	/**
-	 * Gets the value of the style property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getStyle() {
-		return style;
-	}
-
-	/**
-	 * Gets the value of the verticalAlign property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getVerticalAlign() {
-		return verticalAlign;
-	}
-
-	/**
-	 * Gets the value of the verticalIndent property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getVerticalIndent() {
-		return verticalIndent;
-	}
-
-	/**
-	 * Gets the value of the verticalSpan property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getVerticalSpan() {
-		return verticalSpan;
-	}
-
-	/**
-	 * Gets the value of the widthHint property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getWidthHint() {
-		return widthHint;
-	}
-
-	/**
-	 * Gets the value of the grabExcessHorizontal property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isGrabExcessHorizontal() {
-		if (grabExcessHorizontal == null) {
-			return true;
-		} else {
-			return grabExcessHorizontal;
-		}
-	}
-
-	/**
-	 * Gets the value of the grabExcessVertical property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isGrabExcessVertical() {
-		if (grabExcessVertical == null) {
-			return false;
-		} else {
-			return grabExcessVertical;
-		}
-	}
-
-	/**
-	 * Sets the value of the grabExcessHorizontal property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setGrabExcessHorizontal(Boolean value) {
-		this.grabExcessHorizontal = value;
-	}
-
-	/**
-	 * Sets the value of the grabExcessVertical property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setGrabExcessVertical(Boolean value) {
-		this.grabExcessVertical = value;
-	}
-
-	/**
-	 * Sets the value of the heightHint property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setHeightHint(Integer value) {
-		this.heightHint = value;
-	}
-
-	/**
-	 * Sets the value of the horizontalAlign property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setHorizontalAlign(String value) {
-		this.horizontalAlign = value;
-	}
-
-	/**
-	 * Sets the value of the horizontalIndent property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setHorizontalIndent(Integer value) {
-		this.horizontalIndent = value;
-	}
-
-	/**
-	 * Sets the value of the horizontalSpan property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setHorizontalSpan(Integer value) {
-		this.horizontalSpan = value;
-	}
-
-	/**
-	 * Sets the value of the minHeight property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMinHeight(Integer value) {
-		this.minHeight = value;
-	}
-
-	/**
-	 * Sets the value of the minWidth property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMinWidth(Integer value) {
-		this.minWidth = value;
-	}
-
-	/**
-	 * Sets the value of the style property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setStyle(String value) {
-		this.style = value;
-	}
-
-	/**
-	 * Sets the value of the verticalAlign property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setVerticalAlign(String value) {
-		this.verticalAlign = value;
-	}
-
-	/**
-	 * Sets the value of the verticalIndent property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setVerticalIndent(Integer value) {
-		this.verticalIndent = value;
-	}
-
-	/**
-	 * Sets the value of the verticalSpan property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setVerticalSpan(Integer value) {
-		this.verticalSpan = value;
-	}
-
-	/**
-	 * Sets the value of the widthHint property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setWidthHint(Integer value) {
-		this.widthHint = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/GridLayoutType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/GridLayoutType.java
deleted file mode 100644
index ec2794b..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/GridLayoutType.java
+++ /dev/null
@@ -1,283 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for grid-layout-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="grid-layout-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="horizontalSpacing" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="makeColumnsEqualWidth" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *       &lt;attribute name="marginBottom" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginHeight" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginLeft" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginRight" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginTop" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginWidth" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="numColumns" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="verticalSpacing" type="{http://www.w3.org/2001/XMLSchema}int" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "grid-layout-type")
-public class GridLayoutType {
-
-	@XmlAttribute
-	protected Integer horizontalSpacing;
-	@XmlAttribute
-	protected Boolean makeColumnsEqualWidth;
-	@XmlAttribute
-	protected Integer marginBottom;
-	@XmlAttribute
-	protected Integer marginHeight;
-	@XmlAttribute
-	protected Integer marginLeft;
-	@XmlAttribute
-	protected Integer marginRight;
-	@XmlAttribute
-	protected Integer marginTop;
-	@XmlAttribute
-	protected Integer marginWidth;
-	@XmlAttribute
-	protected Integer numColumns;
-	@XmlAttribute
-	protected Integer verticalSpacing;
-
-	/**
-	 * Gets the value of the horizontalSpacing property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getHorizontalSpacing() {
-		return horizontalSpacing;
-	}
-
-	/**
-	 * Gets the value of the marginBottom property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginBottom() {
-		return marginBottom;
-	}
-
-	/**
-	 * Gets the value of the marginHeight property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginHeight() {
-		return marginHeight;
-	}
-
-	/**
-	 * Gets the value of the marginLeft property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginLeft() {
-		return marginLeft;
-	}
-
-	/**
-	 * Gets the value of the marginRight property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginRight() {
-		return marginRight;
-	}
-
-	/**
-	 * Gets the value of the marginTop property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginTop() {
-		return marginTop;
-	}
-
-	/**
-	 * Gets the value of the marginWidth property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginWidth() {
-		return marginWidth;
-	}
-
-	/**
-	 * Gets the value of the numColumns property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getNumColumns() {
-		return numColumns;
-	}
-
-	/**
-	 * Gets the value of the verticalSpacing property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getVerticalSpacing() {
-		return verticalSpacing;
-	}
-
-	/**
-	 * Gets the value of the makeColumnsEqualWidth property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isMakeColumnsEqualWidth() {
-		if (makeColumnsEqualWidth == null) {
-			return true;
-		} else {
-			return makeColumnsEqualWidth;
-		}
-	}
-
-	/**
-	 * Sets the value of the horizontalSpacing property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setHorizontalSpacing(Integer value) {
-		this.horizontalSpacing = value;
-	}
-
-	/**
-	 * Sets the value of the makeColumnsEqualWidth property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setMakeColumnsEqualWidth(Boolean value) {
-		this.makeColumnsEqualWidth = value;
-	}
-
-	/**
-	 * Sets the value of the marginBottom property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginBottom(Integer value) {
-		this.marginBottom = value;
-	}
-
-	/**
-	 * Sets the value of the marginHeight property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginHeight(Integer value) {
-		this.marginHeight = value;
-	}
-
-	/**
-	 * Sets the value of the marginLeft property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginLeft(Integer value) {
-		this.marginLeft = value;
-	}
-
-	/**
-	 * Sets the value of the marginRight property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginRight(Integer value) {
-		this.marginRight = value;
-	}
-
-	/**
-	 * Sets the value of the marginTop property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginTop(Integer value) {
-		this.marginTop = value;
-	}
-
-	/**
-	 * Sets the value of the marginWidth property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginWidth(Integer value) {
-		this.marginWidth = value;
-	}
-
-	/**
-	 * Sets the value of the numColumns property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setNumColumns(Integer value) {
-		this.numColumns = value;
-	}
-
-	/**
-	 * Sets the value of the verticalSpacing property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setVerticalSpacing(Integer value) {
-		this.verticalSpacing = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/LaunchTabType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/LaunchTabType.java
deleted file mode 100644
index 7db820c..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/LaunchTabType.java
+++ /dev/null
@@ -1,123 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * A recursive description of the UI element associated with the control part,
- * the Launch Tab. As in:
- * org.eclipse.ptp.rm.ui.launch.ExtendableRMLaunchConfigurationDynamicTab,
- * provides a top-level "switch" between controllers. There are a maximum of
- * three top-level tabs or "pages"; the basic and advanced (the names are
- * placeholders which need not correspond to their actual content or usage, and
- * can be changed) controllers are configurable; for the custom controller, see
- * below. (see below). The SWT-related types generally expose the fields of
- * their associated Java class.
- * 
- * 
- * <p>
- * Java class for launch-tab-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="launch-tab-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="basic" type="{http://org.eclipse.ptp/rm}tab-controller-type" minOccurs="0"/>
- *         &lt;element name="advanced" type="{http://org.eclipse.ptp/rm}tab-controller-type" minOccurs="0"/>
- *         &lt;element name="custom-controller" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "launch-tab-type", propOrder = { "basic", "advanced", "customController" })
-public class LaunchTabType {
-
-	protected TabControllerType basic;
-	protected TabControllerType advanced;
-	@XmlElement(name = "custom-controller")
-	protected String customController;
-
-	/**
-	 * Gets the value of the advanced property.
-	 * 
-	 * @return possible object is {@link TabControllerType }
-	 * 
-	 */
-	public TabControllerType getAdvanced() {
-		return advanced;
-	}
-
-	/**
-	 * Gets the value of the basic property.
-	 * 
-	 * @return possible object is {@link TabControllerType }
-	 * 
-	 */
-	public TabControllerType getBasic() {
-		return basic;
-	}
-
-	/**
-	 * Gets the value of the customController property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getCustomController() {
-		return customController;
-	}
-
-	/**
-	 * Sets the value of the advanced property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link TabControllerType }
-	 * 
-	 */
-	public void setAdvanced(TabControllerType value) {
-		this.advanced = value;
-	}
-
-	/**
-	 * Sets the value of the basic property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link TabControllerType }
-	 * 
-	 */
-	public void setBasic(TabControllerType value) {
-		this.basic = value;
-	}
-
-	/**
-	 * Sets the value of the customController property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setCustomController(String value) {
-		this.customController = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/LayoutDataType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/LayoutDataType.java
deleted file mode 100644
index bb024c1..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/LayoutDataType.java
+++ /dev/null
@@ -1,113 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for layout-data-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="layout-data-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;choice>
- *         &lt;element name="row-data" type="{http://org.eclipse.ptp/rm}row-data-type"/>
- *         &lt;element name="grid-data" type="{http://org.eclipse.ptp/rm}grid-data-type"/>
- *         &lt;element name="form-data" type="{http://org.eclipse.ptp/rm}form-data-type"/>
- *       &lt;/choice>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "layout-data-type", propOrder = { "rowData", "gridData", "formData" })
-public class LayoutDataType {
-
-	@XmlElement(name = "row-data")
-	protected RowDataType rowData;
-	@XmlElement(name = "grid-data")
-	protected GridDataType gridData;
-	@XmlElement(name = "form-data")
-	protected FormDataType formData;
-
-	/**
-	 * Gets the value of the formData property.
-	 * 
-	 * @return possible object is {@link FormDataType }
-	 * 
-	 */
-	public FormDataType getFormData() {
-		return formData;
-	}
-
-	/**
-	 * Gets the value of the gridData property.
-	 * 
-	 * @return possible object is {@link GridDataType }
-	 * 
-	 */
-	public GridDataType getGridData() {
-		return gridData;
-	}
-
-	/**
-	 * Gets the value of the rowData property.
-	 * 
-	 * @return possible object is {@link RowDataType }
-	 * 
-	 */
-	public RowDataType getRowData() {
-		return rowData;
-	}
-
-	/**
-	 * Sets the value of the formData property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link FormDataType }
-	 * 
-	 */
-	public void setFormData(FormDataType value) {
-		this.formData = value;
-	}
-
-	/**
-	 * Sets the value of the gridData property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link GridDataType }
-	 * 
-	 */
-	public void setGridData(GridDataType value) {
-		this.gridData = value;
-	}
-
-	/**
-	 * Sets the value of the rowData property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link RowDataType }
-	 * 
-	 */
-	public void setRowData(RowDataType value) {
-		this.rowData = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/LayoutType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/LayoutType.java
deleted file mode 100644
index 18d218d..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/LayoutType.java
+++ /dev/null
@@ -1,137 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for layout-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="layout-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;choice>
- *         &lt;element name="fill-layout" type="{http://org.eclipse.ptp/rm}fill-layout-type"/>
- *         &lt;element name="row-layout" type="{http://org.eclipse.ptp/rm}row-layout-type"/>
- *         &lt;element name="grid-layout" type="{http://org.eclipse.ptp/rm}grid-layout-type"/>
- *         &lt;element name="form-layout" type="{http://org.eclipse.ptp/rm}form-layout-type"/>
- *       &lt;/choice>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "layout-type", propOrder = { "fillLayout", "rowLayout", "gridLayout", "formLayout" })
-public class LayoutType {
-
-	@XmlElement(name = "fill-layout")
-	protected FillLayoutType fillLayout;
-	@XmlElement(name = "row-layout")
-	protected RowLayoutType rowLayout;
-	@XmlElement(name = "grid-layout")
-	protected GridLayoutType gridLayout;
-	@XmlElement(name = "form-layout")
-	protected FormLayoutType formLayout;
-
-	/**
-	 * Gets the value of the fillLayout property.
-	 * 
-	 * @return possible object is {@link FillLayoutType }
-	 * 
-	 */
-	public FillLayoutType getFillLayout() {
-		return fillLayout;
-	}
-
-	/**
-	 * Gets the value of the formLayout property.
-	 * 
-	 * @return possible object is {@link FormLayoutType }
-	 * 
-	 */
-	public FormLayoutType getFormLayout() {
-		return formLayout;
-	}
-
-	/**
-	 * Gets the value of the gridLayout property.
-	 * 
-	 * @return possible object is {@link GridLayoutType }
-	 * 
-	 */
-	public GridLayoutType getGridLayout() {
-		return gridLayout;
-	}
-
-	/**
-	 * Gets the value of the rowLayout property.
-	 * 
-	 * @return possible object is {@link RowLayoutType }
-	 * 
-	 */
-	public RowLayoutType getRowLayout() {
-		return rowLayout;
-	}
-
-	/**
-	 * Sets the value of the fillLayout property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link FillLayoutType }
-	 * 
-	 */
-	public void setFillLayout(FillLayoutType value) {
-		this.fillLayout = value;
-	}
-
-	/**
-	 * Sets the value of the formLayout property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link FormLayoutType }
-	 * 
-	 */
-	public void setFormLayout(FormLayoutType value) {
-		this.formLayout = value;
-	}
-
-	/**
-	 * Sets the value of the gridLayout property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link GridLayoutType }
-	 * 
-	 */
-	public void setGridLayout(GridLayoutType value) {
-		this.gridLayout = value;
-	}
-
-	/**
-	 * Sets the value of the rowLayout property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link RowLayoutType }
-	 * 
-	 */
-	public void setRowLayout(RowLayoutType value) {
-		this.rowLayout = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/LineType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/LineType.java
deleted file mode 100644
index ec29633..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/LineType.java
+++ /dev/null
@@ -1,74 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for line-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="line-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="arg" type="{http://org.eclipse.ptp/rm}arg-type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "line-type", propOrder = { "arg" })
-public class LineType {
-
-	protected List<ArgType> arg;
-
-	/**
-	 * Gets the value of the arg property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the arg property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getArg().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list {@link ArgType }
-	 * 
-	 * 
-	 */
-	public List<ArgType> getArg() {
-		if (arg == null) {
-			arg = new ArrayList<ArgType>();
-		}
-		return this.arg;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ManagedFileType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ManagedFileType.java
deleted file mode 100644
index d94ba73..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ManagedFileType.java
+++ /dev/null
@@ -1,199 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * If 'contents' is present, the file is written.
- * 
- * 
- * <p>
- * Java class for managed-file-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="managed-file-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;choice>
- *         &lt;element name="contents" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         &lt;element name="path" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *       &lt;/choice>
- *       &lt;attribute name="deleteAfterUse" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}anySimpleType" />
- *       &lt;attribute name="resolveContents" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *       &lt;attribute name="uniqueIdPrefix" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "managed-file-type", propOrder = { "contents", "path" })
-public class ManagedFileType {
-
-	protected String contents;
-	protected String path;
-	@XmlAttribute
-	protected Boolean deleteAfterUse;
-	@XmlAttribute(required = true)
-	protected String name;
-	@XmlAttribute
-	protected Boolean resolveContents;
-	@XmlAttribute
-	protected Boolean uniqueIdPrefix;
-
-	/**
-	 * Gets the value of the contents property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getContents() {
-		return contents;
-	}
-
-	/**
-	 * Gets the value of the name property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the value of the path property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getPath() {
-		return path;
-	}
-
-	/**
-	 * Gets the value of the deleteAfterUse property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isDeleteAfterUse() {
-		if (deleteAfterUse == null) {
-			return false;
-		} else {
-			return deleteAfterUse;
-		}
-	}
-
-	/**
-	 * Gets the value of the resolveContents property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isResolveContents() {
-		if (resolveContents == null) {
-			return true;
-		} else {
-			return resolveContents;
-		}
-	}
-
-	/**
-	 * Gets the value of the uniqueIdPrefix property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isUniqueIdPrefix() {
-		if (uniqueIdPrefix == null) {
-			return false;
-		} else {
-			return uniqueIdPrefix;
-		}
-	}
-
-	/**
-	 * Sets the value of the contents property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setContents(String value) {
-		this.contents = value;
-	}
-
-	/**
-	 * Sets the value of the deleteAfterUse property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setDeleteAfterUse(Boolean value) {
-		this.deleteAfterUse = value;
-	}
-
-	/**
-	 * Sets the value of the name property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setName(String value) {
-		this.name = value;
-	}
-
-	/**
-	 * Sets the value of the path property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setPath(String value) {
-		this.path = value;
-	}
-
-	/**
-	 * Sets the value of the resolveContents property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setResolveContents(Boolean value) {
-		this.resolveContents = value;
-	}
-
-	/**
-	 * Sets the value of the uniqueIdPrefix property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setUniqueIdPrefix(Boolean value) {
-		this.uniqueIdPrefix = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ManagedFilesType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ManagedFilesType.java
deleted file mode 100644
index 2197278..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ManagedFilesType.java
+++ /dev/null
@@ -1,109 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * List of files to be staged in connection with the job submission. NOTE: if
- * the resource manager uses a script, its staging as a file is handled
- * automatically and need not be included among the set of managed files. A
- * reserved property, "managed_file_for_script", should be used to reference
- * this file's path on the target resource.
- * 
- * 
- * <p>
- * Java class for managed-files-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="managed-files-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="file-staging-location" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="file" type="{http://org.eclipse.ptp/rm}managed-file-type" maxOccurs="unbounded"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "managed-files-type", propOrder = { "fileStagingLocation", "file" })
-public class ManagedFilesType {
-
-	@XmlElement(name = "file-staging-location")
-	protected String fileStagingLocation;
-	@XmlElement(required = true)
-	protected List<ManagedFileType> file;
-
-	/**
-	 * Gets the value of the file property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the file property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getFile().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link ManagedFileType }
-	 * 
-	 * 
-	 */
-	public List<ManagedFileType> getFile() {
-		if (file == null) {
-			file = new ArrayList<ManagedFileType>();
-		}
-		return this.file;
-	}
-
-	/**
-	 * Gets the value of the fileStagingLocation property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getFileStagingLocation() {
-		return fileStagingLocation;
-	}
-
-	/**
-	 * Sets the value of the fileStagingLocation property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setFileStagingLocation(String value) {
-		this.fileStagingLocation = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/MatchType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/MatchType.java
deleted file mode 100644
index 22213d5..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/MatchType.java
+++ /dev/null
@@ -1,141 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElements;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * If the match is satisfied, the apply operations are immediately called on the
- * current target property or attribute.
- * 
- * 
- * <p>
- * Java class for match-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="match-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="expression" type="{http://org.eclipse.ptp/rm}regex-type" minOccurs="0"/>
- *         &lt;choice maxOccurs="unbounded" minOccurs="0">
- *           &lt;element name="add" type="{http://org.eclipse.ptp/rm}add-type"/>
- *           &lt;element name="append" type="{http://org.eclipse.ptp/rm}append-type"/>
- *           &lt;element name="put" type="{http://org.eclipse.ptp/rm}put-type"/>
- *           &lt;element name="set" type="{http://org.eclipse.ptp/rm}set-type"/>
- *         &lt;/choice>
- *       &lt;/sequence>
- *       &lt;attribute name="moveToTop" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "match-type", propOrder = { "expression", "addOrAppendOrPut" })
-public class MatchType {
-
-	protected RegexType expression;
-	@XmlElements({ @XmlElement(name = "set", type = SetType.class), @XmlElement(name = "append", type = AppendType.class),
-			@XmlElement(name = "put", type = PutType.class), @XmlElement(name = "add", type = AddType.class) })
-	protected List<Object> addOrAppendOrPut;
-	@XmlAttribute
-	protected Boolean moveToTop;
-
-	/**
-	 * Gets the value of the addOrAppendOrPut property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the addOrAppendOrPut property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getAddOrAppendOrPut().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list {@link SetType }
-	 * {@link AppendType } {@link PutType } {@link AddType }
-	 * 
-	 * 
-	 */
-	public List<Object> getAddOrAppendOrPut() {
-		if (addOrAppendOrPut == null) {
-			addOrAppendOrPut = new ArrayList<Object>();
-		}
-		return this.addOrAppendOrPut;
-	}
-
-	/**
-	 * Gets the value of the expression property.
-	 * 
-	 * @return possible object is {@link RegexType }
-	 * 
-	 */
-	public RegexType getExpression() {
-		return expression;
-	}
-
-	/**
-	 * Gets the value of the moveToTop property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isMoveToTop() {
-		if (moveToTop == null) {
-			return false;
-		} else {
-			return moveToTop;
-		}
-	}
-
-	/**
-	 * Sets the value of the expression property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link RegexType }
-	 * 
-	 */
-	public void setExpression(RegexType value) {
-		this.expression = value;
-	}
-
-	/**
-	 * Sets the value of the moveToTop property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setMoveToTop(Boolean value) {
-		this.moveToTop = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/MonitorType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/MonitorType.java
deleted file mode 100644
index 4d07074..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/MonitorType.java
+++ /dev/null
@@ -1,132 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * This is a minimal definition.
- * 
- * 
- * <p>
- * Java class for monitor-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="monitor-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="property" type="{http://org.eclipse.ptp/rm}property-type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="refreshFrequencyInSeconds" type="{http://www.w3.org/2001/XMLSchema}int" default="60" />
- *       &lt;attribute name="schedulerType" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "monitor-type", propOrder = { "property" })
-public class MonitorType {
-
-	protected List<PropertyType> property;
-	@XmlAttribute
-	protected Integer refreshFrequencyInSeconds;
-	@XmlAttribute
-	protected String schedulerType;
-
-	/**
-	 * Gets the value of the property property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the property property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getProperty().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link PropertyType }
-	 * 
-	 * 
-	 */
-	public List<PropertyType> getProperty() {
-		if (property == null) {
-			property = new ArrayList<PropertyType>();
-		}
-		return this.property;
-	}
-
-	/**
-	 * Gets the value of the refreshFrequencyInSeconds property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public int getRefreshFrequencyInSeconds() {
-		if (refreshFrequencyInSeconds == null) {
-			return 60;
-		} else {
-			return refreshFrequencyInSeconds;
-		}
-	}
-
-	/**
-	 * Gets the value of the schedulerType property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getSchedulerType() {
-		return schedulerType;
-	}
-
-	/**
-	 * Sets the value of the refreshFrequencyInSeconds property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setRefreshFrequencyInSeconds(Integer value) {
-		this.refreshFrequencyInSeconds = value;
-	}
-
-	/**
-	 * Sets the value of the schedulerType property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setSchedulerType(String value) {
-		this.schedulerType = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/NameValuePairType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/NameValuePairType.java
deleted file mode 100644
index aba8b6e..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/NameValuePairType.java
+++ /dev/null
@@ -1,87 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for name-value-pair-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="name-value-pair-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="value" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "name-value-pair-type")
-public class NameValuePairType {
-
-	@XmlAttribute(required = true)
-	protected String name;
-	@XmlAttribute
-	protected String value;
-
-	/**
-	 * Gets the value of the name property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the value of the value property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * Sets the value of the name property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setName(String value) {
-		this.name = value;
-	}
-
-	/**
-	 * Sets the value of the value property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setValue(String value) {
-		this.value = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ObjectFactory.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ObjectFactory.java
deleted file mode 100644
index f8f9fbe..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ObjectFactory.java
+++ /dev/null
@@ -1,433 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.annotation.XmlElementDecl;
-import javax.xml.bind.annotation.XmlRegistry;
-import javax.xml.namespace.QName;
-
-/**
- * This object contains factory methods for each Java content interface and Java
- * element interface generated in the org.eclipse.ptp.rm.jaxb.core.data package.
- * <p>
- * An ObjectFactory allows you to programatically construct new instances of the
- * Java representation for XML content. The Java representation of XML content
- * can consist of schema derived interfaces and classes representing the binding
- * of schema type definitions, element declarations and model groups. Factory
- * methods for each of these are provided in this class.
- * 
- */
-@XmlRegistry
-public class ObjectFactory {
-
-	private final static QName _ResourceManagerBuilder_QNAME = new QName("http://org.eclipse.ptp/rm", "resource-manager-builder"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * Create a new ObjectFactory that can be used to create new instances of
-	 * schema derived classes for package: org.eclipse.ptp.rm.jaxb.core.data
-	 * 
-	 */
-	public ObjectFactory() {
-	}
-
-	/**
-	 * Create an instance of {@link AddType }
-	 * 
-	 */
-	public AddType createAddType() {
-		return new AddType();
-	}
-
-	/**
-	 * Create an instance of {@link AppendType }
-	 * 
-	 */
-	public AppendType createAppendType() {
-		return new AppendType();
-	}
-
-	/**
-	 * Create an instance of {@link ArgType }
-	 * 
-	 */
-	public ArgType createArgType() {
-		return new ArgType();
-	}
-
-	/**
-	 * Create an instance of {@link AttributeType }
-	 * 
-	 */
-	public AttributeType createAttributeType() {
-		return new AttributeType();
-	}
-
-	/**
-	 * Create an instance of {@link AttributeViewerType }
-	 * 
-	 */
-	public AttributeViewerType createAttributeViewerType() {
-		return new AttributeViewerType();
-	}
-
-	/**
-	 * Create an instance of {@link ColumnDataType }
-	 * 
-	 */
-	public ColumnDataType createColumnDataType() {
-		return new ColumnDataType();
-	}
-
-	/**
-	 * Create an instance of {@link CommandType }
-	 * 
-	 */
-	public CommandType createCommandType() {
-		return new CommandType();
-	}
-
-	/**
-	 * Create an instance of {@link CompositeType }
-	 * 
-	 */
-	public CompositeType createCompositeType() {
-		return new CompositeType();
-	}
-
-	/**
-	 * Create an instance of {@link ControlType }
-	 * 
-	 */
-	public ControlType createControlType() {
-		return new ControlType();
-	}
-
-	/**
-	 * Create an instance of {@link EntryType }
-	 * 
-	 */
-	public EntryType createEntryType() {
-		return new EntryType();
-	}
-
-	/**
-	 * Create an instance of {@link FileMatchType }
-	 * 
-	 */
-	public FileMatchType createFileMatchType() {
-		return new FileMatchType();
-	}
-
-	/**
-	 * Create an instance of {@link FillLayoutType }
-	 * 
-	 */
-	public FillLayoutType createFillLayoutType() {
-		return new FillLayoutType();
-	}
-
-	/**
-	 * Create an instance of {@link FontType }
-	 * 
-	 */
-	public FontType createFontType() {
-		return new FontType();
-	}
-
-	/**
-	 * Create an instance of {@link FormAttachmentType }
-	 * 
-	 */
-	public FormAttachmentType createFormAttachmentType() {
-		return new FormAttachmentType();
-	}
-
-	/**
-	 * Create an instance of {@link FormDataType }
-	 * 
-	 */
-	public FormDataType createFormDataType() {
-		return new FormDataType();
-	}
-
-	/**
-	 * Create an instance of {@link FormLayoutType }
-	 * 
-	 */
-	public FormLayoutType createFormLayoutType() {
-		return new FormLayoutType();
-	}
-
-	/**
-	 * Create an instance of {@link GridDataType }
-	 * 
-	 */
-	public GridDataType createGridDataType() {
-		return new GridDataType();
-	}
-
-	/**
-	 * Create an instance of {@link GridLayoutType }
-	 * 
-	 */
-	public GridLayoutType createGridLayoutType() {
-		return new GridLayoutType();
-	}
-
-	/**
-	 * Create an instance of {@link LaunchTabType }
-	 * 
-	 */
-	public LaunchTabType createLaunchTabType() {
-		return new LaunchTabType();
-	}
-
-	/**
-	 * Create an instance of {@link LayoutDataType }
-	 * 
-	 */
-	public LayoutDataType createLayoutDataType() {
-		return new LayoutDataType();
-	}
-
-	/**
-	 * Create an instance of {@link LayoutType }
-	 * 
-	 */
-	public LayoutType createLayoutType() {
-		return new LayoutType();
-	}
-
-	/**
-	 * Create an instance of {@link LineType }
-	 * 
-	 */
-	public LineType createLineType() {
-		return new LineType();
-	}
-
-	/**
-	 * Create an instance of {@link ManagedFilesType }
-	 * 
-	 */
-	public ManagedFilesType createManagedFilesType() {
-		return new ManagedFilesType();
-	}
-
-	/**
-	 * Create an instance of {@link ManagedFileType }
-	 * 
-	 */
-	public ManagedFileType createManagedFileType() {
-		return new ManagedFileType();
-	}
-
-	/**
-	 * Create an instance of {@link MatchType }
-	 * 
-	 */
-	public MatchType createMatchType() {
-		return new MatchType();
-	}
-
-	/**
-	 * Create an instance of {@link MonitorType }
-	 * 
-	 */
-	public MonitorType createMonitorType() {
-		return new MonitorType();
-	}
-
-	/**
-	 * Create an instance of {@link NameValuePairType }
-	 * 
-	 */
-	public NameValuePairType createNameValuePairType() {
-		return new NameValuePairType();
-	}
-
-	/**
-	 * Create an instance of {@link PropertyType }
-	 * 
-	 */
-	public PropertyType createPropertyType() {
-		return new PropertyType();
-	}
-
-	/**
-	 * Create an instance of {@link PutType }
-	 * 
-	 */
-	public PutType createPutType() {
-		return new PutType();
-	}
-
-	/**
-	 * Create an instance of {@link RegexType }
-	 * 
-	 */
-	public RegexType createRegexType() {
-		return new RegexType();
-	}
-
-	/**
-	 * Create an instance of {@link JAXBElement }{@code <}
-	 * {@link ResourceManagerData }{@code >}
-	 * 
-	 */
-	@XmlElementDecl(namespace = "http://org.eclipse.ptp/rm", name = "resource-manager-builder")
-	public JAXBElement<ResourceManagerData> createResourceManagerBuilder(ResourceManagerData value) {
-		return new JAXBElement<ResourceManagerData>(_ResourceManagerBuilder_QNAME, ResourceManagerData.class, null, value);
-	}
-
-	/**
-	 * Create an instance of {@link ResourceManagerData }
-	 * 
-	 */
-	public ResourceManagerData createResourceManagerData() {
-		return new ResourceManagerData();
-	}
-
-	/**
-	 * Create an instance of {@link RowDataType }
-	 * 
-	 */
-	public RowDataType createRowDataType() {
-		return new RowDataType();
-	}
-
-	/**
-	 * Create an instance of {@link RowLayoutType }
-	 * 
-	 */
-	public RowLayoutType createRowLayoutType() {
-		return new RowLayoutType();
-	}
-
-	/**
-	 * Create an instance of {@link ScriptType }
-	 * 
-	 */
-	public ScriptType createScriptType() {
-		return new ScriptType();
-	}
-
-	/**
-	 * Create an instance of {@link SetType }
-	 * 
-	 */
-	public SetType createSetType() {
-		return new SetType();
-	}
-
-	/**
-	 * Create an instance of {@link SiteType }
-	 * 
-	 */
-	public SiteType createSiteType() {
-		return new SiteType();
-	}
-
-	/**
-	 * Create an instance of {@link TabControllerType }
-	 * 
-	 */
-	public TabControllerType createTabControllerType() {
-		return new TabControllerType();
-	}
-
-	/**
-	 * Create an instance of {@link TabFolderType }
-	 * 
-	 */
-	public TabFolderType createTabFolderType() {
-		return new TabFolderType();
-	}
-
-	/**
-	 * Create an instance of {@link TabItemType }
-	 * 
-	 */
-	public TabItemType createTabItemType() {
-		return new TabItemType();
-	}
-
-	/**
-	 * Create an instance of {@link TargetType }
-	 * 
-	 */
-	public TargetType createTargetType() {
-		return new TargetType();
-	}
-
-	/**
-	 * Create an instance of {@link TemplateType }
-	 * 
-	 */
-	public TemplateType createTemplateType() {
-		return new TemplateType();
-	}
-
-	/**
-	 * Create an instance of {@link TestType }
-	 * 
-	 */
-	public TestType createTestType() {
-		return new TestType();
-	}
-
-	/**
-	 * Create an instance of {@link TestType.Else }
-	 * 
-	 */
-	public TestType.Else createTestTypeElse() {
-		return new TestType.Else();
-	}
-
-	/**
-	 * Create an instance of {@link TokenizerType }
-	 * 
-	 */
-	public TokenizerType createTokenizerType() {
-		return new TokenizerType();
-	}
-
-	/**
-	 * Create an instance of {@link ValidatorType }
-	 * 
-	 */
-	public ValidatorType createValidatorType() {
-		return new ValidatorType();
-	}
-
-	/**
-	 * Create an instance of {@link ViewerItemsType }
-	 * 
-	 */
-	public ViewerItemsType createViewerItemsType() {
-		return new ViewerItemsType();
-	}
-
-	/**
-	 * Create an instance of {@link WidgetType }
-	 * 
-	 */
-	public WidgetType createWidgetType() {
-		return new WidgetType();
-	}
-
-	/**
-	 * Create an instance of {@link WidgetType.DynamicText }
-	 * 
-	 */
-	public WidgetType.DynamicText createWidgetTypeDynamicText() {
-		return new WidgetType.DynamicText();
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/PropertyType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/PropertyType.java
deleted file mode 100644
index b2e4845..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/PropertyType.java
+++ /dev/null
@@ -1,208 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * A property is any variable necessary for the functioning of the resource
- * manager. Properties often (but not necessarily) are not visible. The value
- * for properties can by any primitive type, or lists or maps of strings. If
- * stdout from a scheduled job is to be delivered to the client, the "stdout"
- * property should be included in the resource manager property set. NOTE: the
- * untyped "value" element on properties is for internal use only; to give a
- * predefined (primitive) value, use the "default" element along with the "type"
- * attribute.
- * 
- * 
- * <p>
- * Java class for property-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="property-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="default" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="value" type="{http://www.w3.org/2001/XMLSchema}anyType" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="readOnly" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" default="java.lang.String" />
- *       &lt;attribute name="visible" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "property-type", propOrder = { "_default", "value" })
-public class PropertyType {
-
-	@XmlElement(name = "default")
-	protected String _default;
-	protected Object value;
-	@XmlAttribute
-	protected String name;
-	@XmlAttribute
-	protected Boolean readOnly;
-	@XmlAttribute
-	protected String type;
-	@XmlAttribute
-	protected Boolean visible;
-
-	/**
-	 * Gets the value of the default property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getDefault() {
-		return _default;
-	}
-
-	/**
-	 * Gets the value of the name property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the value of the type property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getType() {
-		if (type == null) {
-			return "java.lang.String"; //$NON-NLS-1$
-		} else {
-			return type;
-		}
-	}
-
-	/**
-	 * Gets the value of the value property.
-	 * 
-	 * @return possible object is {@link Object }
-	 * 
-	 */
-	public Object getValue() {
-		return value;
-	}
-
-	/**
-	 * Gets the value of the readOnly property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isReadOnly() {
-		if (readOnly == null) {
-			return false;
-		} else {
-			return readOnly;
-		}
-	}
-
-	/**
-	 * Gets the value of the visible property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isVisible() {
-		if (visible == null) {
-			return true;
-		} else {
-			return visible;
-		}
-	}
-
-	/**
-	 * Sets the value of the default property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setDefault(String value) {
-		this._default = value;
-	}
-
-	/**
-	 * Sets the value of the name property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setName(String value) {
-		this.name = value;
-	}
-
-	/**
-	 * Sets the value of the readOnly property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setReadOnly(Boolean value) {
-		this.readOnly = value;
-	}
-
-	/**
-	 * Sets the value of the type property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setType(String value) {
-		this.type = value;
-	}
-
-	/**
-	 * Sets the value of the value property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Object }
-	 * 
-	 */
-	public void setValue(Object value) {
-		this.value = value;
-	}
-
-	/**
-	 * Sets the value of the visible property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setVisible(Boolean value) {
-		this.visible = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/PutType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/PutType.java
deleted file mode 100644
index d84b988..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/PutType.java
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * References (or creates) a map as the value of the target field, and adds the
- * entry (key, value) to it.
- * 
- * 
- * <p>
- * Java class for put-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="put-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="entry" type="{http://org.eclipse.ptp/rm}entry-type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="field" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "put-type", propOrder = { "entry" })
-public class PutType {
-
-	protected List<EntryType> entry;
-	@XmlAttribute
-	protected String field;
-
-	/**
-	 * Gets the value of the entry property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the entry property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getEntry().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link EntryType }
-	 * 
-	 * 
-	 */
-	public List<EntryType> getEntry() {
-		if (entry == null) {
-			entry = new ArrayList<EntryType>();
-		}
-		return this.entry;
-	}
-
-	/**
-	 * Gets the value of the field property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getField() {
-		return field;
-	}
-
-	/**
-	 * Sets the value of the field property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setField(String value) {
-		this.field = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/RegexType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/RegexType.java
deleted file mode 100644
index a6f808e..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/RegexType.java
+++ /dev/null
@@ -1,139 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.XmlValue;
-
-/**
- * <p>
- * Java class for regex-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="regex-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="expression" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="flags" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="split" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "regex-type", propOrder = { "content" })
-public class RegexType {
-
-	@XmlValue
-	protected String content;
-	@XmlAttribute
-	protected String expression;
-	@XmlAttribute
-	protected String flags;
-	@XmlAttribute
-	protected Boolean split;
-
-	/**
-	 * Gets the value of the content property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getContent() {
-		return content;
-	}
-
-	/**
-	 * Gets the value of the expression property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getExpression() {
-		return expression;
-	}
-
-	/**
-	 * Gets the value of the flags property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getFlags() {
-		return flags;
-	}
-
-	/**
-	 * Gets the value of the split property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isSplit() {
-		if (split == null) {
-			return false;
-		} else {
-			return split;
-		}
-	}
-
-	/**
-	 * Sets the value of the content property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setContent(String value) {
-		this.content = value;
-	}
-
-	/**
-	 * Sets the value of the expression property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setExpression(String value) {
-		this.expression = value;
-	}
-
-	/**
-	 * Sets the value of the flags property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setFlags(String value) {
-		this.flags = value;
-	}
-
-	/**
-	 * Sets the value of the split property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setSplit(Boolean value) {
-		this.split = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ResourceManagerData.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ResourceManagerData.java
deleted file mode 100644
index 599746d..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ResourceManagerData.java
+++ /dev/null
@@ -1,145 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * It is assumed that the xml instance of the schema will bear a name which
- * sufficiently distinguishes it from others of a similar type; e.g.,
- * pbs-torque-v_2.3.7_abe is specific to an installation on the host abe,
- * ll-v_4.0 suits all installations of LoadLeveler version 4, etc.
- * 
- * 
- * <p>
- * Java class for resource-manager-data complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="resource-manager-data">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="site-data" type="{http://org.eclipse.ptp/rm}site-type" minOccurs="0"/>
- *         &lt;element name="control-data" type="{http://org.eclipse.ptp/rm}control-type"/>
- *         &lt;element name="monitor-data" type="{http://org.eclipse.ptp/rm}monitor-type"/>
- *       &lt;/sequence>
- *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "resource-manager-data", propOrder = { "siteData", "controlData", "monitorData" })
-public class ResourceManagerData {
-
-	@XmlElement(name = "site-data")
-	protected SiteType siteData;
-	@XmlElement(name = "control-data", required = true)
-	protected ControlType controlData;
-	@XmlElement(name = "monitor-data", required = true)
-	protected MonitorType monitorData;
-	@XmlAttribute
-	protected String name;
-
-	/**
-	 * Gets the value of the controlData property.
-	 * 
-	 * @return possible object is {@link ControlType }
-	 * 
-	 */
-	public ControlType getControlData() {
-		return controlData;
-	}
-
-	/**
-	 * Gets the value of the monitorData property.
-	 * 
-	 * @return possible object is {@link MonitorType }
-	 * 
-	 */
-	public MonitorType getMonitorData() {
-		return monitorData;
-	}
-
-	/**
-	 * Gets the value of the name property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the value of the siteData property.
-	 * 
-	 * @return possible object is {@link SiteType }
-	 * 
-	 */
-	public SiteType getSiteData() {
-		return siteData;
-	}
-
-	/**
-	 * Sets the value of the controlData property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link ControlType }
-	 * 
-	 */
-	public void setControlData(ControlType value) {
-		this.controlData = value;
-	}
-
-	/**
-	 * Sets the value of the monitorData property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link MonitorType }
-	 * 
-	 */
-	public void setMonitorData(MonitorType value) {
-		this.monitorData = value;
-	}
-
-	/**
-	 * Sets the value of the name property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setName(String value) {
-		this.name = value;
-	}
-
-	/**
-	 * Sets the value of the siteData property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link SiteType }
-	 * 
-	 */
-	public void setSiteData(SiteType value) {
-		this.siteData = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/RowDataType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/RowDataType.java
deleted file mode 100644
index 5f42816..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/RowDataType.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for row-data-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="row-data-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="exclude" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="height" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="width" type="{http://www.w3.org/2001/XMLSchema}int" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "row-data-type")
-public class RowDataType {
-
-	@XmlAttribute
-	protected Boolean exclude;
-	@XmlAttribute
-	protected Integer height;
-	@XmlAttribute
-	protected Integer width;
-
-	/**
-	 * Gets the value of the height property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getHeight() {
-		return height;
-	}
-
-	/**
-	 * Gets the value of the width property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getWidth() {
-		return width;
-	}
-
-	/**
-	 * Gets the value of the exclude property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isExclude() {
-		if (exclude == null) {
-			return false;
-		} else {
-			return exclude;
-		}
-	}
-
-	/**
-	 * Sets the value of the exclude property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setExclude(Boolean value) {
-		this.exclude = value;
-	}
-
-	/**
-	 * Sets the value of the height property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setHeight(Integer value) {
-		this.height = value;
-	}
-
-	/**
-	 * Sets the value of the width property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setWidth(Integer value) {
-		this.width = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/RowLayoutType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/RowLayoutType.java
deleted file mode 100644
index 7463ed3..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/RowLayoutType.java
+++ /dev/null
@@ -1,319 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for row-layout-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="row-layout-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="center" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="fill" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="justify" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="marginBottom" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginHeight" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginLeft" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginRight" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginTop" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="marginWidth" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       &lt;attribute name="pack" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="spacing" type="{http://www.w3.org/2001/XMLSchema}int" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "row-layout-type")
-public class RowLayoutType {
-
-	@XmlAttribute
-	protected Boolean center;
-	@XmlAttribute
-	protected Boolean fill;
-	@XmlAttribute
-	protected Boolean justify;
-	@XmlAttribute
-	protected Integer marginBottom;
-	@XmlAttribute
-	protected Integer marginHeight;
-	@XmlAttribute
-	protected Integer marginLeft;
-	@XmlAttribute
-	protected Integer marginRight;
-	@XmlAttribute
-	protected Integer marginTop;
-	@XmlAttribute
-	protected Integer marginWidth;
-	@XmlAttribute
-	protected Boolean pack;
-	@XmlAttribute
-	protected Integer spacing;
-
-	/**
-	 * Gets the value of the marginBottom property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginBottom() {
-		return marginBottom;
-	}
-
-	/**
-	 * Gets the value of the marginHeight property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginHeight() {
-		return marginHeight;
-	}
-
-	/**
-	 * Gets the value of the marginLeft property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginLeft() {
-		return marginLeft;
-	}
-
-	/**
-	 * Gets the value of the marginRight property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginRight() {
-		return marginRight;
-	}
-
-	/**
-	 * Gets the value of the marginTop property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginTop() {
-		return marginTop;
-	}
-
-	/**
-	 * Gets the value of the marginWidth property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getMarginWidth() {
-		return marginWidth;
-	}
-
-	/**
-	 * Gets the value of the spacing property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public Integer getSpacing() {
-		return spacing;
-	}
-
-	/**
-	 * Gets the value of the center property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isCenter() {
-		if (center == null) {
-			return false;
-		} else {
-			return center;
-		}
-	}
-
-	/**
-	 * Gets the value of the fill property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isFill() {
-		if (fill == null) {
-			return false;
-		} else {
-			return fill;
-		}
-	}
-
-	/**
-	 * Gets the value of the justify property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isJustify() {
-		if (justify == null) {
-			return false;
-		} else {
-			return justify;
-		}
-	}
-
-	/**
-	 * Gets the value of the pack property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isPack() {
-		if (pack == null) {
-			return false;
-		} else {
-			return pack;
-		}
-	}
-
-	/**
-	 * Sets the value of the center property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setCenter(Boolean value) {
-		this.center = value;
-	}
-
-	/**
-	 * Sets the value of the fill property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setFill(Boolean value) {
-		this.fill = value;
-	}
-
-	/**
-	 * Sets the value of the justify property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setJustify(Boolean value) {
-		this.justify = value;
-	}
-
-	/**
-	 * Sets the value of the marginBottom property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginBottom(Integer value) {
-		this.marginBottom = value;
-	}
-
-	/**
-	 * Sets the value of the marginHeight property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginHeight(Integer value) {
-		this.marginHeight = value;
-	}
-
-	/**
-	 * Sets the value of the marginLeft property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginLeft(Integer value) {
-		this.marginLeft = value;
-	}
-
-	/**
-	 * Sets the value of the marginRight property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginRight(Integer value) {
-		this.marginRight = value;
-	}
-
-	/**
-	 * Sets the value of the marginTop property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginTop(Integer value) {
-		this.marginTop = value;
-	}
-
-	/**
-	 * Sets the value of the marginWidth property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMarginWidth(Integer value) {
-		this.marginWidth = value;
-	}
-
-	/**
-	 * Sets the value of the pack property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setPack(Boolean value) {
-		this.pack = value;
-	}
-
-	/**
-	 * Sets the value of the spacing property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setSpacing(Integer value) {
-		this.spacing = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ScriptType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ScriptType.java
deleted file mode 100644
index 9fd6095..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ScriptType.java
+++ /dev/null
@@ -1,114 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * The script element specifies the contents line by line. Each line can be an
- * arbitrary set of arguments, each of which can be optionally resolved in the
- * environment, and which can be checked to see if the result after resolution
- * should be considered undefined and thus not included in the contents. The
- * insertEnvironmentAfter (line number) indicates where to insert extra
- * environment variable definitions passed in from the Environment Tab, if any.
- * 
- * 
- * <p>
- * Java class for script-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="script-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="line" type="{http://org.eclipse.ptp/rm}line-type" maxOccurs="unbounded"/>
- *       &lt;/sequence>
- *       &lt;attribute name="insertEnvironmentAfter" type="{http://www.w3.org/2001/XMLSchema}int" default="-1" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "script-type", propOrder = { "line" })
-public class ScriptType {
-
-	@XmlElement(required = true)
-	protected List<LineType> line;
-	@XmlAttribute
-	protected Integer insertEnvironmentAfter;
-
-	/**
-	 * Gets the value of the insertEnvironmentAfter property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public int getInsertEnvironmentAfter() {
-		if (insertEnvironmentAfter == null) {
-			return -1;
-		} else {
-			return insertEnvironmentAfter;
-		}
-	}
-
-	/**
-	 * Gets the value of the line property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the line property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getLine().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list {@link LineType }
-	 * 
-	 * 
-	 */
-	public List<LineType> getLine() {
-		if (line == null) {
-			line = new ArrayList<LineType>();
-		}
-		return this.line;
-	}
-
-	/**
-	 * Sets the value of the insertEnvironmentAfter property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setInsertEnvironmentAfter(Integer value) {
-		this.insertEnvironmentAfter = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/SetType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/SetType.java
deleted file mode 100644
index 97cafd7..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/SetType.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * Calls "setField(entry value)" on the target.
- * 
- * 
- * <p>
- * Java class for set-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="set-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="entry" type="{http://org.eclipse.ptp/rm}entry-type" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="field" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "set-type", propOrder = { "entry" })
-public class SetType {
-
-	protected EntryType entry;
-	@XmlAttribute
-	protected String field;
-
-	/**
-	 * Gets the value of the entry property.
-	 * 
-	 * @return possible object is {@link EntryType }
-	 * 
-	 */
-	public EntryType getEntry() {
-		return entry;
-	}
-
-	/**
-	 * Gets the value of the field property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getField() {
-		return field;
-	}
-
-	/**
-	 * Sets the value of the entry property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link EntryType }
-	 * 
-	 */
-	public void setEntry(EntryType value) {
-		this.entry = value;
-	}
-
-	/**
-	 * Sets the value of the field property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setField(String value) {
-		this.field = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/SiteType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/SiteType.java
deleted file mode 100644
index 4a5ec3c..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/SiteType.java
+++ /dev/null
@@ -1,94 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * An optional place to set default remote site information. The connections
- * strings are URIs.
- * 
- * 
- * <p>
- * Java class for site-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="site-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="control-connection" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="monitor-connection" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "site-type", propOrder = { "controlConnection", "monitorConnection" })
-public class SiteType {
-
-	@XmlElement(name = "control-connection")
-	protected String controlConnection;
-	@XmlElement(name = "monitor-connection")
-	protected String monitorConnection;
-
-	/**
-	 * Gets the value of the controlConnection property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getControlConnection() {
-		return controlConnection;
-	}
-
-	/**
-	 * Gets the value of the monitorConnection property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getMonitorConnection() {
-		return monitorConnection;
-	}
-
-	/**
-	 * Sets the value of the controlConnection property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setControlConnection(String value) {
-		this.controlConnection = value;
-	}
-
-	/**
-	 * Sets the value of the monitorConnection property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setMonitorConnection(String value) {
-		this.monitorConnection = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TabControllerType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TabControllerType.java
deleted file mode 100644
index 60f5cf6..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TabControllerType.java
+++ /dev/null
@@ -1,135 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElements;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for tab-controller-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="tab-controller-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="title" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         &lt;choice maxOccurs="unbounded">
- *           &lt;element name="tab-folder" type="{http://org.eclipse.ptp/rm}tab-folder-type"/>
- *           &lt;element name="composite" type="{http://org.eclipse.ptp/rm}composite-type"/>
- *         &lt;/choice>
- *       &lt;/sequence>
- *       &lt;attribute name="sharedEnvironment" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "tab-controller-type", propOrder = { "title", "tabFolderOrComposite" })
-public class TabControllerType {
-
-	@XmlElement(required = true)
-	protected String title;
-	@XmlElements({ @XmlElement(name = "tab-folder", type = TabFolderType.class),
-			@XmlElement(name = "composite", type = CompositeType.class) })
-	protected List<Object> tabFolderOrComposite;
-	@XmlAttribute
-	protected Boolean sharedEnvironment;
-
-	/**
-	 * Gets the value of the tabFolderOrComposite property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the tabFolderOrComposite property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getTabFolderOrComposite().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link TabFolderType } {@link CompositeType }
-	 * 
-	 * 
-	 */
-	public List<Object> getTabFolderOrComposite() {
-		if (tabFolderOrComposite == null) {
-			tabFolderOrComposite = new ArrayList<Object>();
-		}
-		return this.tabFolderOrComposite;
-	}
-
-	/**
-	 * Gets the value of the title property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getTitle() {
-		return title;
-	}
-
-	/**
-	 * Gets the value of the sharedEnvironment property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isSharedEnvironment() {
-		if (sharedEnvironment == null) {
-			return false;
-		} else {
-			return sharedEnvironment;
-		}
-	}
-
-	/**
-	 * Sets the value of the sharedEnvironment property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setSharedEnvironment(Boolean value) {
-		this.sharedEnvironment = value;
-	}
-
-	/**
-	 * Sets the value of the title property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setTitle(String value) {
-		this.title = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TabFolderType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TabFolderType.java
deleted file mode 100644
index e529399..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TabFolderType.java
+++ /dev/null
@@ -1,219 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for tab-folder-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="tab-folder-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="layout" type="{http://org.eclipse.ptp/rm}layout-type" minOccurs="0"/>
- *         &lt;element name="layout-data" type="{http://org.eclipse.ptp/rm}layout-data-type" minOccurs="0"/>
- *         &lt;element name="item" type="{http://org.eclipse.ptp/rm}tab-item-type" maxOccurs="unbounded"/>
- *         &lt;element name="tooltip" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="font" type="{http://org.eclipse.ptp/rm}font-type" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="background" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="style" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "tab-folder-type", propOrder = { "layout", "layoutData", "item", "tooltip", "font" })
-public class TabFolderType {
-
-	protected LayoutType layout;
-	@XmlElement(name = "layout-data")
-	protected LayoutDataType layoutData;
-	@XmlElement(required = true)
-	protected List<TabItemType> item;
-	protected String tooltip;
-	protected FontType font;
-	@XmlAttribute
-	protected String background;
-	@XmlAttribute
-	protected String style;
-
-	/**
-	 * Gets the value of the background property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getBackground() {
-		return background;
-	}
-
-	/**
-	 * Gets the value of the font property.
-	 * 
-	 * @return possible object is {@link FontType }
-	 * 
-	 */
-	public FontType getFont() {
-		return font;
-	}
-
-	/**
-	 * Gets the value of the item property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the item property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getItem().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link TabItemType }
-	 * 
-	 * 
-	 */
-	public List<TabItemType> getItem() {
-		if (item == null) {
-			item = new ArrayList<TabItemType>();
-		}
-		return this.item;
-	}
-
-	/**
-	 * Gets the value of the layout property.
-	 * 
-	 * @return possible object is {@link LayoutType }
-	 * 
-	 */
-	public LayoutType getLayout() {
-		return layout;
-	}
-
-	/**
-	 * Gets the value of the layoutData property.
-	 * 
-	 * @return possible object is {@link LayoutDataType }
-	 * 
-	 */
-	public LayoutDataType getLayoutData() {
-		return layoutData;
-	}
-
-	/**
-	 * Gets the value of the style property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getStyle() {
-		return style;
-	}
-
-	/**
-	 * Gets the value of the tooltip property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getTooltip() {
-		return tooltip;
-	}
-
-	/**
-	 * Sets the value of the background property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setBackground(String value) {
-		this.background = value;
-	}
-
-	/**
-	 * Sets the value of the font property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link FontType }
-	 * 
-	 */
-	public void setFont(FontType value) {
-		this.font = value;
-	}
-
-	/**
-	 * Sets the value of the layout property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link LayoutType }
-	 * 
-	 */
-	public void setLayout(LayoutType value) {
-		this.layout = value;
-	}
-
-	/**
-	 * Sets the value of the layoutData property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link LayoutDataType }
-	 * 
-	 */
-	public void setLayoutData(LayoutDataType value) {
-		this.layoutData = value;
-	}
-
-	/**
-	 * Sets the value of the style property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setStyle(String value) {
-		this.style = value;
-	}
-
-	/**
-	 * Sets the value of the tooltip property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setTooltip(String value) {
-		this.tooltip = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TabItemType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TabItemType.java
deleted file mode 100644
index 556b028..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TabItemType.java
+++ /dev/null
@@ -1,202 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElements;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for tab-item-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="tab-item-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="title" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         &lt;element name="tooltip" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="font" type="{http://org.eclipse.ptp/rm}font-type" minOccurs="0"/>
- *         &lt;choice maxOccurs="unbounded">
- *           &lt;element name="composite" type="{http://org.eclipse.ptp/rm}composite-type"/>
- *           &lt;element name="tab-folder" type="{http://org.eclipse.ptp/rm}tab-folder-type"/>
- *           &lt;element name="widget" type="{http://org.eclipse.ptp/rm}widget-type"/>
- *         &lt;/choice>
- *       &lt;/sequence>
- *       &lt;attribute name="background" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="style" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "tab-item-type", propOrder = { "title", "tooltip", "font", "compositeOrTabFolderOrWidget" })
-public class TabItemType {
-
-	@XmlElement(required = true)
-	protected String title;
-	protected String tooltip;
-	protected FontType font;
-	@XmlElements({ @XmlElement(name = "tab-folder", type = TabFolderType.class),
-			@XmlElement(name = "composite", type = CompositeType.class), @XmlElement(name = "widget", type = WidgetType.class) })
-	protected List<Object> compositeOrTabFolderOrWidget;
-	@XmlAttribute
-	protected String background;
-	@XmlAttribute
-	protected String style;
-
-	/**
-	 * Gets the value of the background property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getBackground() {
-		return background;
-	}
-
-	/**
-	 * Gets the value of the compositeOrTabFolderOrWidget property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the compositeOrTabFolderOrWidget property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getCompositeOrTabFolderOrWidget().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link TabFolderType } {@link CompositeType } {@link WidgetType }
-	 * 
-	 * 
-	 */
-	public List<Object> getCompositeOrTabFolderOrWidget() {
-		if (compositeOrTabFolderOrWidget == null) {
-			compositeOrTabFolderOrWidget = new ArrayList<Object>();
-		}
-		return this.compositeOrTabFolderOrWidget;
-	}
-
-	/**
-	 * Gets the value of the font property.
-	 * 
-	 * @return possible object is {@link FontType }
-	 * 
-	 */
-	public FontType getFont() {
-		return font;
-	}
-
-	/**
-	 * Gets the value of the style property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getStyle() {
-		return style;
-	}
-
-	/**
-	 * Gets the value of the title property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getTitle() {
-		return title;
-	}
-
-	/**
-	 * Gets the value of the tooltip property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getTooltip() {
-		return tooltip;
-	}
-
-	/**
-	 * Sets the value of the background property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setBackground(String value) {
-		this.background = value;
-	}
-
-	/**
-	 * Sets the value of the font property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link FontType }
-	 * 
-	 */
-	public void setFont(FontType value) {
-		this.font = value;
-	}
-
-	/**
-	 * Sets the value of the style property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setStyle(String value) {
-		this.style = value;
-	}
-
-	/**
-	 * Sets the value of the title property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setTitle(String value) {
-		this.title = value;
-	}
-
-	/**
-	 * Sets the value of the tooltip property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setTooltip(String value) {
-		this.tooltip = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TargetType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TargetType.java
deleted file mode 100644
index d8a9a5a..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TargetType.java
+++ /dev/null
@@ -1,209 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * The top-level tokenizer element: refers to an object, either to be
- * constructed at match time, or which pre-exists in the environment, on which
- * to apply the actions associated with matches and tests, along with a set of
- * possible matches and tests. All tests are run at the conclusion of the parse
- * operation. NOTE: when new targets are constructed, there is a merge operation
- * at the end of tokenization which attempts to combine objects into a single
- * instance identified by the 'name' attribute. This assumes that such names
- * will be unique and that any other values to be set on the object which are
- * not explicitly bound in some way to that name through the pattern will appear
- * on the stream before a new name does.
- * 
- * 
- * <p>
- * Java class for target-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="target-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="match" type="{http://org.eclipse.ptp/rm}match-type" maxOccurs="unbounded"/>
- *         &lt;element name="test" type="{http://org.eclipse.ptp/rm}test-type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="matchAll" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="ref" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="type" default="property">
- *         &lt;simpleType>
- *           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
- *             &lt;enumeration value="property"/>
- *             &lt;enumeration value="attribute"/>
- *           &lt;/restriction>
- *         &lt;/simpleType>
- *       &lt;/attribute>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "target-type", propOrder = { "match", "test" })
-public class TargetType {
-
-	@XmlElement(required = true)
-	protected List<MatchType> match;
-	protected List<TestType> test;
-	@XmlAttribute
-	protected Boolean matchAll;
-	@XmlAttribute
-	protected String ref;
-	@XmlAttribute
-	protected String type;
-
-	/**
-	 * Gets the value of the match property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the match property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getMatch().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link MatchType }
-	 * 
-	 * 
-	 */
-	public List<MatchType> getMatch() {
-		if (match == null) {
-			match = new ArrayList<MatchType>();
-		}
-		return this.match;
-	}
-
-	/**
-	 * Gets the value of the ref property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getRef() {
-		return ref;
-	}
-
-	/**
-	 * Gets the value of the test property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the test property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getTest().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list {@link TestType }
-	 * 
-	 * 
-	 */
-	public List<TestType> getTest() {
-		if (test == null) {
-			test = new ArrayList<TestType>();
-		}
-		return this.test;
-	}
-
-	/**
-	 * Gets the value of the type property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getType() {
-		if (type == null) {
-			return "property"; //$NON-NLS-1$
-		} else {
-			return type;
-		}
-	}
-
-	/**
-	 * Gets the value of the matchAll property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isMatchAll() {
-		if (matchAll == null) {
-			return false;
-		} else {
-			return matchAll;
-		}
-	}
-
-	/**
-	 * Sets the value of the matchAll property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setMatchAll(Boolean value) {
-		this.matchAll = value;
-	}
-
-	/**
-	 * Sets the value of the ref property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setRef(String value) {
-		this.ref = value;
-	}
-
-	/**
-	 * Sets the value of the type property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setType(String value) {
-		this.type = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TemplateType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TemplateType.java
deleted file mode 100644
index 9204621..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TemplateType.java
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * <p>
- * Java class for template-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="template-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="pattern" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="separator" type="{http://www.w3.org/2001/XMLSchema}string" default=" " />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "template-type")
-public class TemplateType {
-
-	@XmlAttribute
-	protected String pattern;
-	@XmlAttribute
-	protected String separator;
-
-	/**
-	 * Gets the value of the pattern property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getPattern() {
-		return pattern;
-	}
-
-	/**
-	 * Gets the value of the separator property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getSeparator() {
-		if (separator == null) {
-			return " "; //$NON-NLS-1$
-		} else {
-			return separator;
-		}
-	}
-
-	/**
-	 * Sets the value of the pattern property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setPattern(String value) {
-		this.pattern = value;
-	}
-
-	/**
-	 * Sets the value of the separator property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setSeparator(String value) {
-		this.separator = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TestType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TestType.java
deleted file mode 100644
index 97851ab..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TestType.java
+++ /dev/null
@@ -1,293 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElements;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * Useful for setting values based on other values produced during tokenization.
- * A test is one or more comparison operations (with arbitrary nesting inside
- * the three boolean operators), plus a set of actions to apply to the target
- * fields in the case of either success or failure (the "else" element). See
- * tokenizer-examples-xml, ex. 3, or the "get-job-status" example.
- * 
- * 
- * <p>
- * Java class for test-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="test-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="test" type="{http://org.eclipse.ptp/rm}test-type" maxOccurs="unbounded" minOccurs="0"/>
- *         &lt;element name="value" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="2" minOccurs="0"/>
- *         &lt;choice maxOccurs="unbounded" minOccurs="0">
- *           &lt;element name="add" type="{http://org.eclipse.ptp/rm}add-type"/>
- *           &lt;element name="append" type="{http://org.eclipse.ptp/rm}append-type"/>
- *           &lt;element name="put" type="{http://org.eclipse.ptp/rm}put-type"/>
- *           &lt;element name="set" type="{http://org.eclipse.ptp/rm}set-type"/>
- *         &lt;/choice>
- *         &lt;element name="else" minOccurs="0">
- *           &lt;complexType>
- *             &lt;complexContent>
- *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                 &lt;choice maxOccurs="unbounded">
- *                   &lt;element name="add" type="{http://org.eclipse.ptp/rm}add-type"/>
- *                   &lt;element name="append" type="{http://org.eclipse.ptp/rm}append-type"/>
- *                   &lt;element name="put" type="{http://org.eclipse.ptp/rm}put-type"/>
- *                   &lt;element name="set" type="{http://org.eclipse.ptp/rm}set-type"/>
- *                 &lt;/choice>
- *               &lt;/restriction>
- *             &lt;/complexContent>
- *           &lt;/complexType>
- *         &lt;/element>
- *       &lt;/sequence>
- *       &lt;attribute name="op">
- *         &lt;simpleType>
- *           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
- *             &lt;enumeration value="EQ"/>
- *             &lt;enumeration value="LT"/>
- *             &lt;enumeration value="GT"/>
- *             &lt;enumeration value="LE"/>
- *             &lt;enumeration value="GE"/>
- *             &lt;enumeration value="AND"/>
- *             &lt;enumeration value="OR"/>
- *             &lt;enumeration value="NOT"/>
- *           &lt;/restriction>
- *         &lt;/simpleType>
- *       &lt;/attribute>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "test-type", propOrder = { "test", "value", "addOrAppendOrPut", "_else" })
-public class TestType {
-
-	protected List<TestType> test;
-	protected List<String> value;
-	@XmlElements({ @XmlElement(name = "add", type = AddType.class), @XmlElement(name = "put", type = PutType.class),
-			@XmlElement(name = "set", type = SetType.class), @XmlElement(name = "append", type = AppendType.class) })
-	protected List<Object> addOrAppendOrPut;
-	@XmlElement(name = "else")
-	protected TestType.Else _else;
-	@XmlAttribute
-	protected String op;
-
-	/**
-	 * Gets the value of the test property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the test property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getTest().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list {@link TestType }
-	 * 
-	 * 
-	 */
-	public List<TestType> getTest() {
-		if (test == null) {
-			test = new ArrayList<TestType>();
-		}
-		return this.test;
-	}
-
-	/**
-	 * Gets the value of the value property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the value property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getValue().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list {@link String }
-	 * 
-	 * 
-	 */
-	public List<String> getValue() {
-		if (value == null) {
-			value = new ArrayList<String>();
-		}
-		return this.value;
-	}
-
-	/**
-	 * Gets the value of the addOrAppendOrPut property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the addOrAppendOrPut property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getAddOrAppendOrPut().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list {@link AddType }
-	 * {@link PutType } {@link SetType } {@link AppendType }
-	 * 
-	 * 
-	 */
-	public List<Object> getAddOrAppendOrPut() {
-		if (addOrAppendOrPut == null) {
-			addOrAppendOrPut = new ArrayList<Object>();
-		}
-		return this.addOrAppendOrPut;
-	}
-
-	/**
-	 * Gets the value of the else property.
-	 * 
-	 * @return possible object is {@link TestType.Else }
-	 * 
-	 */
-	public TestType.Else getElse() {
-		return _else;
-	}
-
-	/**
-	 * Sets the value of the else property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link TestType.Else }
-	 * 
-	 */
-	public void setElse(TestType.Else value) {
-		this._else = value;
-	}
-
-	/**
-	 * Gets the value of the op property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getOp() {
-		return op;
-	}
-
-	/**
-	 * Sets the value of the op property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setOp(String value) {
-		this.op = value;
-	}
-
-	/**
-	 * <p>
-	 * Java class for anonymous complex type.
-	 * 
-	 * <p>
-	 * The following schema fragment specifies the expected content contained
-	 * within this class.
-	 * 
-	 * <pre>
-	 * &lt;complexType>
-	 *   &lt;complexContent>
-	 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-	 *       &lt;choice maxOccurs="unbounded">
-	 *         &lt;element name="add" type="{http://org.eclipse.ptp/rm}add-type"/>
-	 *         &lt;element name="append" type="{http://org.eclipse.ptp/rm}append-type"/>
-	 *         &lt;element name="put" type="{http://org.eclipse.ptp/rm}put-type"/>
-	 *         &lt;element name="set" type="{http://org.eclipse.ptp/rm}set-type"/>
-	 *       &lt;/choice>
-	 *     &lt;/restriction>
-	 *   &lt;/complexContent>
-	 * &lt;/complexType>
-	 * </pre>
-	 * 
-	 * 
-	 */
-	@XmlAccessorType(XmlAccessType.FIELD)
-	@XmlType(name = "", propOrder = { "addOrAppendOrPut" })
-	public static class Else {
-
-		@XmlElements({ @XmlElement(name = "put", type = PutType.class), @XmlElement(name = "append", type = AppendType.class),
-				@XmlElement(name = "add", type = AddType.class), @XmlElement(name = "set", type = SetType.class) })
-		protected List<Object> addOrAppendOrPut;
-
-		/**
-		 * Gets the value of the addOrAppendOrPut property.
-		 * 
-		 * <p>
-		 * This accessor method returns a reference to the live list, not a
-		 * snapshot. Therefore any modification you make to the returned list
-		 * will be present inside the JAXB object. This is why there is not a
-		 * <CODE>set</CODE> method for the addOrAppendOrPut property.
-		 * 
-		 * <p>
-		 * For example, to add a new item, do as follows:
-		 * 
-		 * <pre>
-		 * getAddOrAppendOrPut().add(newItem);
-		 * </pre>
-		 * 
-		 * 
-		 * <p>
-		 * Objects of the following type(s) are allowed in the list
-		 * {@link PutType } {@link AppendType } {@link AddType } {@link SetType }
-		 * 
-		 * 
-		 */
-		public List<Object> getAddOrAppendOrPut() {
-			if (addOrAppendOrPut == null) {
-				addOrAppendOrPut = new ArrayList<Object>();
-			}
-			return this.addOrAppendOrPut;
-		}
-
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TokenizerType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TokenizerType.java
deleted file mode 100644
index 3cd4989..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/TokenizerType.java
+++ /dev/null
@@ -1,320 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * These are attached to the stdout or stderr streams in order to capture the
- * output of the command and add values to or side-effect the resource manager
- * environment.
- * 
- * 
- * <p>
- * Java class for tokenizer-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="tokenizer-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;choice>
- *           &lt;element name="type" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *           &lt;element name="target" type="{http://org.eclipse.ptp/rm}target-type" maxOccurs="unbounded"/>
- *         &lt;/choice>
- *         &lt;element name="exit-on" type="{http://org.eclipse.ptp/rm}regex-type" minOccurs="0"/>
- *         &lt;element name="exit-after" type="{http://org.eclipse.ptp/rm}regex-type" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="all" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="applyToAll" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="delim" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="includeDelim" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="maxMatchLen" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
- *       &lt;attribute name="save" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "tokenizer-type", propOrder = { "type", "target", "exitOn", "exitAfter" })
-public class TokenizerType {
-
-	protected String type;
-	protected List<TargetType> target;
-	@XmlElement(name = "exit-on")
-	protected RegexType exitOn;
-	@XmlElement(name = "exit-after")
-	protected RegexType exitAfter;
-	@XmlAttribute
-	protected Boolean all;
-	@XmlAttribute
-	protected Boolean applyToAll;
-	@XmlAttribute
-	protected String delim;
-	@XmlAttribute
-	protected Boolean includeDelim;
-	@XmlAttribute
-	protected Integer maxMatchLen;
-	@XmlAttribute
-	protected Integer save;
-
-	/**
-	 * Gets the value of the delim property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getDelim() {
-		return delim;
-	}
-
-	/**
-	 * Gets the value of the exitAfter property.
-	 * 
-	 * @return possible object is {@link RegexType }
-	 * 
-	 */
-	public RegexType getExitAfter() {
-		return exitAfter;
-	}
-
-	/**
-	 * Gets the value of the exitOn property.
-	 * 
-	 * @return possible object is {@link RegexType }
-	 * 
-	 */
-	public RegexType getExitOn() {
-		return exitOn;
-	}
-
-	/**
-	 * Gets the value of the maxMatchLen property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public int getMaxMatchLen() {
-		if (maxMatchLen == null) {
-			return 0;
-		} else {
-			return maxMatchLen;
-		}
-	}
-
-	/**
-	 * Gets the value of the save property.
-	 * 
-	 * @return possible object is {@link Integer }
-	 * 
-	 */
-	public int getSave() {
-		if (save == null) {
-			return 0;
-		} else {
-			return save;
-		}
-	}
-
-	/**
-	 * Gets the value of the target property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the target property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getTarget().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link TargetType }
-	 * 
-	 * 
-	 */
-	public List<TargetType> getTarget() {
-		if (target == null) {
-			target = new ArrayList<TargetType>();
-		}
-		return this.target;
-	}
-
-	/**
-	 * Gets the value of the type property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getType() {
-		return type;
-	}
-
-	/**
-	 * Gets the value of the all property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isAll() {
-		if (all == null) {
-			return false;
-		} else {
-			return all;
-		}
-	}
-
-	/**
-	 * Gets the value of the applyToAll property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isApplyToAll() {
-		if (applyToAll == null) {
-			return false;
-		} else {
-			return applyToAll;
-		}
-	}
-
-	/**
-	 * Gets the value of the includeDelim property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isIncludeDelim() {
-		if (includeDelim == null) {
-			return false;
-		} else {
-			return includeDelim;
-		}
-	}
-
-	/**
-	 * Sets the value of the all property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setAll(Boolean value) {
-		this.all = value;
-	}
-
-	/**
-	 * Sets the value of the applyToAll property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setApplyToAll(Boolean value) {
-		this.applyToAll = value;
-	}
-
-	/**
-	 * Sets the value of the delim property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setDelim(String value) {
-		this.delim = value;
-	}
-
-	/**
-	 * Sets the value of the exitAfter property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link RegexType }
-	 * 
-	 */
-	public void setExitAfter(RegexType value) {
-		this.exitAfter = value;
-	}
-
-	/**
-	 * Sets the value of the exitOn property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link RegexType }
-	 * 
-	 */
-	public void setExitOn(RegexType value) {
-		this.exitOn = value;
-	}
-
-	/**
-	 * Sets the value of the includeDelim property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setIncludeDelim(Boolean value) {
-		this.includeDelim = value;
-	}
-
-	/**
-	 * Sets the value of the maxMatchLen property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setMaxMatchLen(Integer value) {
-		this.maxMatchLen = value;
-	}
-
-	/**
-	 * Sets the value of the save property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Integer }
-	 * 
-	 */
-	public void setSave(Integer value) {
-		this.save = value;
-	}
-
-	/**
-	 * Sets the value of the type property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setType(String value) {
-		this.type = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ValidatorType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ValidatorType.java
deleted file mode 100644
index 8a83a51..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ValidatorType.java
+++ /dev/null
@@ -1,118 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * A regular expression or an EFS string used to validate an attribute value.
- * 
- * 
- * <p>
- * Java class for validator-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="validator-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;sequence>
- *           &lt;element name="regex" type="{http://org.eclipse.ptp/rm}regex-type" minOccurs="0"/>
- *           &lt;element name="file-info" type="{http://org.eclipse.ptp/rm}file-match-type" minOccurs="0"/>
- *         &lt;/sequence>
- *         &lt;element name="error-message" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "validator-type", propOrder = { "regex", "fileInfo", "errorMessage" })
-public class ValidatorType {
-
-	protected RegexType regex;
-	@XmlElement(name = "file-info")
-	protected FileMatchType fileInfo;
-	@XmlElement(name = "error-message")
-	protected String errorMessage;
-
-	/**
-	 * Gets the value of the errorMessage property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getErrorMessage() {
-		return errorMessage;
-	}
-
-	/**
-	 * Gets the value of the fileInfo property.
-	 * 
-	 * @return possible object is {@link FileMatchType }
-	 * 
-	 */
-	public FileMatchType getFileInfo() {
-		return fileInfo;
-	}
-
-	/**
-	 * Gets the value of the regex property.
-	 * 
-	 * @return possible object is {@link RegexType }
-	 * 
-	 */
-	public RegexType getRegex() {
-		return regex;
-	}
-
-	/**
-	 * Sets the value of the errorMessage property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setErrorMessage(String value) {
-		this.errorMessage = value;
-	}
-
-	/**
-	 * Sets the value of the fileInfo property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link FileMatchType }
-	 * 
-	 */
-	public void setFileInfo(FileMatchType value) {
-		this.fileInfo = value;
-	}
-
-	/**
-	 * Sets the value of the regex property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link RegexType }
-	 * 
-	 */
-	public void setRegex(RegexType value) {
-		this.regex = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ViewerItemsType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ViewerItemsType.java
deleted file mode 100644
index 302a41d..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/ViewerItemsType.java
+++ /dev/null
@@ -1,167 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * Which attributes or properties to include in or exclude from (if using the
- * "all" attributes) the viewer.
- * 
- * 
- * <p>
- * Java class for viewer-items-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="viewer-items-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="include" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
- *         &lt;element name="exclude" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="allDiscovered" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="allPredefined" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "viewer-items-type", propOrder = { "include", "exclude" })
-public class ViewerItemsType {
-
-	protected List<String> include;
-	protected List<String> exclude;
-	@XmlAttribute
-	protected Boolean allDiscovered;
-	@XmlAttribute
-	protected Boolean allPredefined;
-
-	/**
-	 * Gets the value of the exclude property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the exclude property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getExclude().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list {@link String }
-	 * 
-	 * 
-	 */
-	public List<String> getExclude() {
-		if (exclude == null) {
-			exclude = new ArrayList<String>();
-		}
-		return this.exclude;
-	}
-
-	/**
-	 * Gets the value of the include property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the include property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getInclude().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list {@link String }
-	 * 
-	 * 
-	 */
-	public List<String> getInclude() {
-		if (include == null) {
-			include = new ArrayList<String>();
-		}
-		return this.include;
-	}
-
-	/**
-	 * Gets the value of the allDiscovered property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isAllDiscovered() {
-		if (allDiscovered == null) {
-			return false;
-		} else {
-			return allDiscovered;
-		}
-	}
-
-	/**
-	 * Gets the value of the allPredefined property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isAllPredefined() {
-		if (allPredefined == null) {
-			return false;
-		} else {
-			return allPredefined;
-		}
-	}
-
-	/**
-	 * Sets the value of the allDiscovered property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setAllDiscovered(Boolean value) {
-		this.allDiscovered = value;
-	}
-
-	/**
-	 * Sets the value of the allPredefined property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setAllPredefined(Boolean value) {
-		this.allPredefined = value;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/WidgetType.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/WidgetType.java
deleted file mode 100644
index 36e37d8..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/WidgetType.java
+++ /dev/null
@@ -1,451 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-
-package org.eclipse.ptp.rm.jaxb.core.data;
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * 
- * Widget foreground, background (color) and font are in principle configurable,
- * though the font setting may not always work.
- * 
- * 
- * <p>
- * Java class for widget-type complex type.
- * 
- * <p>
- * The following schema fragment specifies the expected content contained within
- * this class.
- * 
- * <pre>
- * &lt;complexType name="widget-type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="layout-data" type="{http://org.eclipse.ptp/rm}layout-data-type" minOccurs="0"/>
- *         &lt;element name="font" type="{http://org.eclipse.ptp/rm}font-type" minOccurs="0"/>
- *         &lt;element name="tooltip" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="items-from" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="fixed-text" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="dynamic-text" minOccurs="0">
- *           &lt;complexType>
- *             &lt;complexContent>
- *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *                 &lt;sequence>
- *                   &lt;element name="arg" type="{http://org.eclipse.ptp/rm}arg-type" maxOccurs="unbounded"/>
- *                 &lt;/sequence>
- *               &lt;/restriction>
- *             &lt;/complexContent>
- *           &lt;/complexType>
- *         &lt;/element>
- *       &lt;/sequence>
- *       &lt;attribute name="background" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="foreground" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="readOnly" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="saveValueTo" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="style" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="type" default="text">
- *         &lt;simpleType>
- *           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
- *             &lt;enumeration value="label"/>
- *             &lt;enumeration value="text"/>
- *             &lt;enumeration value="checkbox"/>
- *             &lt;enumeration value="spinner"/>
- *             &lt;enumeration value="combo"/>
- *             &lt;enumeration value="radioButton"/>
- *             &lt;enumeration value="browseLocal"/>
- *             &lt;enumeration value="browseRemote"/>
- *           &lt;/restriction>
- *         &lt;/simpleType>
- *       &lt;/attribute>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "widget-type", propOrder = { "layoutData", "font", "tooltip", "itemsFrom", "fixedText", "dynamicText" })
-public class WidgetType {
-
-	@XmlElement(name = "layout-data")
-	protected LayoutDataType layoutData;
-	protected FontType font;
-	protected String tooltip;
-	@XmlElement(name = "items-from")
-	protected String itemsFrom;
-	@XmlElement(name = "fixed-text")
-	protected String fixedText;
-	@XmlElement(name = "dynamic-text")
-	protected WidgetType.DynamicText dynamicText;
-	@XmlAttribute
-	protected String background;
-	@XmlAttribute
-	protected String foreground;
-	@XmlAttribute
-	protected Boolean readOnly;
-	@XmlAttribute
-	protected String saveValueTo;
-	@XmlAttribute
-	protected String style;
-	@XmlAttribute
-	protected String title;
-	@XmlAttribute
-	protected String type;
-
-	/**
-	 * Gets the value of the layoutData property.
-	 * 
-	 * @return possible object is {@link LayoutDataType }
-	 * 
-	 */
-	public LayoutDataType getLayoutData() {
-		return layoutData;
-	}
-
-	/**
-	 * Sets the value of the layoutData property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link LayoutDataType }
-	 * 
-	 */
-	public void setLayoutData(LayoutDataType value) {
-		this.layoutData = value;
-	}
-
-	/**
-	 * Gets the value of the font property.
-	 * 
-	 * @return possible object is {@link FontType }
-	 * 
-	 */
-	public FontType getFont() {
-		return font;
-	}
-
-	/**
-	 * Sets the value of the font property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link FontType }
-	 * 
-	 */
-	public void setFont(FontType value) {
-		this.font = value;
-	}
-
-	/**
-	 * Gets the value of the tooltip property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getTooltip() {
-		return tooltip;
-	}
-
-	/**
-	 * Sets the value of the tooltip property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setTooltip(String value) {
-		this.tooltip = value;
-	}
-
-	/**
-	 * Gets the value of the itemsFrom property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getItemsFrom() {
-		return itemsFrom;
-	}
-
-	/**
-	 * Sets the value of the itemsFrom property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setItemsFrom(String value) {
-		this.itemsFrom = value;
-	}
-
-	/**
-	 * Gets the value of the fixedText property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getFixedText() {
-		return fixedText;
-	}
-
-	/**
-	 * Sets the value of the fixedText property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setFixedText(String value) {
-		this.fixedText = value;
-	}
-
-	/**
-	 * Gets the value of the dynamicText property.
-	 * 
-	 * @return possible object is {@link WidgetType.DynamicText }
-	 * 
-	 */
-	public WidgetType.DynamicText getDynamicText() {
-		return dynamicText;
-	}
-
-	/**
-	 * Sets the value of the dynamicText property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link WidgetType.DynamicText }
-	 * 
-	 */
-	public void setDynamicText(WidgetType.DynamicText value) {
-		this.dynamicText = value;
-	}
-
-	/**
-	 * Gets the value of the background property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getBackground() {
-		return background;
-	}
-
-	/**
-	 * Sets the value of the background property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setBackground(String value) {
-		this.background = value;
-	}
-
-	/**
-	 * Gets the value of the foreground property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getForeground() {
-		return foreground;
-	}
-
-	/**
-	 * Sets the value of the foreground property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setForeground(String value) {
-		this.foreground = value;
-	}
-
-	/**
-	 * Gets the value of the readOnly property.
-	 * 
-	 * @return possible object is {@link Boolean }
-	 * 
-	 */
-	public boolean isReadOnly() {
-		if (readOnly == null) {
-			return false;
-		} else {
-			return readOnly;
-		}
-	}
-
-	/**
-	 * Sets the value of the readOnly property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link Boolean }
-	 * 
-	 */
-	public void setReadOnly(Boolean value) {
-		this.readOnly = value;
-	}
-
-	/**
-	 * Gets the value of the saveValueTo property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getSaveValueTo() {
-		return saveValueTo;
-	}
-
-	/**
-	 * Sets the value of the saveValueTo property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setSaveValueTo(String value) {
-		this.saveValueTo = value;
-	}
-
-	/**
-	 * Gets the value of the style property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getStyle() {
-		return style;
-	}
-
-	/**
-	 * Sets the value of the style property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setStyle(String value) {
-		this.style = value;
-	}
-
-	/**
-	 * Gets the value of the title property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getTitle() {
-		return title;
-	}
-
-	/**
-	 * Sets the value of the title property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setTitle(String value) {
-		this.title = value;
-	}
-
-	/**
-	 * Gets the value of the type property.
-	 * 
-	 * @return possible object is {@link String }
-	 * 
-	 */
-	public String getType() {
-		if (type == null) {
-			return "text"; //$NON-NLS-1$
-		} else {
-			return type;
-		}
-	}
-
-	/**
-	 * Sets the value of the type property.
-	 * 
-	 * @param value
-	 *            allowed object is {@link String }
-	 * 
-	 */
-	public void setType(String value) {
-		this.type = value;
-	}
-
-	/**
-	 * <p>
-	 * Java class for anonymous complex type.
-	 * 
-	 * <p>
-	 * The following schema fragment specifies the expected content contained
-	 * within this class.
-	 * 
-	 * <pre>
-	 * &lt;complexType>
-	 *   &lt;complexContent>
-	 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
-	 *       &lt;sequence>
-	 *         &lt;element name="arg" type="{http://org.eclipse.ptp/rm}arg-type" maxOccurs="unbounded"/>
-	 *       &lt;/sequence>
-	 *     &lt;/restriction>
-	 *   &lt;/complexContent>
-	 * &lt;/complexType>
-	 * </pre>
-	 * 
-	 * 
-	 */
-	@XmlAccessorType(XmlAccessType.FIELD)
-	@XmlType(name = "", propOrder = { "arg" })
-	public static class DynamicText {
-
-		@XmlElement(required = true)
-		protected List<ArgType> arg;
-
-		/**
-		 * Gets the value of the arg property.
-		 * 
-		 * <p>
-		 * This accessor method returns a reference to the live list, not a
-		 * snapshot. Therefore any modification you make to the returned list
-		 * will be present inside the JAXB object. This is why there is not a
-		 * <CODE>set</CODE> method for the arg property.
-		 * 
-		 * <p>
-		 * For example, to add a new item, do as follows:
-		 * 
-		 * <pre>
-		 * getArg().add(newItem);
-		 * </pre>
-		 * 
-		 * 
-		 * <p>
-		 * Objects of the following type(s) are allowed in the list
-		 * {@link ArgType }
-		 * 
-		 * 
-		 */
-		public List<ArgType> getArg() {
-			if (arg == null) {
-				arg = new ArrayList<ArgType>();
-			}
-			return this.arg;
-		}
-
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/AbstractAssign.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/AbstractAssign.java
deleted file mode 100644
index 6df34ee..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/AbstractAssign.java
+++ /dev/null
@@ -1,333 +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.core.data.impl;
-
-import java.lang.reflect.Method;
-import java.math.BigInteger;
-import java.util.List;
-
-import org.eclipse.ptp.rm.jaxb.core.IAssign;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.data.AddType;
-import org.eclipse.ptp.rm.jaxb.core.data.AppendType;
-import org.eclipse.ptp.rm.jaxb.core.data.EntryType;
-import org.eclipse.ptp.rm.jaxb.core.data.PutType;
-import org.eclipse.ptp.rm.jaxb.core.data.SetType;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-
-/**
- * Base class for the wrappers around the data objects providing information as
- * to the operations on a target property to be undertaken when there is a
- * match.
- * 
- * @author arossi
- * 
- */
-public abstract class AbstractAssign implements IAssign, IJAXBNonNLSConstants {
-
-	protected String uuid;
-	protected String field;
-	protected Object target;
-	protected int index;
-
-	protected AbstractAssign() {
-		uuid = null;
-		field = null;
-		target = null;
-		index = 0;
-	}
-
-	/**
-	 * Applies the assignment.
-	 * 
-	 * @param values
-	 *            from the expression parsing (groups or segments)
-	 * @throws Throwable
-	 */
-	public void assign(String[] values) throws Throwable {
-		Object previous = get(target, field);
-		set(target, field, getValue(previous, values));
-		index++;
-	}
-
-	/**
-	 * Used in the case of references to targets constructed in connection with
-	 * the tokenization. The assumption is that an Assign action will be applied
-	 * only once to any given target, in the order of their construction; this
-	 * index keeps track of where this particular assign action is in the list.
-	 * 
-	 * @return the index of the current target
-	 */
-	public int getIndex() {
-		return index;
-	}
-
-	/**
-	 * @param target
-	 *            the current property or attribute
-	 */
-	public void setTarget(Object target) {
-		this.target = target;
-	}
-
-	/**
-	 * Decides whether the index of the map key is a segment (from
-	 * regex.split()) or a regex group number.
-	 * 
-	 * @param entry
-	 *            from the target map
-	 * @return the key index
-	 */
-	protected int determineKeyIndex(EntryType entry) {
-		int index = entry.getKeyIndex();
-		int group = entry.getKeyGroup();
-		if (index == 0 && group != 0) {
-			index = group;
-		}
-		return index;
-	}
-
-	/**
-	 * Decides whether the index of the map value is a segment (from
-	 * regex.split()) or a regex group number.
-	 * 
-	 * @param entry
-	 *            carries the key and value indices
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.Entry
-	 * @return the value index
-	 */
-	protected int determineValueIndex(EntryType entry) {
-		int index = entry.getValueIndex();
-		int group = entry.getValueGroup();
-		if (index == 0 && group != 0) {
-			index = group;
-		}
-		return index;
-	}
-
-	/**
-	 * Find the map key
-	 * 
-	 * @param entry
-	 *            carries the key and value indices
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.Entry
-	 * @param values
-	 *            the parsed result of the expression match
-	 * @return key
-	 * @throws Throwable
-	 */
-	protected String getKey(EntryType entry, String[] values) throws Throwable {
-		String k = entry.getKey();
-		if (k != null) {
-			return (String) normalizedValue(target, uuid, k, false);
-		}
-		int index = determineKeyIndex(entry);
-		if (values != null) {
-			return values[index];
-		}
-		return null;
-	}
-
-	/**
-	 * Find the map value
-	 * 
-	 * @param entry
-	 *            carries the key and value indices
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.Entry
-	 * @param values
-	 *            the parsed result of the expression match
-	 * @return value
-	 * @throws Throwable
-	 */
-	protected Object getValue(EntryType entry, String[] values) throws Throwable {
-		String v = entry.getValue();
-		if (v != null) {
-			return normalizedValue(target, uuid, v, true);
-		}
-		int index = determineValueIndex(entry);
-		if (values != null) {
-			return values[index];
-		}
-		return null;
-	}
-
-	/**
-	 * Method specific to the assign type for retrieving the values from the
-	 * matched expression.
-	 * 
-	 * @param previous
-	 *            the value currently assigned to the field of the target in
-	 *            question.
-	 * @param values
-	 *            the parsed result of the expression match
-	 * @return the value(s) retrieved from the parsed result
-	 * @throws Throwable
-	 */
-	protected abstract Object[] getValue(Object previous, String[] values) throws Throwable;
-
-	/**
-	 * Auxiliary for adding a wrapper implementation.
-	 * 
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param assign
-	 *            the JAXB element class.
-	 * @param list
-	 *            the list of wrappers
-	 */
-	static void add(String uuid, Object assign, List<IAssign> list) {
-		if (assign instanceof AddType) {
-			AddType add = (AddType) assign;
-			list.add(new AddImpl(uuid, add));
-			return;
-		}
-		if (assign instanceof AppendType) {
-			AppendType append = (AppendType) assign;
-			list.add(new AppendImpl(uuid, append));
-			return;
-		}
-		if (assign instanceof PutType) {
-			PutType put = (PutType) assign;
-			list.add(new PutImpl(uuid, put));
-			return;
-		}
-		if (assign instanceof SetType) {
-			SetType set = (SetType) assign;
-			list.add(new SetImpl(uuid, set));
-			return;
-		}
-	}
-
-	/**
-	 * Auxiliary using Java reflection to perform a get on the target.
-	 * 
-	 * @param target
-	 *            Property or Attribute
-	 * @param field
-	 *            on the target from which to retrieve the value.
-	 * @return value of the field
-	 * @throws Throwable
-	 */
-	static Object get(Object target, String field) throws Throwable {
-		String name = GET + field.substring(0, 1).toUpperCase() + field.substring(1);
-		Method method = null;
-		try {
-			method = target.getClass().getMethod(name, (Class[]) null);
-		} catch (Throwable t) {
-			name = IS + field.substring(0, 1).toUpperCase() + field.substring(1);
-			method = target.getClass().getMethod(name, (Class[]) null);
-		}
-		return method.invoke(target, (Object[]) null);
-	}
-
-	/**
-	 * Determines whether the input represents an object field or a resolvable
-	 * expression. Also converts string to int or boolean, if applicable,
-	 * 
-	 * @param target
-	 *            on which to apply the getter.
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param expression
-	 *            input to be interpreted
-	 * @param convert
-	 *            expression to boolean or int, if applicable.
-	 * 
-	 * @return value after dereferencing or normalization
-	 * @throws Throwable
-	 */
-	static Object normalizedValue(Object target, String uuid, String expression, boolean convert) throws Throwable {
-		if (expression.startsWith(PD)) {
-			if (target == null) {
-				return null;
-			}
-			String field = expression.substring(1);
-			return AbstractAssign.get(target, field);
-		} else if (expression.indexOf(OPENV) >= 0) {
-			expression = RMVariableMap.getActiveInstance().getString(uuid, expression);
-			return RMVariableMap.getActiveInstance().getString(uuid, expression);
-		} else if (convert) {
-			if (TRUE.equalsIgnoreCase(expression)) {
-				return true;
-			}
-			if (FALSE.equalsIgnoreCase(expression)) {
-				return false;
-			}
-			try {
-				if (expression.indexOf(DOT) >= 0) {
-					return new Double(expression);
-				}
-				return new Integer(expression);
-			} catch (NumberFormatException nfe) {
-				return expression;
-			}
-		}
-		return expression;
-	}
-
-	/**
-	 * Auxiliary using Java reflection to perform a set on the target.
-	 * 
-	 * @param target
-	 *            Property or Attribute
-	 * @param field
-	 *            on the target on which to set the value.
-	 * @param values
-	 *            corresonding to the parameter(s) of the set method (usually a
-	 *            single one)
-	 * @throws Throwable
-	 */
-	static void set(Object target, String field, Object[] values) throws Throwable {
-		String name = SET + field.substring(0, 1).toUpperCase() + field.substring(1);
-		Method[] methods = target.getClass().getMethods();
-		Method setter = null;
-		for (Method m : methods) {
-			if (m.getName().equals(name)) {
-				setter = m;
-			}
-		}
-		if (setter == null) {
-			throw new NoSuchMethodException(name + CO + SP + target);
-		}
-		if (values[0] != null) {
-			Class<?>[] mclzz = setter.getParameterTypes();
-			// better have 1 parameter
-			Class<?> param = mclzz[0];
-			Class<?> valueClass = values[0].getClass();
-			Throwable t = new IllegalArgumentException(name + SP + valueClass);
-			if (!param.equals(Object.class) && !param.isAssignableFrom(values[0].getClass())) {
-				if (valueClass.equals(String.class)) {
-					if (param.equals(Boolean.class)) {
-						values[0] = new Boolean(values[0].toString());
-					} else if (param.equals(Integer.class)) {
-						values[0] = new Integer(values[0].toString());
-					} else if (param.equals(BigInteger.class)) {
-						values[0] = new BigInteger(values[0].toString());
-					} else {
-						throw t;
-					}
-				} else if (valueClass.equals(Integer.class) || valueClass.equals(BigInteger.class)
-						|| valueClass.equals(Boolean.class)) {
-					if (param.equals(String.class)) {
-						values[0] = values[0].toString();
-					} else {
-						throw t;
-					}
-				} else {
-					throw t;
-				}
-			}
-		}
-		setter.invoke(target, values);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/AddImpl.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/AddImpl.java
deleted file mode 100644
index d971fa8..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/AddImpl.java
+++ /dev/null
@@ -1,61 +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.core.data.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ptp.rm.jaxb.core.data.AddType;
-import org.eclipse.ptp.rm.jaxb.core.data.EntryType;
-
-/**
- * Wrapper implementation.
- * 
- * @author arossi
- * 
- */
-public class AddImpl extends AbstractAssign {
-
-	private final List<EntryType> entries;
-
-	/**
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param add
-	 *            JAXB data element
-	 */
-	public AddImpl(String uuid, AddType add) {
-		this.uuid = uuid;
-		field = add.getField();
-		entries = add.getEntry();
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	protected Object[] getValue(Object previous, String[] values) throws Throwable {
-		List<String> list = null;
-		if (previous != null && previous instanceof List<?>) {
-			list = (List<String>) previous;
-		} else {
-			list = new ArrayList<String>();
-		}
-
-		if (!entries.isEmpty()) {
-			for (EntryType e : entries) {
-				Object v = getValue(e, values);
-				if (v != null) {
-					list.add(v.toString());
-				}
-			}
-		}
-		return new Object[] { list };
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/AppendImpl.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/AppendImpl.java
deleted file mode 100644
index 166f226..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/AppendImpl.java
+++ /dev/null
@@ -1,71 +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.core.data.impl;
-
-import java.util.List;
-
-import org.eclipse.ptp.rm.jaxb.core.data.AppendType;
-import org.eclipse.ptp.rm.jaxb.core.data.EntryType;
-
-/**
- * Wrapper implementation.
- * 
- * @author arossi
- * 
- */
-public class AppendImpl extends AbstractAssign {
-
-	private final String separator;
-	private final List<EntryType> entries;
-
-	/**
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param append
-	 *            JAXB data element
-	 */
-	public AppendImpl(String uuid, AppendType append) {
-		this.uuid = uuid;
-		this.field = append.getField();
-		separator = append.getSeparator();
-		entries = append.getEntry();
-	}
-
-	@Override
-	protected Object[] getValue(Object previous, String[] values) throws Throwable {
-		StringBuffer buffer = new StringBuffer();
-		if (!entries.isEmpty()) {
-			if (previous != null) {
-				buffer.append(previous);
-				if (separator != null) {
-					buffer.append(separator);
-				}
-			}
-			Object v = getValue(entries.get(0), values);
-			if (v != null) {
-				buffer.append(v);
-			}
-			int len = entries.size();
-			for (int i = 1; i < len; i++) {
-				v = getValue(entries.get(0), values);
-				if (v != null) {
-					if (separator != null) {
-						buffer.append(separator);
-					}
-					buffer.append(v);
-				}
-			}
-		} else {
-			buffer.append(previous);
-		}
-		return new Object[] { buffer.toString() };
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/ArgImpl.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/ArgImpl.java
deleted file mode 100644
index 57578b0..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/ArgImpl.java
+++ /dev/null
@@ -1,143 +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.core.data.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.IVariableMap;
-import org.eclipse.ptp.rm.jaxb.core.data.ArgType;
-
-/**
- * Wrapper implementation. An argument is a part of a string sequence which can
- * be resolved in an environment, and then tested to see if the result matches a
- * pattern indicating that the argument is equivalent to being undefined (and
- * thus should be eliminated).
- * 
- * @author arossi
- * 
- */
-public class ArgImpl implements IJAXBNonNLSConstants {
-
-	private final String uuid;
-	private final ArgType arg;
-	private final IVariableMap map;
-
-	/**
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param arg
-	 *            JAXB data element.
-	 * @param map
-	 *            environment in which to resolve content of the arg
-	 */
-	public ArgImpl(String uuid, ArgType arg, IVariableMap map) {
-		this.uuid = uuid;
-		this.arg = arg;
-		this.map = map;
-	}
-
-	/**
-	 * Will not return <code>null</code>.
-	 * 
-	 * @return argument resolved in the provided environment
-	 */
-	public String getResolved() {
-		return getResolved(uuid, arg, map);
-	}
-
-	/**
-	 * Auxiliary iterator.
-	 * 
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param args
-	 *            JAXB data elements.
-	 * @param map
-	 *            environment in which to resolve content of the arg
-	 * @return array of resolved arguments
-	 */
-	public static String[] getArgs(String uuid, List<ArgType> args, IVariableMap map) {
-		List<String> resolved = new ArrayList<String>();
-		for (ArgType a : args) {
-			resolved.add(getResolved(uuid, a, map));
-		}
-		return resolved.toArray(new String[0]);
-	}
-
-	/**
-	 * Auxiliary iterator.
-	 * 
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param args
-	 *            JAXB data elements.
-	 * @param map
-	 *            environment in which to resolve content of the arg
-	 * @return whitespace separated string of resolved arguments
-	 */
-	public static String toString(String uuid, List<ArgType> args, IVariableMap map) {
-		if (args.isEmpty()) {
-			return ZEROSTR;
-		}
-		StringBuffer b = new StringBuffer();
-		String resolved = getResolved(uuid, args.get(0), map);
-		if (!ZEROSTR.equals(resolved)) {
-			b.append(resolved);
-		}
-		for (int i = 1; i < args.size(); i++) {
-			resolved = getResolved(uuid, args.get(i), map);
-			if (!ZEROSTR.equals(resolved)) {
-				b.append(SP).append(resolved);
-			}
-		}
-		return b.toString();
-	}
-
-	/**
-	 * Checks first to see if resolution is indicated for the argument. After
-	 * calling the resolver, checks to see if the resulting argument should be
-	 * considered equivalent to undefined.
-	 * 
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param arg
-	 *            JAXB data element
-	 * @param map
-	 *            environment in which to resolve content of the arg
-	 * @return result of resolution
-	 */
-	private static String getResolved(String uuid, ArgType arg, IVariableMap map) {
-		if (arg == null) {
-			return ZEROSTR;
-		}
-		if (!arg.isResolve()) {
-			return arg.getContent();
-		}
-		String dereferenced = map.getString(uuid, arg.getContent());
-		if (dereferenced != null) {
-			dereferenced = dereferenced.trim();
-		}
-		String undefined = arg.getIsUndefinedIfMatches();
-		if (undefined != null) {
-			undefined = undefined.trim();
-			undefined = map.getString(uuid, undefined);
-			if (dereferenced != null && dereferenced.matches(undefined)) {
-				return ZEROSTR;
-			}
-		}
-		return dereferenced;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/LineImpl.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/LineImpl.java
deleted file mode 100644
index 4811e30..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/LineImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.eclipse.ptp.rm.jaxb.core.data.impl;
-
-import java.util.List;
-
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.IVariableMap;
-import org.eclipse.ptp.rm.jaxb.core.data.ArgType;
-import org.eclipse.ptp.rm.jaxb.core.data.LineType;
-
-/**
- * Wrapper implementation.
- * 
- * @author arossi
- * 
- */
-public class LineImpl implements IJAXBNonNLSConstants {
-
-	private final String uuid;
-	private final IVariableMap map;
-	private final List<ArgType> args;
-
-	/**
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param line
-	 *            JAXB data element
-	 * @param map
-	 *            environment in which to resolve content of the line
-	 */
-	public LineImpl(String uuid, LineType line, IVariableMap map) {
-		this.uuid = uuid;
-		this.map = map;
-		args = line.getArg();
-	}
-
-	/**
-	 * Will not return <code>null</code>.
-	 * 
-	 * @return argument resolved in the provided environment
-	 */
-	public String getResolved() {
-		return ArgImpl.toString(uuid, args, map);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/MatchImpl.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/MatchImpl.java
deleted file mode 100644
index 160ee70..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/MatchImpl.java
+++ /dev/null
@@ -1,142 +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.core.data.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ptp.rm.jaxb.core.IAssign;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.data.MatchType;
-import org.eclipse.ptp.rm.jaxb.core.data.RegexType;
-
-/**
- * Wrapper implementation. Consists of a Regular Expression and a reference to a
- * target (Property or Attribute). When the regex is satisfied, the match
- * applies the list of assign actions to its target.<br>
- * <br>
- * A match can also be set to force its target to the front of the list of
- * targets held by the tokenizer (<code>moveToTop</code>) when the match is
- * successful.
- * 
- * @author arossi
- * 
- */
-public class MatchImpl implements IJAXBNonNLSConstants {
-
-	private RegexImpl regex;
-	private final TargetImpl target;
-	private List<IAssign> assign;
-	private final boolean moveToTop;
-	private boolean matched;
-
-	/**
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param match
-	 *            JAXB data element
-	 * @param target
-	 *            Wrapper for the target to which this match is bound
-	 */
-	public MatchImpl(String uuid, MatchType match, TargetImpl target) {
-		this.target = target;
-		this.moveToTop = match.isMoveToTop();
-		this.matched = false;
-
-		RegexType r = match.getExpression();
-		if (r != null) {
-			regex = new RegexImpl(r);
-		}
-
-		List<Object> assign = match.getAddOrAppendOrPut();
-		if (!assign.isEmpty()) {
-			this.assign = new ArrayList<IAssign>();
-			for (Object o : assign) {
-				AbstractAssign.add(uuid, o, this.assign);
-			}
-		}
-	}
-
-	/**
-	 * Executes the regular expression match on the provided segment and applies
-	 * the assign actions if match is positive.
-	 * 
-	 * @param sequence
-	 *            string segment to match.
-	 * @return index of the last character in the match
-	 * @throws Throwable
-	 */
-	public synchronized int doMatch(String sequence) throws Throwable {
-		int end = 0;
-		String[] tokens = null;
-
-		if (regex == null) {
-			matched = true;
-			return sequence.length();
-		} else {
-			tokens = regex.getMatched(sequence);
-			if (tokens == null) {
-				return end;
-			}
-			/*
-			 * return pos of the unmatched remainder
-			 */
-			matched = true;
-			end = regex.getLastChar();
-		}
-
-		if (target == null || assign == null) {
-			return end;
-		}
-
-		for (IAssign a : assign) {
-			Object t = target.getTarget(a);
-			a.setTarget(t);
-			a.assign(tokens);
-		}
-
-		return end;
-	}
-
-	/**
-	 * @return whether the match succeeded
-	 */
-	public boolean getMatched() {
-		return matched;
-	}
-
-	/**
-	 * Flag for prioritizing the target bound to this match by promoting it to
-	 * the head of the ordered list of targets held by the tokenizer.
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.core.runnable.command.ConfigurableRegexTokenizer
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.impl.TargetImpl
-	 * 
-	 * @return whether to set this match as the "selected" one when matched
-	 */
-	public boolean getMoveToTop() {
-		return moveToTop;
-	}
-
-	/**
-	 * @return the regex wrapper for this match
-	 */
-	public RegexImpl getRegex() {
-		return regex;
-	}
-
-	/**
-	 * Clears the matched flag.
-	 */
-	public void reset() {
-		matched = false;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/PutImpl.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/PutImpl.java
deleted file mode 100644
index f86daaa..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/PutImpl.java
+++ /dev/null
@@ -1,66 +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.core.data.impl;
-
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.ptp.rm.jaxb.core.data.EntryType;
-import org.eclipse.ptp.rm.jaxb.core.data.PutType;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-
-/**
- * Wrapper implementation.
- * 
- * @author arossi
- * 
- */
-public class PutImpl extends AbstractAssign {
-
-	private final List<EntryType> entries;
-
-	/**
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param put
-	 *            JAXB data element
-	 */
-	public PutImpl(String uuid, PutType put) {
-		this.uuid = uuid;
-		field = put.getField();
-		entries = put.getEntry();
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	protected Object[] getValue(Object previous, String[] values) throws Throwable {
-		Map<String, String> map = null;
-		if (previous != null && previous instanceof Map<?, ?>) {
-			map = (Map<String, String>) previous;
-		} else {
-			map = new TreeMap<String, String>();
-		}
-
-		if (!entries.isEmpty()) {
-			for (EntryType e : entries) {
-				String k = getKey(e, values);
-				if (k == null) {
-					throw new IllegalStateException(Messages.StreamParserInconsistentMapValues + e.getKey() + CM + e.getKeyGroup()
-							+ CM + e.getKeyIndex());
-				}
-				String v = (String) getValue(e, values);
-				map.put(k, v);
-			}
-		}
-		return new Object[] { map };
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/RegexImpl.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/RegexImpl.java
deleted file mode 100644
index 384a87b..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/RegexImpl.java
+++ /dev/null
@@ -1,120 +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.core.data.impl;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.data.RegexType;
-
-/**
- * Wrapper implementation.
- * 
- * @author arossi
- * 
- */
-public class RegexImpl implements IJAXBNonNLSConstants {
-
-	private static final String FLAG_SEP = OPENSQ + PIP + CLOSSQ;
-
-	private String expression;
-	private final boolean split;
-	private final Pattern pattern;
-	private int lastChar;
-
-	/**
-	 * Wraps the Java implementation of regular expressions.
-	 * 
-	 * @param regex
-	 *            JAXB data element
-	 */
-	public RegexImpl(RegexType regex) {
-		expression = regex.getExpression();
-		if (expression == null) {
-			expression = regex.getContent();
-		}
-		split = regex.isSplit();
-		pattern = Pattern.compile(expression, getFlags(regex.getFlags()));
-	}
-
-	/**
-	 * @return the regex pattern
-	 */
-	public String getExpression() {
-		return expression;
-	}
-
-	/**
-	 * @return the index of the last character in the match
-	 */
-	public int getLastChar() {
-		return lastChar;
-	}
-
-	/**
-	 * @param sequence
-	 *            the segment to match
-	 * @return array of substrings either from a split using the regex, or the
-	 *         regex groups (including group 0).
-	 */
-	public String[] getMatched(String sequence) {
-		String[] result = null;
-		if (split) {
-			result = pattern.split(sequence);
-		} else {
-			Matcher m = pattern.matcher(sequence);
-			if (m.matches()) {
-				int count = m.groupCount();
-				result = new String[count + 1];
-				for (int i = 0; i < result.length; i++) {
-					result[i] = m.group(i);
-				}
-				lastChar = m.end(count);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Translates the string representation of the flags into the corresponding
-	 * Java int value. String can represent an or'd set, e.g.,
-	 * "CASE_INSENTIVE | DOTALL".
-	 * 
-	 * @param flags
-	 *            string representing the or'd flags.
-	 * @return corresponding internal value
-	 */
-	private int getFlags(String flags) {
-		if (flags == null) {
-			return 0;
-		}
-		int f = 0;
-		String[] split = flags.split(FLAG_SEP);
-		for (String s : split) {
-			if (CASE_INSENSITIVE.equals(s.trim())) {
-				f |= Pattern.CASE_INSENSITIVE;
-			} else if (MULTILINE.equals(s.trim())) {
-				f |= Pattern.MULTILINE;
-			} else if (DOTALL.equals(s.trim())) {
-				f |= Pattern.DOTALL;
-			} else if (UNICODE_CASE.equals(s.trim())) {
-				f |= Pattern.UNICODE_CASE;
-			} else if (CANON_EQ.equals(s.trim())) {
-				f |= Pattern.CANON_EQ;
-			} else if (LITERAL.equals(s.trim())) {
-				f |= Pattern.LITERAL;
-			} else if (COMMENTS.equals(s.trim())) {
-				f |= Pattern.COMMENTS;
-			}
-		}
-		return f;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/SetImpl.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/SetImpl.java
deleted file mode 100644
index 3cd31e5..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/SetImpl.java
+++ /dev/null
@@ -1,51 +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.core.data.impl;
-
-import org.eclipse.ptp.rm.jaxb.core.data.EntryType;
-import org.eclipse.ptp.rm.jaxb.core.data.SetType;
-
-/**
- * Wrapper implementation.
- * 
- * @author arossi
- * 
- */
-public class SetImpl extends AbstractAssign {
-
-	private final EntryType entry;
-
-	/**
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param set
-	 *            JAXB data element
-	 */
-	public SetImpl(String uuid, SetType set) {
-		this.uuid = uuid;
-		field = set.getField();
-		entry = set.getEntry();
-	}
-
-	@Override
-	protected Object[] getValue(Object previous, String[] values) throws Throwable {
-		if (entry == null) {
-			return null;
-		}
-
-		Object value = getValue(entry, values);
-		if (value != null) {
-			return new Object[] { value };
-		}
-
-		return new Object[] { previous };
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/TargetImpl.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/TargetImpl.java
deleted file mode 100644
index f3d438c..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/TargetImpl.java
+++ /dev/null
@@ -1,446 +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.core.data.impl;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ptp.rm.jaxb.core.IAssign;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.IMatchable;
-import org.eclipse.ptp.rm.jaxb.core.data.AttributeType;
-import org.eclipse.ptp.rm.jaxb.core.data.MatchType;
-import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;
-import org.eclipse.ptp.rm.jaxb.core.data.TargetType;
-import org.eclipse.ptp.rm.jaxb.core.data.TestType;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.core.utils.CoreExceptionUtils;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-
-/**
- * Wrapper implementation. A target contains any number of matches, with their
- * associated actions, along with tests for conditional actions based on values
- * of the target fields. <br>
- * <br>
- * There are two modes to matching. The default is to treat the matches as
- * logically OR'd (like a SAT; <code>matchAll</code> = false). When the latter
- * is set to true, the matches are taken as logically ANDed.<br>
- * <br>
- * The target can be a reference to a pre-existent Property or Attribute in the
- * resource manager environment, or can be constructed when the match occurs.
- * Dynamically constructed targets are added to a list during the tokenization,
- * and then upon termination are merged according to property or attribute name,
- * which is treated as a unique identifier. <br>
- * <br>
- * Tests are applied at the end of the tokenization. <br>
- * 
- * @author arossi
- * 
- */
-public class TargetImpl implements IMatchable, IJAXBNonNLSConstants {
-
-	private final String uuid;
-	private final String ref;
-	private final String type;
-	private final List<MatchImpl> matches;
-	private final List<TestImpl> tests;
-	private final List<Object> targets;
-	private Object refTarget;
-	private final boolean matchAll;
-	private boolean selected;
-
-	/**
-	 * Wraps the Property or Attribute to be acted upon.
-	 * 
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param target
-	 *            JAXB data element
-	 */
-	public TargetImpl(String uuid, TargetType target) {
-		this.uuid = uuid;
-		ref = target.getRef();
-		type = target.getType();
-		matchAll = target.isMatchAll();
-		matches = new ArrayList<MatchImpl>();
-		List<MatchType> mdata = target.getMatch();
-		for (MatchType m : mdata) {
-			matches.add(new MatchImpl(uuid, m, this));
-		}
-		tests = new ArrayList<TestImpl>();
-		List<TestType> tdata = target.getTest();
-		for (TestType t : tdata) {
-			tests.add(new TestImpl(uuid, t));
-		}
-		targets = new ArrayList<Object>();
-		selected = false;
-	}
-
-	/**
-	 * Applies the matches in order. If <code>matchAll</code> is in effect,
-	 * already matched expressions are skipped until they are reset; the first
-	 * match causes a return of this method.<br>
-	 * <br>
-	 * Upon match, the head of the segment up to the last character of the match
-	 * is deleted.
-	 * 
-	 * @param segment
-	 *            the current part of the stream to match
-	 * @return whether a successful match was found on this target
-	 * @throws CoreException
-	 */
-	public synchronized boolean doMatch(StringBuffer segment) throws Throwable {
-		int matched = 0;
-		boolean match = false;
-
-		for (MatchImpl m : matches) {
-			if (matchAll && m.getMatched()) {
-				matched++;
-				continue;
-			}
-			int tail = m.doMatch(segment.toString());
-			match = m.getMatched();
-			if (match) {
-				segment.delete(0, tail);
-				matched++;
-				selected = m.getMoveToTop();
-				break;
-			}
-		}
-		if (!matchAll || matched == matches.size()) {
-			for (MatchImpl m : matches) {
-				m.reset();
-			}
-		}
-
-		return match;
-	}
-
-	/**
-	 * Get the target object for the given assign task.<br>
-	 * <br>
-	 * This method is called by the Match on its target parent. If the target is
-	 * a reference to an existing object in the environment, this is then
-	 * returned; else, the index counter for the assign task is retrieved,
-	 * indicating where in the list of constructed targets it last was (the
-	 * assumption is that an assign action is applied once to any given Property
-	 * or Attribute), and this object is returned if it exists; in the case that
-	 * the index is equal to or greater than the size of the list, a new target
-	 * object is constructed and added to the list.
-	 * 
-	 * @param assign
-	 *            action to be applied to target
-	 * @return the appropriate target for this action
-	 * @throws CoreException
-	 */
-	public Object getTarget(IAssign assign) throws CoreException {
-		if (refTarget != null) {
-			return refTarget;
-		}
-		Object target = null;
-		if (ref != null) {
-			RMVariableMap vmap = RMVariableMap.getActiveInstance();
-			String name = vmap.getString(uuid, ref);
-			target = vmap.get(name);
-			if (target == null) {
-				throw CoreExceptionUtils.newException(Messages.StreamParserNoSuchVariableError + name, null);
-			}
-			refTarget = target;
-		} else {
-			int i = assign.getIndex();
-			if (i < targets.size()) {
-				target = targets.get(i);
-			}
-			if (target == null) {
-				if (PROPERTY.equals(type)) {
-					PropertyType p = new PropertyType();
-					target = p;
-					targets.add(target);
-				} else if (ATTRIBUTE.equals(type)) {
-					AttributeType ja = new AttributeType();
-					target = ja;
-					targets.add(target);
-				} else {
-					throw CoreExceptionUtils.newException(Messages.StreamParserMissingTargetType + ref, null);
-				}
-			}
-		}
-
-		return target;
-	}
-
-	/**
-	 * @return whether this target has been selected for promotion to the head
-	 *         of the list
-	 */
-	public boolean isSelected() {
-		return selected;
-	}
-
-	/**
-	 * Called upon completion of tokenization.<br>
-	 * <br>
-	 * First merges any constructed targets, then applies the tests to all
-	 * targets.
-	 * 
-	 * @throws Throwable
-	 */
-	public synchronized void postProcess() throws Throwable {
-		if (refTarget == null) {
-			if (PROPERTY.equals(type)) {
-				mergeProperties(targets);
-			} else if (ATTRIBUTE.equals(type)) {
-				mergeAttributes(targets);
-			}
-			Map<String, Object> dmap = RMVariableMap.getActiveInstance().getDiscovered();
-			for (Object t : targets) {
-				for (TestImpl test : tests) {
-					test.setTarget(t);
-					test.doTest();
-				}
-				if (PROPERTY.equals(type)) {
-					dmap.put(((PropertyType) t).getName(), t);
-				} else if (ATTRIBUTE.equals(type)) {
-					dmap.put(((AttributeType) t).getName(), t);
-				}
-			}
-			targets.clear();
-		} else {
-			for (TestImpl test : tests) {
-				test.setTarget(refTarget);
-				test.doTest();
-			}
-			refTarget = null;
-		}
-	}
-
-	/**
-	 * @param selected
-	 *            whether this target should be promoted to the head of the list
-	 */
-	public void setSelected(boolean selected) {
-		this.selected = selected;
-	}
-
-	/**
-	 * Takes two attributes with the same name and merges the rest of their
-	 * fields, such that non-<code>null</code> values replace <code>null</code>.
-	 * An attempt to merge two non-<code>null</code> fields implies that there
-	 * was an error in the tokenization logic, and an exception is thrown.
-	 * 
-	 * @param previous
-	 *            Attribute
-	 * @param current
-	 *            Attribute
-	 * @throws Throwable
-	 */
-	private void merge(AttributeType previous, AttributeType current) throws Throwable {
-		Object v0 = previous.getValue();
-		Object v1 = current.getValue();
-		if (v0 == null) {
-			previous.setValue(v1);
-		} else if (v1 != null) {
-			throw new Throwable(Messages.StreamParserInconsistentPropertyWarning + v0 + CM + SP + v1);
-		}
-
-		String s0 = previous.getDefault();
-		String s1 = current.getDefault();
-		if (s0 == null) {
-			previous.setDefault(s1);
-		} else if (s1 != null) {
-			throw new Throwable(Messages.StreamParserInconsistentPropertyWarning + s0 + CM + SP + s1);
-		}
-
-		s0 = previous.getType();
-		s1 = current.getType();
-		if (s0 == null) {
-			previous.setType(s1);
-		} else if (s1 != null) {
-			throw new Throwable(Messages.StreamParserInconsistentPropertyWarning + s0 + CM + SP + s1);
-		}
-
-		s0 = previous.getStatus();
-		s1 = current.getStatus();
-		if (s0 == null) {
-			previous.setStatus(s1);
-		} else if (s1 != null) {
-			throw new Throwable(Messages.StreamParserInconsistentPropertyWarning + s0 + CM + SP + s1);
-		}
-
-		boolean b0 = previous.isReadOnly();
-		boolean b1 = current.isReadOnly();
-		if (!b0) {
-			previous.setReadOnly(b1);
-		}
-
-		b0 = previous.isVisible();
-		b1 = current.isVisible();
-		if (!b0) {
-			previous.setVisible(b1);
-		}
-
-		Integer i0 = previous.getMax();
-		Integer i1 = current.getMax();
-		if (i0 == null) {
-			previous.setMax(i1);
-		} else if (i1 != null) {
-			throw new Throwable(Messages.StreamParserInconsistentPropertyWarning + i0 + CM + SP + i1);
-		}
-
-		i0 = previous.getMin();
-		i1 = current.getMin();
-		if (i0 == null) {
-			previous.setMin(i1);
-		} else if (i1 != null) {
-			throw new Throwable(Messages.StreamParserInconsistentPropertyWarning + i0 + CM + SP + i1);
-		}
-
-		s0 = previous.getDescription();
-		s1 = current.getDescription();
-		if (s0 == null) {
-			previous.setDescription(s1);
-		} else if (s1 != null) {
-			throw new Throwable(Messages.StreamParserInconsistentPropertyWarning + s0 + CM + SP + s1);
-		}
-
-		s0 = previous.getChoice();
-		s1 = current.getChoice();
-		if (s0 == null) {
-			previous.setChoice(s1);
-		} else if (s1 != null) {
-			throw new Throwable(Messages.StreamParserInconsistentPropertyWarning + s0 + CM + SP + s1);
-		}
-
-		s0 = previous.getTooltip();
-		s1 = current.getTooltip();
-		if (s0 == null) {
-			previous.setTooltip(s1);
-		} else if (s1 != null) {
-			throw new Throwable(Messages.StreamParserInconsistentPropertyWarning + s0 + CM + SP + s1);
-		}
-	}
-
-	/**
-	 * Takes two properties with the same name and merges the rest of their
-	 * fields, such that non-<code>null</code> values replace <code>null</code>.
-	 * An attempt to merge two non-<code>null</code> fields implies that there
-	 * was an error in the tokenization logic, and an exception is thrown.
-	 * 
-	 * @param previous
-	 *            Property
-	 * @param current
-	 *            Property
-	 * @throws Throwable
-	 */
-	private void merge(PropertyType previous, PropertyType current) throws Throwable {
-		Object v0 = previous.getValue();
-		Object v1 = current.getValue();
-		if (v0 == null) {
-			previous.setValue(v1);
-		} else if (v1 != null) {
-			throw new Throwable(Messages.StreamParserInconsistentPropertyWarning + v0 + CM + SP + v1);
-		}
-
-		String s0 = previous.getDefault();
-		String s1 = current.getDefault();
-		if (s0 == null) {
-			previous.setDefault(s1);
-		} else if (s1 != null) {
-			throw new Throwable(Messages.StreamParserInconsistentPropertyWarning + s0 + CM + SP + s1);
-		}
-
-		s0 = previous.getType();
-		s1 = current.getType();
-		if (s0 == null) {
-			previous.setType(s1);
-		} else if (s1 != null) {
-			throw new Throwable(Messages.StreamParserInconsistentPropertyWarning + s0 + CM + SP + s1);
-		}
-
-		boolean b0 = previous.isReadOnly();
-		boolean b1 = current.isReadOnly();
-		if (!b0) {
-			previous.setReadOnly(b1);
-		}
-
-		b0 = previous.isVisible();
-		b1 = current.isVisible();
-		if (!b0) {
-			previous.setVisible(b1);
-		}
-	}
-
-	/**
-	 * Attributes are hashed against their name; attributes with the same name
-	 * are merged into a single object. Nameless attributes may occur from an
-	 * empty line at the end of the stream, and are simply discarded.
-	 * 
-	 * @param targets
-	 *            list of targets constructed during tokenization
-	 * @throws Throwable
-	 */
-	private void mergeAttributes(List<Object> targets) throws Throwable {
-		Map<String, AttributeType> hash = new HashMap<String, AttributeType>();
-		for (Iterator<Object> i = targets.iterator(); i.hasNext();) {
-			AttributeType current = (AttributeType) i.next();
-			String name = current.getName();
-			if (current.getName() == null) {
-				/*
-				 * may be an artifact of end-of-stream; just throw it out
-				 */
-				i.remove();
-				continue;
-			}
-			AttributeType previous = hash.get(name);
-			if (previous != null) {
-				merge(previous, current);
-				i.remove();
-			} else {
-				hash.put(name, current);
-			}
-		}
-	}
-
-	/**
-	 * Properties are hashed against their name; properties with the same name
-	 * are merged into a single object. Nameless properties may occur from an
-	 * empty line at the end of the stream, and are simply discarded.
-	 * 
-	 * @param targets
-	 *            list of targets constructed during tokenization
-	 * @throws Throwable
-	 */
-	private void mergeProperties(List<Object> targets) throws Throwable {
-		Map<String, PropertyType> hash = new HashMap<String, PropertyType>();
-		for (Iterator<Object> i = targets.iterator(); i.hasNext();) {
-			PropertyType current = (PropertyType) i.next();
-			String name = current.getName();
-			if (current.getName() == null) {
-				/*
-				 * may be an artifact of end-of-stream; just throw it out
-				 */
-				i.remove();
-				continue;
-			}
-			PropertyType previous = hash.get(name);
-			if (previous != null) {
-				merge(previous, current);
-				i.remove();
-			} else {
-				hash.put(name, current);
-			}
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/TestImpl.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/TestImpl.java
deleted file mode 100644
index 462813c..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/impl/TestImpl.java
+++ /dev/null
@@ -1,376 +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.core.data.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ptp.rm.jaxb.core.IAssign;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.data.TestType;
-import org.eclipse.ptp.rm.jaxb.core.data.TestType.Else;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.core.utils.CoreExceptionUtils;
-
-/**
- * Wrapper implementation. A test consists of an if/else condition to be checked
- * in relation to the passed in values, plus a set of assignment actions to take
- * in the case of success. The values can be constants, references to be
- * resolved, or the current value of the target field (indicated by
- * "#fieldName").<br>
- * <br>
- * There are 8 allowable operators, indicated by the following strings: <br>
- * <br>
- * COMPARISON:<br>
- * EQ (=)<br>
- * LT (<)<br>
- * LE (<=)<br>
- * GT (>)<br>
- * GE (>=)<br>
- * <br>
- * LOGICAL:<br>
- * AND<br>
- * OR<br>
- * NOT<br>
- * <br>
- * In the case of a logical operator, the Test will delegate to its embedded
- * Test children, and then apply the operator to the results.<br>
- * <br>
- * To indicate an alternative action in the case the test fails, "<else>" is
- * used.
- * 
- * @author arossi
- * 
- */
-public class TestImpl implements IJAXBNonNLSConstants {
-
-	private static final short sEQ = 0;
-	private static final short sLT = 1;
-	private static final short sGT = 2;
-	private static final short sLE = 3;
-	private static final short sGE = 4;
-	private static final short sAND = 5;
-	private static final short sOR = 6;
-	private static final short sNOT = 7;
-
-	private final String uuid;
-	private final short op;
-	private final List<String> values;
-	private List<TestImpl> children;
-	private List<IAssign> ifcond;
-	private List<IAssign> elsecond;
-
-	private Object target;
-
-	/**
-	 * @param uuid
-	 *            unique id associated with this resource manager operation (can
-	 *            be <code>null</code>).
-	 * @param test
-	 *            JAXB data element
-	 */
-	public TestImpl(String uuid, TestType test) {
-		this.uuid = uuid;
-		op = getOp(test.getOp());
-		values = test.getValue();
-		List<TestType> tests = test.getTest();
-		if (!tests.isEmpty()) {
-			children = new ArrayList<TestImpl>();
-			for (TestType t : tests) {
-				children.add(new TestImpl(uuid, t));
-			}
-		}
-
-		List<Object> listif = test.getAddOrAppendOrPut();
-		if (!listif.isEmpty()) {
-			ifcond = new ArrayList<IAssign>();
-			for (Object o : listif) {
-				AbstractAssign.add(uuid, o, ifcond);
-			}
-		}
-
-		Else listelse = test.getElse();
-		if (listelse != null) {
-			elsecond = new ArrayList<IAssign>();
-			for (Object o : listelse.getAddOrAppendOrPut()) {
-				AbstractAssign.add(uuid, o, elsecond);
-			}
-		}
-	}
-
-	/**
-	 * Applies the test.
-	 * 
-	 * @return whether the test succeeded or not.
-	 * @throws Throwable
-	 */
-	public boolean doTest() throws Throwable {
-		boolean result = false;
-		validate(op);
-		switch (op) {
-		case sEQ:
-			result = evaluateEquals(values.get(0), values.get(1));
-			break;
-		case sLT:
-			result = evaluateLessThan(values.get(0), values.get(1));
-			break;
-		case sGT:
-			result = evaluateLessThan(values.get(1), values.get(0));
-			break;
-		case sLE:
-			result = evaluateLessThanOrEquals(values.get(0), values.get(1));
-			break;
-		case sGE:
-			result = evaluateLessThanOrEquals(values.get(1), values.get(0));
-			break;
-		case sNOT:
-			return !children.get(0).doTest();
-		case sAND:
-			result = true;
-			for (TestImpl t : children) {
-				result = result && t.doTest();
-				if (!result) {
-					break;
-				}
-			}
-			break;
-		case sOR:
-			result = false;
-			for (TestImpl t : children) {
-				result = result || t.doTest();
-				if (result) {
-					break;
-				}
-			}
-			break;
-		}
-
-		if (target != null) {
-			if (result) {
-				doAssign(ifcond);
-			} else {
-				doAssign(elsecond);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * The parent target to which to apply the actions associated with the test
-	 * in case of success.
-	 * 
-	 * @param target
-	 */
-	public void setTarget(Object target) {
-		this.target = target;
-		if (children != null) {
-			for (TestImpl t : children) {
-				t.setTarget(target);
-			}
-		}
-	}
-
-	/**
-	 * Applies the assignments to the target.
-	 * 
-	 * @param assign
-	 *            list of assignment actions.
-	 * @throws Throwable
-	 */
-	private void doAssign(List<IAssign> assign) throws Throwable {
-		if (assign != null) {
-			for (IAssign a : assign) {
-				a.setTarget(target);
-				/*
-				 * These will be using only preassigned values, so the tokens[]
-				 * param is null
-				 */
-				a.assign(null);
-			}
-		}
-	}
-
-	/**
-	 * Auxiliary. Applies <code>compareTo</code> to <code>Comparable</code>
-	 * objects. Strings are first converted to boolean or integers if
-	 * appropriate.
-	 * 
-	 * @param string1
-	 *            to be compared
-	 * @param string2
-	 *            to be compared
-	 * @return -1,0 or 1
-	 * @throws Throwable
-	 */
-	@SuppressWarnings({ "rawtypes", "unchecked" })
-	private int evaluateComparable(String string1, String string2) throws Throwable {
-		Object value1 = AbstractAssign.normalizedValue(target, uuid, string1, true);
-		Object value2 = AbstractAssign.normalizedValue(target, uuid, string2, true);
-		if (value1 == null || value2 == null) {
-			return 1;
-		}
-		if (!(value1 instanceof Comparable) || !(value2 instanceof Comparable)) {
-			return 1;
-		}
-		Comparable c1 = (Comparable) value1;
-		Comparable c2 = (Comparable) value2;
-		return c1.compareTo(c2);
-	}
-
-	/**
-	 * Applies <code>equals</code> to objects. Strings are first converted to
-	 * boolean or integers if appropriate.
-	 * 
-	 * @param string1
-	 *            to be compared
-	 * @param string2
-	 *            to be compared
-	 * @return whether the two values are equal
-	 * @throws Throwable
-	 */
-	private boolean evaluateEquals(String string1, String string2) throws Throwable {
-		Object value1 = AbstractAssign.normalizedValue(target, uuid, string1, true);
-		Object value2 = AbstractAssign.normalizedValue(target, uuid, string2, true);
-		if (value1 == null) {
-			return value2 == null;
-		}
-		return value1.equals(value2);
-	}
-
-	/**
-	 * Delegates to {@link #evaluateComparable(String, String)}
-	 * 
-	 * @param string1
-	 *            to be compared
-	 * @param string2
-	 *            to be compared
-	 * @return true if {@link #evaluateComparable(String, String)} returns -1.
-	 * @throws Throwable
-	 */
-	private boolean evaluateLessThan(String string1, String string2) throws Throwable {
-		return evaluateComparable(string1, string2) < 0;
-	}
-
-	/**
-	 * Delegates to {@link #evaluateComparable(String, String)}
-	 * 
-	 * @param string1
-	 *            to be compared
-	 * @param string2
-	 *            to be compared
-	 * @return true if {@link #evaluateComparable(String, String)} returns -1 or
-	 *         0.
-	 * @throws Throwable
-	 */
-	private boolean evaluateLessThanOrEquals(String string1, String string2) throws Throwable {
-		return evaluateComparable(string1, string2) <= 0;
-	}
-
-	/**
-	 * Translates operator to string equivalent.
-	 * 
-	 * @param op
-	 * @return string equivalent
-	 */
-	private String getOp(short op) {
-		if (sEQ == op) {
-			return xEQ;
-		}
-		if (sLT == op) {
-			return xLT;
-		}
-		if (sGT == op) {
-			return xGT;
-		}
-		if (sLE == op) {
-			return xLE;
-		}
-		if (sGE == op) {
-			return xGE;
-		}
-		if (sAND == op) {
-			return AND;
-		}
-		if (sOR == op) {
-			return OR;
-		}
-		if (sNOT == op) {
-			return NOT;
-		}
-		return EQ;
-	}
-
-	/**
-	 * Translates string representation of operator to numerical value.
-	 * 
-	 * @param op
-	 *            string representation
-	 * @return short value
-	 */
-	private short getOp(String op) {
-		if (xEQ.equalsIgnoreCase(op)) {
-			return sEQ;
-		}
-		if (xLT.equalsIgnoreCase(op)) {
-			return sLT;
-		}
-		if (xGT.equalsIgnoreCase(op)) {
-			return sGT;
-		}
-		if (xLE.equalsIgnoreCase(op)) {
-			return sLE;
-		}
-		if (xGE.equalsIgnoreCase(op)) {
-			return sGE;
-		}
-		if (AND.equalsIgnoreCase(op)) {
-			return sAND;
-		}
-		if (OR.equalsIgnoreCase(op)) {
-			return sOR;
-		}
-		if (NOT.equalsIgnoreCase(op)) {
-			return sNOT;
-		}
-		return sEQ;
-	}
-
-	/**
-	 * Checks that the number of values matches the operator.
-	 * 
-	 * @param op
-	 * @throws Throwable
-	 *             if number of values is incorrect
-	 */
-	private void validate(short op) throws Throwable {
-		switch (op) {
-		case sEQ:
-		case sLT:
-		case sGT:
-		case sLE:
-		case sGE:
-			if (values == null || values.size() != 2) {
-				throw CoreExceptionUtils.newException(Messages.MalformedExpressionError + getOp(op), null);
-			}
-			break;
-		case sNOT:
-			if (children == null || children.size() != 1) {
-				throw CoreExceptionUtils.newException(Messages.MalformedExpressionError + getOp(op), null);
-			}
-			break;
-		case sAND:
-		case sOR:
-			if (children == null || children.size() <= 1) {
-				throw CoreExceptionUtils.newException(Messages.MalformedExpressionError + getOp(op), null);
-			}
-			break;
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/package-info.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/package-info.java
deleted file mode 100644
index d447aa8..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/data/package-info.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.04.21 at 02:35:28 PM CDT 
-//
-@javax.xml.bind.annotation.XmlSchema(namespace = "http://org.eclipse.ptp/rm", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
-package org.eclipse.ptp.rm.jaxb.core.data;
-
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/exceptions/UnsatisfiedMatchException.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/exceptions/UnsatisfiedMatchException.java
deleted file mode 100644
index 96c2133..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/exceptions/UnsatisfiedMatchException.java
+++ /dev/null
@@ -1,36 +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.core.exceptions;
-
-/**
- * Exception raised when a widget validator using a regular expression fails
- * 
- * @author arossi
- * 
- */
-public class UnsatisfiedMatchException extends Exception {
-
-	private static final long serialVersionUID = 4521238998263940220L;
-
-	public UnsatisfiedMatchException() {
-	}
-
-	public UnsatisfiedMatchException(String message) {
-		super(message);
-	}
-
-	public UnsatisfiedMatchException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-	public UnsatisfiedMatchException(Throwable cause) {
-		super(cause);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/messages/Messages.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/messages/Messages.java
deleted file mode 100644
index 5fb5bb1..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/messages/Messages.java
+++ /dev/null
@@ -1,71 +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.core.messages;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rm.jaxb.core.messages.messages"; //$NON-NLS-1$
-	public static String JAXBCorePlugin_Exception_InternalError;
-	public static String JAXBServiceProvider_defaultDescription;
-	public static String RMVariableResolver_derefError;
-	public static String Copy_Operation_NullSourceFileManager;
-	public static String Copy_Operation_NullTargetFileManager;
-	public static String Copy_Operation_NullSource;
-	public static String Copy_Operation_NullTarget;
-	public static String Copy_Operation_Local_resource_does_not_exist;
-	public static String StreamParserNoSuchVariableError;
-	public static String StreamParserMissingTargetType;
-	public static String StreamParserInconsistentMapValues;
-	public static String ManagedFilesJob;
-	public static String ManagedFilesJobError;
-
-	public static String ScriptHandlerJob;
-	public static String RMNoSuchCommandError;
-	public static String MissingRunCommandsError;
-
-	public static String MissingArglistFromCommandError;
-	public static String CouldNotLaunch;
-	public static String StdoutParserError;
-	public static String StderrParserError;
-	public static String ParserInternalError;
-	public static String ProcessExitValueError;
-	public static String CannotCompleteSubmitFailedStaging;
-	public static String ReadSegmentError;
-	public static String StreamTokenizerInstantiationError;
-	public static String MalformedExpressionError;
-	public static String UnsupportedWriteException;
-	public static String ProcessRunError;
-	public static String CommandJobStreamMonitor_label;
-	public static String CommandJobNullMonitorStreamError;
-	public static String IllegalVariableValueType;
-	public static String RemoteConnectionError;
-	public static String LocalConnectionError;
-	public static String StreamParserInconsistentPropertyWarning;
-	public static String Write_Operation_NullSourceFileManager;
-	public static String Write_Operation_NullPath;
-	public static String Read_Operation_NullSourceFileManager;
-	public static String Read_Operation_NullPath;
-	public static String Write_OperationFailed;
-	public static String Read_OperationFailed;
-	public static String FailedToCreateRmData;
-	public static String GetDiscoveredNotSupported;
-	public static String RefreshedJobStatusMessage;
-	public static String UndefinedByteBeforeEndOfFile;
-
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		// Prevent instances.
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/messages/messages.properties b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/messages/messages.properties
deleted file mode 100644
index d95b80f..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/messages/messages.properties
+++ /dev/null
@@ -1,47 +0,0 @@
-JAXBCorePlugin_Exception_InternalError=Internal error
-JAXBServiceProvider_defaultDescription=XML Configurable Resource Manager
-RMVariableResolver_derefError=resource manager variable dereferencing error 
-RMNoSuchCommandError=Cannot find command: 
-MissingRunCommandsError=Configuration is missing run commands for job submission
-MissingArglistFromCommandError=Command is missing a list of arguments: 
-CouldNotLaunch=Failed to execute command: 
-StdoutParserError=Could not parser stdout
-StderrParserError=Could not parser stderr
-ParserInternalError=Parser threw internal error
-ProcessExitValueError=Process exited with value: 
-
-Copy_Operation_NullSourceFileManager=File Manager is undefined for source
-Copy_Operation_NullTargetFileManager=File Manager is undefined for target
-Copy_Operation_NullSource=Copy source is undefined
-Copy_Operation_NullTarget=Copy target is undefined
-Copy_Operation_Local_resource_does_not_exist=Local resource does not exist
-Write_Operation_NullSourceFileManager=File Manager is undefined for write
-Write_Operation_NullPath=Path is undefined for write
-Write_OperationFailed=Write operation failed for 
-Read_Operation_NullSourceFileManager=File Manager is undefined for read
-Read_Operation_NullPath=Path is undefined for read
-Read_OperationFailed=Read operation failed for 
-GetDiscoveredNotSupported=Get discovered not supported for launch tab map
- 
-ManagedFilesJob=Managed Files Job
-ManagedFilesJobError=ManagedFile Processing Error
-ScriptHandlerJob=ScriptHandler
-CannotCompleteSubmitFailedStaging=Cannot complete job submission: file staging failed
-ReadSegmentError=Stream error during read of next segment
-StreamTokenizerInstantiationError:Could not instantiate StreamParserTokenizer extension: 
-MalformedExpressionError=Badly formed test expression: 
-UnsupportedWriteException=The write operation is not supported on this stream proxy.
-ProcessRunError=Error during process execution.
-CommandJobStreamMonitor_label=CommandJobStreamMonitor
-CommandJobNullMonitorStreamError=CommandJobStreamMonitor: no input stream
-IllegalVariableValueType=Wrong variable map value type:  
-RemoteConnectionError=remote connection is not open: 
-LocalConnectionError=problem with local connection -- not "open"!
-
-StreamParserNoSuchVariableError=No attribute or property variable exists for: 
-StreamParserMissingTargetType=Cannot create new parser target object: missing type
-StreamParserInconsistentMapValues=Put entry has no key: 
-StreamParserInconsistentPropertyWarning=Stream parser generated inconsistent properties for target: 
-FailedToCreateRmData=Failed to create ResourceManager data tree
-RefreshedJobStatusMessage=refreshed status for: 
-UndefinedByteBeforeEndOfFile=Received end of stream before end of file: 
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManager.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManager.java
deleted file mode 100644
index 272ffc4..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManager.java
+++ /dev/null
@@ -1,58 +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.core.rm;
-
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManager;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerConfiguration;
-import org.eclipse.ptp.rmsystem.AbstractResourceManager;
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerConfiguration;
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerControl;
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerMonitor;
-
-/**
- * The base JAXB resource manager, containing control and monitor parts.<br>
- * <br>
- * The JAXB implementation uses an XML configuration validated against an
- * internal schema (XSD) to configure the manager runtime and to construct the
- * related UI parts.<br>
- * <br>
- * Refer to the resource_manager_type.xsd for more details.
- * 
- * @author arossi
- * 
- */
-public final class JAXBResourceManager extends AbstractResourceManager implements IJAXBResourceManager, IJAXBNonNLSConstants {
-	/**
-	 * @param jaxbServiceProvider
-	 * @param control
-	 * @param monitor
-	 */
-	public JAXBResourceManager(AbstractResourceManagerConfiguration jaxbServiceProvider, AbstractResourceManagerControl control,
-			AbstractResourceManagerMonitor monitor) {
-		super(jaxbServiceProvider, control, monitor);
-	}
-
-	/**
-	 * @return the control manager associated with this base manager
-	 */
-	@Override
-	public JAXBResourceManagerControl getControl() {
-		return (JAXBResourceManagerControl) super.getControl();
-	}
-
-	/**
-	 * @return the configuration (service provider)
-	 */
-	public IJAXBResourceManagerConfiguration getJAXBConfiguration() {
-		return (IJAXBResourceManagerConfiguration) getConfiguration();
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerConfiguration.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerConfiguration.java
deleted file mode 100644
index 7b1a8b7..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerConfiguration.java
+++ /dev/null
@@ -1,160 +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.core.rm;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.ptp.rm.core.rmsystem.AbstractRemoteResourceManagerConfiguration;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerConfiguration;
-import org.eclipse.ptp.rm.jaxb.core.data.ResourceManagerData;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.core.utils.JAXBInitializationUtils;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-import org.eclipse.ptp.services.core.IServiceProvider;
-
-/**
- * Configuration object used for persisting values between sessions. Also
- * contains (in memory) the JAXB data object tree and the active instance of the
- * environment map.<br>
- * <br>
- * There are actually three such configurations associated with a JAXB resource
- * manager instance: the base configuration, and the control and monitor
- * configurations. The latter two contain references to their parent base
- * provider.
- * 
- * @author arossi
- * 
- */
-public class JAXBResourceManagerConfiguration extends AbstractRemoteResourceManagerConfiguration implements
-		IJAXBResourceManagerConfiguration, IJAXBNonNLSConstants {
-
-	private ResourceManagerData rmdata;
-	private RMVariableMap map;
-
-	/**
-	 * @param namespace
-	 *            base, control or monitor
-	 * @param provider
-	 *            base provider configuration
-	 */
-	public JAXBResourceManagerConfiguration(String namespace, IServiceProvider provider) {
-		super(namespace, provider);
-		setDescription(Messages.JAXBServiceProvider_defaultDescription);
-	}
-
-	/**
-	 * clears in-memory objects
-	 */
-	public void clearReferences() {
-		map.clear();
-		map = null;
-		clearRMData();
-	}
-
-	/**
-	 * @return The JAXB element tree.
-	 */
-	public ResourceManagerData getResourceManagerData() throws Throwable {
-		if (rmdata == null) {
-			realizeRMDataFromXML();
-		}
-		if (rmdata == null) {
-			throw new InstantiationError(Messages.FailedToCreateRmData);
-		}
-		return rmdata;
-	}
-
-	/**
-	 * @return the location of the configuration XML used to construct the data
-	 *         tree.
-	 */
-	public URL getRMConfigurationURL() {
-		String loc = getString(RM_XSD_URL, ZEROSTR);
-		if (ZEROSTR.equals(loc)) {
-			return null;
-		}
-		try {
-			return new URL(loc);
-		} catch (MalformedURLException e) {
-			return null;
-		}
-	}
-
-	/**
-	 * Tells the RMVariableMap static instance variable to point to this
-	 * configuration's environment map. If that map has not been initialized,
-	 * takes care of it here.
-	 */
-	public void setActive() throws Throwable {
-		map = RMVariableMap.setActiveInstance(map);
-		if (!map.isInitialized()) {
-			JAXBInitializationUtils.initializeMap(getResourceManagerData(), map);
-		}
-	}
-
-	/**
-	 * Sets JAXB@connection as the default service provider description.
-	 */
-	public void setDefaultNameAndDesc() {
-		String name = getName();
-		if (name == null) {
-			name = JAXB;
-		}
-		String conn = getConnectionName();
-		if (conn != null && !conn.equals(ZEROSTR)) {
-			name += AT + conn;
-		}
-		setName(name);
-		setDescription(Messages.JAXBServiceProvider_defaultDescription);
-	}
-
-	/**
-	 * Called by the service selector.
-	 * 
-	 * @param location
-	 *            of the configuration XML.
-	 */
-	public void setRMConfigurationURL(URL location) {
-		URL current = getRMConfigurationURL();
-		if (location != null && current != location) {
-			String url = location.toExternalForm();
-			putString(RM_XSD_URL, url);
-			clearRMData();
-		}
-	}
-
-	/**
-	 * Nulls out the tree as well as related service ids.
-	 */
-	protected void clearRMData() {
-		rmdata = null;
-		setRemoteServicesId(null);
-		setConnectionName(null);
-		setInvocationOptions(ZEROSTR);
-		setLocalAddress(ZEROSTR);
-	}
-
-	/**
-	 * Unmarshals the XML into the JAXB data tree.
-	 * 
-	 * @throws unmarshaling
-	 *             exceptions
-	 */
-	private void realizeRMDataFromXML() throws Throwable {
-		URL location = getRMConfigurationURL();
-		if (location == null) {
-			rmdata = null;
-		} else {
-			rmdata = JAXBInitializationUtils.initializeRMData(location);
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerControl.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerControl.java
deleted file mode 100644
index 830c3ca..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerControl.java
+++ /dev/null
@@ -1,933 +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.core.rm;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.UUID;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.ptp.core.IPTPLaunchConfigurationConstants;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.exception.RemoteConnectionException;
-import org.eclipse.ptp.rm.jaxb.core.ICommandJobStatus;
-import org.eclipse.ptp.rm.jaxb.core.ICommandJobStreamsProxy;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerConfiguration;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerControl;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCorePlugin;
-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.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.ScriptType;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.core.runnable.ManagedFilesJob;
-import org.eclipse.ptp.rm.jaxb.core.runnable.ScriptHandler;
-import org.eclipse.ptp.rm.jaxb.core.runnable.command.CommandJob;
-import org.eclipse.ptp.rm.jaxb.core.runnable.command.CommandJobStatus;
-import org.eclipse.ptp.rm.jaxb.core.utils.CoreExceptionUtils;
-import org.eclipse.ptp.rm.jaxb.core.utils.RemoteServicesDelegate;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerConfiguration;
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerControl;
-import org.eclipse.ptp.rmsystem.IJobStatus;
-import org.eclipse.ptp.rmsystem.IResourceManager;
-
-/**
- * The part of the JAXB resource manager responsible for handling job
- * submission, termination, suspension and resumption. Also provides on-demand
- * job status checking. <br>
- * <br>
- * The state maintained by the control is volatile (in-memory only). The control
- * is responsible for handing off to the caller status objects containing job
- * state, as well as means of acessing the process (if interactive) and the
- * standard out and error streams. When the job completes, these are eliminated
- * from its internal map.<br>
- * <br>
- * The logic of this manager is generic; the specific commands used, files
- * staged, and script constructed (if any) are all configured via the resource
- * manager XML.
- * 
- * @author arossi
- * 
- */
-public final class JAXBResourceManagerControl extends AbstractResourceManagerControl implements IJAXBResourceManagerControl,
-		IJAXBNonNLSConstants {
-
-	/**
-	 * Internal class for handling status of submitted jobs.
-	 * 
-	 * @author arossi
-	 * 
-	 */
-	private class JobStatusMap extends Thread {
-		private final Map<String, ICommandJobStatus> map = new HashMap<String, ICommandJobStatus>();
-		private boolean running = false;
-
-		/**
-		 * Thread daemon for cleanup on the map. Eliminates stray completed
-		 * state information, and also starts the stream proxies on jobs which
-		 * have been submitted to a scheduler and have become active.
-		 */
-		@Override
-		public void run() {
-			Map<String, String> toPrune = new HashMap<String, String>();
-
-			synchronized (map) {
-				running = true;
-			}
-
-			while (isRunning()) {
-				synchronized (map) {
-					try {
-						map.wait(2 * MINUTE_IN_MS);
-					} catch (InterruptedException ignored) {
-					}
-
-					for (String jobId : map.keySet()) {
-						IJobStatus status = getJobStatus(jobId);
-						String state = status.getState();
-						if (IJobStatus.COMPLETED.equals(state)) {
-							toPrune.put(jobId, jobId);
-						}
-					}
-					for (Iterator<Map.Entry<String, ICommandJobStatus>> i = map.entrySet().iterator(); i.hasNext();) {
-						Map.Entry<String, ICommandJobStatus> e = i.next();
-						if (null != toPrune.remove(e.getKey())) {
-							ICommandJobStatus status = e.getValue();
-							if (status != null) {
-								status.cancel();
-							}
-							i.remove();
-						}
-					}
-				}
-			}
-
-			synchronized (map) {
-				for (String jobId : map.keySet()) {
-					ICommandJobStatus status = map.get(jobId);
-					if (status != null) {
-						status.cancel();
-					}
-				}
-				map.clear();
-			}
-		}
-
-		/**
-		 * @param jobId
-		 *            either internal UUID or scheduler id for the job.
-		 * @param status
-		 *            object containing status info and stream proxy
-		 */
-		private void addJobStatus(String jobId, ICommandJobStatus status) {
-			synchronized (map) {
-				map.put(jobId, status);
-			}
-		}
-
-		/**
-		 * 
-		 * @param jobId
-		 *            either internal UUID or scheduler id for the job.
-		 * @return object containing status info and stream proxy
-		 */
-		private ICommandJobStatus getStatus(String jobId) {
-			ICommandJobStatus status = null;
-			synchronized (map) {
-				status = map.get(jobId);
-			}
-			return status;
-		}
-
-		/**
-		 * shuts down the daemon
-		 */
-		private void halt() {
-			synchronized (map) {
-				running = false;
-				map.notifyAll();
-			}
-		}
-
-		/**
-		 * @return whether the daemon is running
-		 */
-		private boolean isRunning() {
-			boolean b = false;
-			synchronized (map) {
-				b = running;
-			}
-			return b;
-		}
-
-		/**
-		 * @param jobId
-		 *            either internal UUID or scheduler id for the job.
-		 */
-		private void removeJobStatus(String jobId) {
-			synchronized (map) {
-				map.remove(jobId);
-			}
-		}
-	}
-
-	private final IJAXBResourceManagerConfiguration config;
-	private RMVariableMap rmVarMap;
-	private ControlType controlData;
-	private final Map<String, String> launchEnv;
-	private final JobStatusMap jobStatusMap;
-	private boolean appendLaunchEnv;
-
-	/**
-	 * @param jaxbServiceProvider
-	 *            the configuration object containing resource manager specifics
-	 */
-	public JAXBResourceManagerControl(AbstractResourceManagerConfiguration jaxbServiceProvider) {
-		super(jaxbServiceProvider);
-		config = (IJAXBResourceManagerConfiguration) jaxbServiceProvider;
-		launchEnv = new TreeMap<String, String>();
-		jobStatusMap = new JobStatusMap();
-		jobStatusMap.start();
-	}
-
-	/**
-	 * @return whether to append (true) the env passed in through the
-	 *         LaunchConfiguration, or replace the current env with it.
-	 */
-	public boolean getAppendEnv() {
-		return appendLaunchEnv;
-	}
-
-	/**
-	 * @return any environment variables passed in through the
-	 *         LaunchConfiguration
-	 */
-	public Map<String, String> getLaunchEnv() {
-		return launchEnv;
-	}
-
-	/**
-	 * @return wrapper object for remote services, connections and file managers
-	 */
-	public RemoteServicesDelegate getRemoteServicesDelegate() {
-		return new RemoteServicesDelegate(config.getRemoteServicesId(), config.getConnectionName());
-	}
-
-	/*
-	 * For termination, pause, hold, suspension and resume requests. Resets the
-	 * environment, generates a uuid property; if the control request is
-	 * termination, calls remove on the state map. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.AbstractResourceManagerControl#doControlJob(
-	 * java.lang.String, java.lang.String,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	@Override
-	protected void doControlJob(String jobId, String operation, IProgressMonitor monitor) throws CoreException {
-		try {
-			if (!resourceManagerIsActive()) {
-				return;
-			}
-			resetEnv();
-			PropertyType p = new PropertyType();
-			p.setVisible(false);
-			p.setName(jobId);
-			rmVarMap.put(jobId, p);
-			doControlCommand(jobId, operation);
-			rmVarMap.remove(jobId);
-			if (TERMINATE_OPERATION.equals(operation)) {
-				jobStatusMap.removeJobStatus(jobId);
-			}
-		} catch (CoreException ce) {
-			getResourceManager().setState(IResourceManager.ERROR_STATE);
-			throw ce;
-		}
-	}
-
-	@Override
-	protected void doDispose() {
-		// NOP for the moment
-	}
-
-	/*
-	 * Used by the client to refresh status on demand. (non-Javadoc) Generates a
-	 * jobId property; if the returned state is RUNNING, starts the proxy (a
-	 * rentrant call to a started proxy does nothing); if COMPLETED, the status
-	 * is removed from the map.
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.AbstractResourceManagerControl#doGetJobStatus
-	 * (java.lang.String)
-	 */
-	@Override
-	protected IJobStatus doGetJobStatus(String jobId) throws CoreException {
-		try {
-			if (!resourceManagerIsActive()) {
-				return new CommandJobStatus(jobId, IJobStatus.UNDETERMINED);
-			}
-
-			/*
-			 * first check to see when the last call was made; throttle requests
-			 * coming in intervals less than
-			 * ICommandJobStatus.UPDATE_REQUEST_INTERVAL
-			 */
-			ICommandJobStatus status = jobStatusMap.getStatus(jobId);
-			if (status != null) {
-				if (IJobStatus.COMPLETED.equals(status.getState())) {
-					status.cancel();
-					/*
-					 * leave the status in the map in case there are further
-					 * calls; it will be pruned by the daemon
-					 */
-					return status;
-				}
-
-				long now = System.currentTimeMillis();
-				long lapse = now - status.getLastUpdateRequest();
-				if (lapse < ICommandJobStatus.UPDATE_REQUEST_INTERVAL) {
-					return status;
-				}
-				status.setUpdateRequestTime(now);
-			}
-
-			PropertyType p = new PropertyType();
-			p.setVisible(false);
-			p.setName(jobId);
-			rmVarMap.put(jobId, p);
-
-			CommandType job = controlData.getGetJobStatus();
-			if (job == null) {
-				throw CoreExceptionUtils.newException(Messages.RMNoSuchCommandError + JOBSTATUS, null);
-			}
-
-			runCommand(jobId, job, false, true);
-
-			p = (PropertyType) rmVarMap.remove(jobId);
-			String state = IJobStatus.UNDETERMINED;
-			if (p != null) {
-				state = (String) p.getValue();
-			}
-
-			if (status == null) {
-				status = new CommandJobStatus(jobId, state);
-				jobStatusMap.addJobStatus(jobId, status);
-			} else {
-				status.setState(state);
-			}
-
-			if (IJobStatus.COMPLETED.equals(state)) {
-				/*
-				 * leave the status in the map in case there are further calls;
-				 * it will be pruned by the daemon
-				 */
-				status.cancel();
-			}
-
-			// XXX eliminate when monitoring is in place
-			System.out.println(Messages.RefreshedJobStatusMessage + jobId + CM + SP + status.getState());
-			return status;
-		} catch (CoreException ce) {
-			getResourceManager().setState(IResourceManager.ERROR_STATE);
-			throw ce;
-		}
-	}
-
-	/*
-	 * Resets the env and executes any shutdown commands, then disconnects.
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rmsystem.AbstractResourceManagerControl#doShutdown()
-	 */
-	@Override
-	protected void doShutdown() throws CoreException {
-		try {
-			resetEnv();
-			doOnShutdown();
-			doDisconnect();
-			((IJAXBResourceManagerConfiguration) getResourceManager().getConfiguration()).clearReferences();
-			jobStatusMap.halt();
-		} catch (CoreException ce) {
-			getResourceManager().setState(IResourceManager.ERROR_STATE);
-			throw ce;
-		}
-		getResourceManager().setState(IResourceManager.STOPPED_STATE);
-	}
-
-	/*
-	 * Connects, resets the env and executes any startup commands. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.AbstractResourceManagerControl#doStartup(org
-	 * .eclipse.core.runtime.IProgressMonitor)
-	 */
-	@Override
-	protected void doStartup(IProgressMonitor monitor) throws CoreException {
-		getResourceManager().setState(IResourceManager.STARTING_STATE);
-		try {
-			try {
-				doConnect(monitor);
-			} catch (RemoteConnectionException t) {
-				throw CoreExceptionUtils.newException(t.getMessage(), t);
-			}
-			resetEnv();
-			doOnStartUp(monitor);
-		} catch (CoreException ce) {
-			getResourceManager().setState(IResourceManager.ERROR_STATE);
-			throw ce;
-		}
-		getResourceManager().setState(IResourceManager.STARTED_STATE);
-	}
-
-	/*
-	 * The main command for job submission. (non-Javadoc) The environment is
-	 * reset on each call; a uuid tag is generated for the submission until a
-	 * resource-specific identifier is returned (there should be a stream
-	 * tokenizer associated with the job command in this case which sets the
-	 * uuid property).
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.AbstractResourceManagerControl#doSubmitJob(org
-	 * .eclipse.debug.core.ILaunchConfiguration, java.lang.String,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	@Override
-	protected synchronized IJobStatus doSubmitJob(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor)
-			throws CoreException {
-		if (!resourceManagerIsActive()) {
-			return new CommandJobStatus(UUID.randomUUID().toString(), IJobStatus.UNDETERMINED);
-		}
-
-		resetEnv();
-
-		/*
-		 * give submission a unique id which will in most cases be replaced by
-		 * the resource-generated id for the job/process
-		 */
-		String uuid = UUID.randomUUID().toString();
-		PropertyType p = new PropertyType();
-		p.setVisible(false);
-		rmVarMap.put(uuid, p);
-
-		/*
-		 * overwrite property/attribute values based on user choices
-		 */
-		updatePropertyValuesFromTab(configuration);
-
-		/*
-		 * create the script if necessary; adds the contents to env as
-		 * "${rm:script}". If a custom script has been selected for use, the
-		 * SCRIPT_PATH property will have been passed in with the launch
-		 * configuration; if so, the following returns immediately.
-		 */
-		maybeHandleScript(uuid, controlData.getScript());
-
-		ManagedFilesType files = controlData.getManagedFiles();
-
-		/*
-		 * if the script is to be staged, a managed file pointing to either its
-		 * as its content (${rm:script#value}), or to its path (SCRIPT_PATH)
-		 * must exist.
-		 */
-		files = maybeAddManagedFileForScript(files);
-
-		if (!maybeHandleManagedFiles(uuid, files)) {
-			throw CoreExceptionUtils.newException(Messages.CannotCompleteSubmitFailedStaging, null);
-		}
-
-		CommandJob job = doJobSubmitCommand(uuid, mode);
-
-		/*
-		 * If the submit job lacks a jobId on the standard streams, then we
-		 * assign it the UUID (it is most probably interactive); else we wait
-		 * for the id to be set by the tokenizer.
-		 */
-		CommandJobStatus status = null;
-		if (job.waitForId()) {
-			status = new CommandJobStatus();
-			status.waitForJobId(uuid);
-		} else {
-			String state = job.isActive() ? IJobStatus.RUNNING : IJobStatus.FAILED;
-			status = new CommandJobStatus(uuid, state);
-		}
-
-		/*
-		 * property containing actual jobId as name was set in the wait call; we
-		 * may need the new jobId mapping momentarily to resolve proxy-specific
-		 * info
-		 */
-		rmVarMap.remove(uuid);
-		rmVarMap.put(p.getName(), p);
-
-		ICommandJobStreamsProxy proxy = job.getProxy();
-		status.setProxy(proxy);
-		jobStatusMap.addJobStatus(status.getJobId(), status);
-		status.setLaunchConfig(configuration);
-		if (!job.isBatch()) {
-			status.setProcess(job.getProcess());
-		}
-
-		/*
-		 * to ensure the most recent script is used at the next call
-		 */
-		rmVarMap.remove(p.getName());
-		rmVarMap.remove(SCRIPT_PATH);
-		rmVarMap.remove(SCRIPT);
-
-		return status;
-	}
-
-	/**
-	 * If there are special server connections to open, those need to be taken
-	 * care of by a command to be run on start-up; here we just check for open
-	 * connections.
-	 * 
-	 * @param monitor
-	 * @throws RemoteConnectionException
-	 */
-	private void doConnect(IProgressMonitor monitor) throws RemoteConnectionException {
-		IRemoteConnection conn = getRemoteServicesDelegate().getLocalConnection();
-		if (!conn.isOpen()) {
-			conn.open(monitor);
-			if (!conn.isOpen()) {
-				throw new RemoteConnectionException(Messages.LocalConnectionError);
-			}
-		}
-		conn = getRemoteServicesDelegate().getRemoteConnection();
-		if (!conn.isOpen()) {
-			conn.open(monitor);
-			if (!conn.isOpen()) {
-				throw new RemoteConnectionException(Messages.RemoteConnectionError + conn.getAddress());
-			}
-		}
-	}
-
-	/**
-	 * @param jobId
-	 *            resource-specific id
-	 * @param operation
-	 *            terminate, hold, suspend, release, resume.
-	 * @throws CoreException
-	 *             If the command is not supported
-	 */
-	private void doControlCommand(String jobId, String operation) throws CoreException {
-		CoreException ce = CoreExceptionUtils.newException(Messages.RMNoSuchCommandError + operation, null);
-		CommandType job = null;
-		if (TERMINATE_OPERATION.equals(operation)) {
-			if (maybeKillInteractive(jobId)) {
-				return;
-			}
-
-			job = controlData.getTerminateJob();
-			if (job == null) {
-				throw ce;
-			}
-		} else if (SUSPEND_OPERATION.equals(operation)) {
-			job = controlData.getSuspendJob();
-			if (job == null) {
-				throw ce;
-			}
-		} else if (RESUME_OPERATION.equals(operation)) {
-			job = controlData.getResumeJob();
-			if (job == null) {
-				throw ce;
-			}
-		} else if (RELEASE_OPERATION.equals(operation)) {
-			job = controlData.getReleaseJob();
-			if (job == null) {
-				throw ce;
-			}
-		} else if (HOLD_OPERATION.equals(operation)) {
-			job = controlData.getHoldJob();
-			if (job == null) {
-				throw ce;
-			}
-		}
-		runCommand(jobId, job, false, true);
-	}
-
-	/**
-	 * Close the connections.
-	 */
-	private void doDisconnect() {
-		IRemoteConnection conn = getRemoteServicesDelegate().getLocalConnection();
-		if (conn.isOpen()) {
-			conn.close();
-		}
-		conn = getRemoteServicesDelegate().getRemoteConnection();
-		if (conn.isOpen()) {
-			conn.close();
-		}
-	}
-
-	/**
-	 * Run either interactive or batch job for run or debug modes.
-	 * ILaunchManager.RUN_MODE and ILaunchManager.DEBUG_MODE are the
-	 * corresponding LaunchConfiguration modes; batch/interactive are currently
-	 * determined by the configuration (the configuration cannot implement
-	 * both). This may need to be modified.
-	 * 
-	 * @param uuid
-	 *            temporary internal id for as yet unsubmitted job
-	 * @param mode
-	 *            either ILaunchManager.RUN_MODE and ILaunchManager.DEBUG_MODE
-	 * @return job wrapper object
-	 * @throws CoreException
-	 */
-	private CommandJob doJobSubmitCommand(String uuid, String mode) throws CoreException {
-		CommandType command = null;
-		boolean batch = false;
-
-		if (ILaunchManager.RUN_MODE.equals(mode)) {
-			command = controlData.getSubmitBatch();
-			if (command != null) {
-				batch = true;
-			} else {
-				command = controlData.getSubmitInteractive();
-			}
-		} else if (ILaunchManager.DEBUG_MODE.equals(mode)) {
-			command = controlData.getSubmitBatchDebug();
-			if (command != null) {
-				batch = true;
-			} else {
-				command = controlData.getSubmitInteractiveDebug();
-			}
-		}
-
-		if (command == null) {
-			throw CoreExceptionUtils.newException(Messages.MissingRunCommandsError + SP + uuid + SP + mode, null);
-		}
-
-		return runCommand(uuid, command, batch, false);
-	}
-
-	/**
-	 * Run the shut down commands, if any
-	 * 
-	 * @throws CoreException
-	 */
-	private void doOnShutdown() throws CoreException {
-		List<CommandType> onShutDown = controlData.getShutDownCommand();
-		runCommands(onShutDown);
-	}
-
-	/**
-	 * Run the start up commands, if any
-	 * 
-	 * @param monitor
-	 * @throws CoreException
-	 */
-	private void doOnStartUp(IProgressMonitor monitor) throws CoreException {
-		List<CommandType> onStartUp = controlData.getStartUpCommand();
-		runCommands(onStartUp);
-	}
-
-	/**
-	 * Checks for existence of either internally generated script or custom
-	 * script path. In either case, either replaces contents of the
-	 * corresponding managed file object or creates one.
-	 * 
-	 * @param files
-	 *            the set of managed files for this submission
-	 * @return the set of managed files, possibly with the script file added
-	 */
-	private ManagedFilesType maybeAddManagedFileForScript(ManagedFilesType files) {
-		PropertyType scriptVar = (PropertyType) RMVariableMap.getActiveInstance().get(SCRIPT);
-		PropertyType scriptPathVar = (PropertyType) RMVariableMap.getActiveInstance().get(SCRIPT_PATH);
-		if (scriptVar != null || scriptPathVar != null) {
-			if (files == null) {
-				files = new ManagedFilesType();
-				files.setFileStagingLocation(ECLIPSESETTINGS);
-			}
-			List<ManagedFileType> fileList = files.getFile();
-			ManagedFileType scriptFile = null;
-			if (!fileList.isEmpty()) {
-				for (ManagedFileType f : fileList) {
-					if (f.getName().equals(SCRIPT_FILE)) {
-						scriptFile = f;
-						break;
-					}
-				}
-			}
-			if (scriptFile == null) {
-				scriptFile = new ManagedFileType();
-				scriptFile.setName(SCRIPT_FILE);
-				fileList.add(scriptFile);
-			}
-			scriptFile.setResolveContents(false);
-			scriptFile.setUniqueIdPrefix(true);
-			if (scriptPathVar != null) {
-				scriptFile.setPath(String.valueOf(scriptPathVar.getValue()));
-				scriptFile.setDeleteAfterUse(false);
-			} else {
-				scriptFile.setContents(OPENVRM + SCRIPT + PD + VALUE + CLOSV);
-				scriptFile.setDeleteAfterUse(true);
-			}
-		}
-		return files;
-	}
-
-	/**
-	 * Write content to file if indicated, and stage to host.
-	 * 
-	 * @param uuid
-	 *            temporary internal id for as yet unsubmitted job
-	 * @param files
-	 *            the set of managed files for this submission
-	 * @return whether the necessary staging completed without error
-	 * @throws CoreException
-	 */
-	private boolean maybeHandleManagedFiles(String uuid, ManagedFilesType files) throws CoreException {
-		if (files == null || files.getFile().isEmpty()) {
-			return true;
-		}
-		ManagedFilesJob job = new ManagedFilesJob(uuid, files, getRemoteServicesDelegate());
-		job.schedule();
-		try {
-			job.join();
-		} catch (InterruptedException ignored) {
-		}
-		return job.getSuccess();
-	}
-
-	/**
-	 * Serialize script content if necessary. We first check to see if there is
-	 * a custom script (path).
-	 * 
-	 * @param uuid
-	 *            temporary internal id for as yet unsubmitted job
-	 * @param script
-	 *            configuration object describing how to construct the script
-	 *            from the environment
-	 */
-	private void maybeHandleScript(String uuid, ScriptType script) {
-		PropertyType p = (PropertyType) rmVarMap.get(SCRIPT_PATH);
-		if (p != null && p.getValue() != null) {
-			return;
-		}
-		if (script == null) {
-			return;
-		}
-		ScriptHandler job = new ScriptHandler(uuid, script, rmVarMap, launchEnv);
-		job.schedule();
-		try {
-			job.join();
-		} catch (InterruptedException ignored) {
-		}
-	}
-
-	/**
-	 * If job is interactive, kill the process directly rather than issuing a
-	 * remote command.
-	 * 
-	 * @param jobId
-	 *            either process id or internal identifier.
-	 * @return whether job has been canceled
-	 */
-	private boolean maybeKillInteractive(String jobId) {
-		ICommandJobStatus status = jobStatusMap.getStatus(jobId);
-		if (status != null && status.isInteractive()) {
-			status.cancel();
-			jobStatusMap.removeJobStatus(jobId);
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Ensure that this manager has its own environement. Add the fixed
-	 * properties again, clear environment from the tab.
-	 */
-	private void resetEnv() {
-		try {
-			/*
-			 * Use the base configuration which contains the config file
-			 * information
-			 */
-			IJAXBResourceManagerConfiguration config = (IJAXBResourceManagerConfiguration) getResourceManager().getConfiguration();
-			config.setActive();
-			rmVarMap = RMVariableMap.getActiveInstance();
-			controlData = config.getResourceManagerData().getControlData();
-		} catch (Throwable t) {
-			JAXBCorePlugin.log(t);
-			return;
-		}
-		setFixedConfigurationProperties();
-		launchEnv.clear();
-		appendLaunchEnv = true;
-	}
-
-	private boolean resourceManagerIsActive() {
-		IResourceManager rm = getResourceManager();
-		if (rm != null) {
-			String rmState = rm.getState();
-			return !rmState.equals(IResourceManager.STOPPED_STATE);
-		}
-		return false;
-	}
-
-	/**
-	 * Create command job, and schedule. Used for job-specific commands
-	 * directly.
-	 * 
-	 * @param uuid
-	 *            temporary internal id for as yet unsubmitted job
-	 * @param command
-	 *            configuration object containing the command arguments and
-	 *            tokenizers
-	 * @param batch
-	 *            whether batch or interactive
-	 * @param join
-	 *            whether to launch serially or not
-	 * @return the runnable job object
-	 * @throws CoreException
-	 */
-	private CommandJob runCommand(String uuid, CommandType command, boolean batch, boolean join) throws CoreException {
-		if (command == null) {
-			throw CoreExceptionUtils.newException(Messages.RMNoSuchCommandError, null);
-		}
-
-		CommandJob job = new CommandJob(uuid, command, batch, this);
-		if (batch) {
-			Object o = rmVarMap.get(STDOUT);
-			if (o != null) {
-				if (o instanceof PropertyType) {
-					job.setRemoteOutPath((String) ((PropertyType) o).getValue());
-				} else if (o instanceof AttributeType) {
-					job.setRemoteOutPath((String) ((AttributeType) o).getValue());
-				}
-			}
-			o = rmVarMap.get(STDERR);
-			if (o != null) {
-				if (o instanceof PropertyType) {
-					job.setRemoteErrPath((String) ((PropertyType) o).getValue());
-				} else if (o instanceof AttributeType) {
-					job.setRemoteErrPath((String) ((AttributeType) o).getValue());
-				}
-			}
-		}
-
-		job.schedule();
-
-		if (join) {
-			try {
-				job.join();
-			} catch (InterruptedException ignored) {
-			}
-		}
-
-		return job;
-	}
-
-	/**
-	 * Run command sequence. Invoked by startup or shutdown commands. Delegates
-	 * to {@link #runCommand(String, CommandType, boolean, boolean)}. Here we
-	 * join to ensure seriality. If a job in the sequence fails, the subsequent
-	 * commands will not run.
-	 * 
-	 * @param cmds
-	 *            configuration objects containing the command arguments and
-	 *            tokenizers
-	 * @throws CoreException
-	 */
-	private void runCommands(List<CommandType> cmds) throws CoreException {
-		for (CommandType cmd : cmds) {
-			CommandJob job = runCommand(null, cmd, false, false);
-
-			if (!job.isActive()) {
-				return;
-			}
-
-			try {
-				job.join();
-			} catch (InterruptedException ignored) {
-			}
-		}
-	}
-
-	/**
-	 * User name and service address. Set in case the script needs these
-	 * variables.
-	 */
-	private void setFixedConfigurationProperties() {
-		IRemoteConnection rc = getRemoteServicesDelegate().getRemoteConnection();
-		rmVarMap.maybeAddProperty(CONTROL_USER_VAR, rc.getUsername(), false);
-		rmVarMap.maybeAddProperty(CONTROL_ADDRESS_VAR, rc.getAddress(), false);
-	}
-
-	/**
-	 * Transfers the values from the configuration to the live map.
-	 * 
-	 * @param configuration
-	 *            passed in from Launch Tab when the "run" command is chosen.
-	 * @throws CoreException
-	 */
-	@SuppressWarnings({ "rawtypes", "unchecked" })
-	private void updatePropertyValuesFromTab(ILaunchConfiguration configuration) throws CoreException {
-		Map lcattr = configuration.getAttributes();
-		for (Object key : lcattr.keySet()) {
-			Object value = lcattr.get(key);
-			Object target = rmVarMap.get(key.toString());
-			if (target instanceof PropertyType) {
-				PropertyType p = (PropertyType) target;
-				p.setValue(value.toString());
-			} else if (target instanceof AttributeType) {
-				AttributeType ja = (AttributeType) target;
-				ja.setValue(value);
-			}
-		}
-
-		/*
-		 * The non-selected variables have been excluded from the launch
-		 * configuration; but we need to null out the superset values here that
-		 * are undefined.
-		 */
-		for (String key : rmVarMap.getVariables().keySet()) {
-			if (!lcattr.containsKey(key)) {
-				Object target = rmVarMap.get(key.toString());
-				if (target instanceof PropertyType) {
-					PropertyType p = (PropertyType) target;
-					if (p.isVisible()) {
-						p.setValue(null);
-					}
-				} else if (target instanceof AttributeType) {
-					AttributeType ja = (AttributeType) target;
-					if (ja.isVisible()) {
-						ja.setValue(null);
-					}
-				}
-			}
-		}
-
-		/*
-		 * pull these out of the configuration; they are needed for the script
-		 */
-		rmVarMap.maybeOverwrite(SCRIPT_PATH, SCRIPT_PATH, configuration);
-		rmVarMap.maybeOverwrite(DIRECTORY, IPTPLaunchConfigurationConstants.ATTR_WORKING_DIR, configuration);
-		rmVarMap.maybeOverwrite(EXEC_PATH, IPTPLaunchConfigurationConstants.ATTR_EXECUTABLE_PATH, configuration);
-		rmVarMap.maybeOverwrite(PROG_ARGS, IPTPLaunchConfigurationConstants.ATTR_ARGUMENTS, configuration);
-		setFixedConfigurationProperties();
-
-		launchEnv.clear();
-		launchEnv.putAll(configuration.getAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, launchEnv));
-		appendLaunchEnv = configuration.getAttribute(ILaunchManager.ATTR_APPEND_ENVIRONMENT_VARIABLES, appendLaunchEnv);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerFactory.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerFactory.java
deleted file mode 100644
index 236fdf8..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerFactory.java
+++ /dev/null
@@ -1,80 +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.jaxb.core.rm;
-
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerConfiguration;
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerControl;
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory;
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerMonitor;
-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 JAXBResourceManagerFactory extends AbstractResourceManagerFactory {
-
-	/*
-	 * (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 JAXBResourceManager((AbstractResourceManagerConfiguration) configuration,
-				(AbstractResourceManagerControl) control, (AbstractResourceManagerMonitor) monitor);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory#createConfiguration
-	 * (org.eclipse.ptp.services.core.IServiceProvider)
-	 */
-	@Override
-	public IResourceManagerConfiguration createConfiguration(IServiceProvider provider) {
-		return new JAXBResourceManagerConfiguration(JAXBResourceManagerConfiguration.BASE, provider);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory#createControl
-	 * (org.eclipse.ptp.rmsystem.IResourceManagerConfiguration)
-	 */
-	@Override
-	public IResourceManagerControl createControl(IResourceManagerComponentConfiguration configuration) {
-		return new JAXBResourceManagerControl((AbstractResourceManagerConfiguration) configuration);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory#
-	 * createControlConfiguration
-	 * (org.eclipse.ptp.services.core.IServiceProvider)
-	 */
-	@Override
-	public IResourceManagerComponentConfiguration createControlConfiguration(IServiceProvider provider) {
-		return new JAXBResourceManagerConfiguration(JAXBResourceManagerConfiguration.CONTROL, provider);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerMonitor.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerMonitor.java
deleted file mode 100644
index 8f37614..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerMonitor.java
+++ /dev/null
@@ -1,43 +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.core.rm;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerConfiguration;
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerMonitor;
-
-/**
- * JAXB resource manager monitor used for testing. Currently unimplemented
- */
-public class JAXBResourceManagerMonitor extends AbstractResourceManagerMonitor {
-
-	public JAXBResourceManagerMonitor(AbstractResourceManagerConfiguration config) {
-		super(config);
-	}
-
-	@Override
-	protected void doDispose() {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	protected void doShutdown() throws CoreException {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	protected void doStartup(IProgressMonitor monitor) throws CoreException {
-		// TODO Auto-generated method stub
-
-	}
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerMonitorFactory.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerMonitorFactory.java
deleted file mode 100644
index cc8bcec..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/rm/JAXBResourceManagerMonitorFactory.java
+++ /dev/null
@@ -1,50 +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.jaxb.core.rm;
-
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerConfiguration;
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory;
-import org.eclipse.ptp.rmsystem.IResourceManagerComponentConfiguration;
-import org.eclipse.ptp.rmsystem.IResourceManagerMonitor;
-import org.eclipse.ptp.services.core.IServiceProvider;
-
-/**
- * Create a JAXB resource manager monitor. This is only used for testing
- * purposes.
- * 
- * @since 5.0
- */
-public class JAXBResourceManagerMonitorFactory extends AbstractResourceManagerFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory#createMonitor
-	 * (org.eclipse.ptp.rmsystem.IResourceManagerConfiguration)
-	 */
-	@Override
-	public IResourceManagerMonitor createMonitor(IResourceManagerComponentConfiguration configuration) {
-		return new JAXBResourceManagerMonitor((AbstractResourceManagerConfiguration) configuration);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rmsystem.AbstractResourceManagerFactory#
-	 * createMonitorConfiguration
-	 * (org.eclipse.ptp.services.core.IServiceProvider)
-	 */
-	@Override
-	public IResourceManagerComponentConfiguration createMonitorConfiguration(IServiceProvider provider) {
-		return new JAXBResourceManagerConfiguration(JAXBResourceManagerConfiguration.MONITOR, provider);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/ManagedFilesJob.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/ManagedFilesJob.java
deleted file mode 100644
index 1d7e1c9..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/ManagedFilesJob.java
+++ /dev/null
@@ -1,220 +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.core.runnable;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.List;
-import java.util.UUID;
-
-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.core.runtime.SubMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCorePlugin;
-import org.eclipse.ptp.rm.jaxb.core.data.AttributeType;
-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.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.core.utils.CoreExceptionUtils;
-import org.eclipse.ptp.rm.jaxb.core.utils.FileUtils;
-import org.eclipse.ptp.rm.jaxb.core.utils.RemoteServicesDelegate;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-
-/**
- * A managed file is a client-side file which needs to be moved to the resource
- * to which the job will be submitted. This class wraps the Job runnable for
- * staging these files. All files in the list are copied serially to the target
- * resource.
- * 
- * @author arossi
- * 
- */
-public class ManagedFilesJob extends Job implements IJAXBNonNLSConstants {
-
-	private final String uuid;
-	private final String stagingDir;
-	private final List<ManagedFileType> files;
-	private final RemoteServicesDelegate delegate;
-	private final RMVariableMap rmVarMap;
-	private boolean success;
-
-	/**
-	 * 
-	 * @param uuid
-	 *            internal job identifier (the job has not yet been submitted)
-	 * @param files
-	 *            JAXB data element
-	 * @param delegate
-	 *            wrapper containing remote service, connection and file manager
-	 *            information
-	 * @throws CoreException
-	 */
-	public ManagedFilesJob(String uuid, ManagedFilesType files, RemoteServicesDelegate delegate) throws CoreException {
-		super(Messages.ManagedFilesJob);
-		this.uuid = uuid;
-		this.delegate = delegate;
-		rmVarMap = RMVariableMap.getActiveInstance();
-		stagingDir = rmVarMap.getString(uuid, files.getFileStagingLocation());
-		this.files = files.getFile();
-	}
-
-	/**
-	 * @return whether the staging succeeded
-	 */
-	public boolean getSuccess() {
-		return success;
-	}
-
-	/**
-	 * First checks to see if the file references in-memory content, and if so,
-	 * writes out a temporary source file. It then copies the file and places a
-	 * property in the environment mapping the name of the ManagedFile object
-	 * against its target path.
-	 */
-	@Override
-	protected IStatus run(IProgressMonitor monitor) {
-		boolean localTarget = delegate.getLocalFileManager() == delegate.getRemoteFileManager();
-		success = false;
-		SubMonitor progress = SubMonitor.convert(monitor, files.size() * 10);
-		/*
-		 * for now we handle the files serially. NOTE: no support for Windows as
-		 * target ...
-		 */
-		for (ManagedFileType file : files) {
-			try {
-				File localFile = maybeWriteFile(file);
-				progress.worked(5);
-				String fileName = localFile.getName();
-				if (file.isUniqueIdPrefix()) {
-					fileName = UUID.randomUUID() + fileName;
-				}
-				String pathSep = localTarget ? PATH_SEP : REMOTE_PATH_SEP;
-				String target = stagingDir + pathSep + fileName;
-				copyFileToRemoteHost(localFile.getAbsolutePath(), target, progress);
-				if (file.isDeleteAfterUse()) {
-					localFile.delete();
-				}
-				PropertyType p = new PropertyType();
-				p.setName(file.getName());
-				if (localTarget) {
-					p.setValue(new File(System.getProperty(JAVA_USER_HOME), target).getAbsolutePath());
-				} else {
-					p.setValue(target);
-				}
-				rmVarMap.put(p.getName(), p);
-			} catch (Throwable t) {
-				progress.done();
-				return CoreExceptionUtils.getErrorStatus(Messages.ManagedFilesJobError, t);
-			}
-			progress.worked(5);
-		}
-		progress.done();
-		success = true;
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Copy local data from the local host to the remote host.
-	 * 
-	 * @param localPath
-	 *            source file
-	 * @param remotePath
-	 *            target file
-	 * @param monitor
-	 * @throws CoreException
-	 */
-	private void copyFileToRemoteHost(String localPath, String remotePath, IProgressMonitor monitor) throws CoreException {
-		SubMonitor progress = SubMonitor.convert(monitor, 15);
-		try {
-			progress.newChild(5);
-			FileUtils.copy(delegate.getLocalFileManager(), localPath, delegate.getRemoteFileManager(), remotePath, progress);
-		} finally {
-			progress.done();
-		}
-	}
-
-	/**
-	 * If there is already a path defined for this file, this is returned. Else
-	 * a temporary source file is created to be deleted on completion. If the
-	 * file contents is a reference to a string in the environment, the normal
-	 * VariableResolver can be bypassed by setting <code>resolveContents</code>
-	 * to false; this avoids recursive resolution which might falsely interpret
-	 * shell symbols (${...}) as referring to the Eclipse default string
-	 * resolver.
-	 * 
-	 * @param file
-	 *            JAXB data element
-	 * @return the written or the pre-existent file
-	 * @throws IOException
-	 * @throws CoreException
-	 */
-	private File maybeWriteFile(ManagedFileType file) throws IOException, CoreException {
-		String path = file.getPath();
-		if (path != null) {
-			return new File(path);
-		}
-		String name = rmVarMap.getString(uuid, file.getName());
-		File sourceDir = new File(System.getProperty(JAVA_TMP_DIR));
-		File localFile = new File(sourceDir, name);
-		String contents = file.getContents();
-		FileWriter fw = null;
-		try {
-			if (contents == null) {
-				if (!localFile.exists() || !localFile.isFile()) {
-					throw new FileNotFoundException(localFile.getAbsolutePath());
-				}
-			} else {
-				if (file.isResolveContents()) {
-					contents = rmVarMap.getString(uuid, contents);
-				} else {
-					/*
-					 * magic to avoid attempted resolution of unknown shell
-					 * variables
-					 */
-					int start = contents.indexOf(OPENVRM);
-					int end = contents.length();
-					if (start >= 0) {
-						start += OPENVRM.length();
-						end = contents.indexOf(PD);
-						if (end < 0) {
-							end = contents.indexOf(CLOSV);
-						}
-						String key = contents.substring(start, end);
-						Object o = rmVarMap.get(key);
-						if (o instanceof PropertyType) {
-							contents = String.valueOf(((PropertyType) o).getValue());
-						} else if (o instanceof AttributeType) {
-							contents = String.valueOf(((AttributeType) o).getValue());
-						}
-					}
-				}
-				fw = new FileWriter(localFile, false);
-				fw.write(contents);
-				fw.flush();
-			}
-		} finally {
-			try {
-				if (fw != null) {
-					fw.close();
-				}
-			} catch (IOException t) {
-				JAXBCorePlugin.log(t);
-			}
-		}
-		return localFile;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/ScriptHandler.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/ScriptHandler.java
deleted file mode 100644
index 88ae7f5..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/ScriptHandler.java
+++ /dev/null
@@ -1,170 +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.core.runnable;
-
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.IVariableMap;
-import org.eclipse.ptp.rm.jaxb.core.data.ArgType;
-import org.eclipse.ptp.rm.jaxb.core.data.LineType;
-import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;
-import org.eclipse.ptp.rm.jaxb.core.data.ScriptType;
-import org.eclipse.ptp.rm.jaxb.core.data.impl.LineImpl;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.core.utils.EnvironmentVariableUtils;
-import org.eclipse.ptp.rm.jaxb.core.variables.LCVariableMap;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-
-/**
- * Extension of the Job runnable to handle the generation of the script by
- * resolving the Script object contents against the active environment.
- * 
- * @author arossi
- * 
- */
-public class ScriptHandler extends Job implements IJAXBNonNLSConstants {
-
-	private final String uuid;
-	private final IVariableMap map;
-	private final Map<String, String> launchEnv;
-	private ScriptType script;
-	private String scriptValue;
-
-	/**
-	 * @param uuid
-	 *            internal job identifier (the job has not yet been submitted)
-	 * @param script
-	 *            JAXB data element
-	 * @param map
-	 *            the active resource manager or launch tab environment map
-	 * @param launchEnv
-	 *            any special application environment variables set by the user
-	 *            in the Launch Tab
-	 */
-	public ScriptHandler(String uuid, ScriptType script, IVariableMap map, Map<String, String> launchEnv) {
-		super(Messages.ScriptHandlerJob);
-		this.uuid = uuid;
-		this.script = script;
-		this.launchEnv = launchEnv;
-		this.map = map;
-		if (map instanceof LCVariableMap) {
-			convertScript();
-		}
-	}
-
-	/**
-	 * @return the generated script string
-	 */
-	public String getScriptValue() {
-		return scriptValue;
-	}
-
-	/**
-	 * Composes script. If the variable map is the resource manager's
-	 * environment, then the SCRIPT property is added to it, with it value set
-	 * to the script string that has been generated.
-	 */
-	@Override
-	protected IStatus run(IProgressMonitor monitor) {
-		SubMonitor progress = SubMonitor.convert(monitor, 10);
-		scriptValue = composeScript(monitor);
-		if (map instanceof RMVariableMap) {
-			RMVariableMap rmMap = (RMVariableMap) map;
-			PropertyType p = new PropertyType();
-			p.setName(SCRIPT);
-			p.setValue(scriptValue);
-			rmMap.put(SCRIPT, p);
-		}
-		progress.done();
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Reads from the data object line by line, resolving its arguments and
-	 * eliminating lines whose resolved arguments qualify as undefined.<br>
-	 * <br>
-	 * The <code>envBegin</code> and <code>envEnd</code> tell the script
-	 * generator between which lines to insert the special environment variables
-	 * passed in as the <code>launchEnv</code> if there are any.
-	 * 
-	 * @param monitor
-	 * @return the generated script string
-	 */
-	private String composeScript(IProgressMonitor monitor) {
-		List<LineType> line = script.getLine();
-		int len = line.size();
-		if (len == 0) {
-			return ZEROSTR;
-		}
-		int envAfter = script.getInsertEnvironmentAfter();
-		if (envAfter == UNDEFINED) {
-			envAfter = 1;
-		}
-		SubMonitor progress = SubMonitor.convert(monitor, len);
-		StringBuffer buffer = new StringBuffer();
-		String s = null;
-		int i = 0;
-		String firstLine = new LineImpl(uuid, line.get(0), map).getResolved();
-		for (; i <= envAfter; i++) {
-			s = new LineImpl(uuid, line.get(i), map).getResolved();
-			if (!ZEROSTR.equals(s)) {
-				buffer.append(s).append(REMOTE_LINE_SEP);
-			}
-			progress.worked(1);
-		}
-
-		if (launchEnv != null) {
-			for (String var : launchEnv.keySet()) {
-				EnvironmentVariableUtils.addVariable(var, launchEnv.get(var), firstLine, buffer);
-			}
-		}
-		for (; i < len; i++) {
-			s = new LineImpl(uuid, line.get(i), map).getResolved();
-			if (!ZEROSTR.equals(s)) {
-				buffer.append(s).append(REMOTE_LINE_SEP);
-			}
-			progress.worked(1);
-		}
-		progress.done();
-		return buffer.toString();
-	}
-
-	/**
-	 * An auxiliary used in the case of the LaunchTab calling this handler. A
-	 * temporary replacement Script is created, with the resolver tags changed
-	 * from ${rm:...} to ${lc:...} (the user never sees the latter).
-	 */
-	private void convertScript() {
-		ScriptType ltScript = new ScriptType();
-		ltScript.setInsertEnvironmentAfter(script.getInsertEnvironmentAfter());
-		List<LineType> lines = ltScript.getLine();
-		List<ArgType> args = null;
-		for (LineType line : script.getLine()) {
-			LineType newLine = new LineType();
-			args = newLine.getArg();
-			for (ArgType a : line.getArg()) {
-				ArgType newA = new ArgType();
-				newA.setIsUndefinedIfMatches(a.getIsUndefinedIfMatches());
-				newA.setContent(a.getContent().replaceAll(VRM, VLC));
-				newA.setResolve(a.isResolve());
-				args.add(newA);
-			}
-			lines.add(newLine);
-		}
-		script = ltScript;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJob.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJob.java
deleted file mode 100644
index e7a9cfb..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJob.java
+++ /dev/null
@@ -1,595 +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.core.runnable.command;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.ptp.remote.core.IRemoteProcess;
-import org.eclipse.ptp.remote.core.IRemoteProcessBuilder;
-import org.eclipse.ptp.rm.jaxb.core.ICommandJobStreamsProxy;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerControl;
-import org.eclipse.ptp.rm.jaxb.core.IStreamParserTokenizer;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCorePlugin;
-import org.eclipse.ptp.rm.jaxb.core.data.ArgType;
-import org.eclipse.ptp.rm.jaxb.core.data.CommandType;
-import org.eclipse.ptp.rm.jaxb.core.data.NameValuePairType;
-import org.eclipse.ptp.rm.jaxb.core.data.TokenizerType;
-import org.eclipse.ptp.rm.jaxb.core.data.impl.ArgImpl;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.core.utils.CoreExceptionUtils;
-import org.eclipse.ptp.rm.jaxb.core.utils.EnvironmentVariableUtils;
-import org.eclipse.ptp.rm.jaxb.core.utils.RemoteServicesDelegate;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-
-/**
- * Implementation of runnable Job for executing external processes. Uses the
- * IRemoteProcessBuilder with the IRemoteConnection for the resource manager's
- * target.
- * 
- * @author arossi
- * 
- */
-public class CommandJob extends Job implements IJAXBNonNLSConstants {
-
-	/**
-	 * Internal class used for multiplexing output streams between two different
-	 * endpoints, usually a tokenizer on the one hand and the stream proxy
-	 * passed back to the caller on the other.
-	 * 
-	 * @author arossi
-	 */
-	private class StreamSplitter extends Thread {
-		private final InputStream in;
-		private final PipedOutputStream[] pout;
-		private final BufferedOutputStream[] bout;
-
-		/**
-		 * @param in
-		 *            the stream to be multiplexed
-		 * @param pipe1
-		 *            sink's stream from which it will read
-		 * @param pipe2
-		 *            sink's stream from which it will read
-		 * @throws IOException
-		 */
-		private StreamSplitter(InputStream in, PipedInputStream pipe1, PipedInputStream pipe2) throws IOException {
-			this.in = in;
-			assert (pipe1 != null && pipe2 != null);
-			pout = new PipedOutputStream[] { new PipedOutputStream(pipe1), new PipedOutputStream(pipe2) };
-			bout = new BufferedOutputStream[] { new BufferedOutputStream(pout[0], STREAM_BUFFER_SIZE),
-					new BufferedOutputStream(pout[1], STREAM_BUFFER_SIZE) };
-		}
-
-		/**
-		 * Reads from input and writes to the piped streams.
-		 */
-		@Override
-		public void run() {
-			BufferedInputStream bin = new BufferedInputStream(in);
-			while (true) {
-				try {
-					int i = bin.read();
-					if (i == -1) {
-						break;
-					}
-					for (BufferedOutputStream b : bout) {
-						b.write(i);
-						b.flush();
-					}
-				} catch (EOFException eof) {
-					break;
-				} catch (IOException t) {
-					JAXBCorePlugin.log(t);
-					break;
-				}
-			}
-			for (BufferedOutputStream b : bout) {
-				try {
-					b.close();
-				} catch (IOException t) {
-					JAXBCorePlugin.log(t);
-				}
-			}
-			// input stream closed elsewhere
-		}
-	}
-
-	private final String uuid;
-	private final CommandType command;
-	private final IJAXBResourceManagerControl rm;
-	private final ICommandJobStreamsProxy proxy;
-	private final boolean waitForId;
-	private final boolean ignoreExitStatus;
-	private final boolean batch;
-
-	private IRemoteProcess process;
-	private IStreamParserTokenizer stdoutTokenizer;
-	private IStreamParserTokenizer stderrTokenizer;
-	private Thread stdoutT;
-	private Thread stderrT;
-	private InputStream tokenizerOut;
-	private InputStream tokenizerErr;
-	private StreamSplitter outSplitter;
-	private StreamSplitter errSplitter;
-	private String remoteOutPath;
-	private String remoteErrPath;
-	private final StringBuffer error;
-	private boolean active;
-
-	/**
-	 * @param jobUUID
-	 *            either internal or resource specific identifier
-	 * @param command
-	 *            JAXB data element
-	 * @param batch
-	 *            whether submission is batch or interactive
-	 * @param rm
-	 *            the calling resource manager
-	 */
-	public CommandJob(String jobUUID, CommandType command, boolean batch, IJAXBResourceManagerControl rm) {
-		super(command.getName());
-		this.command = command;
-		this.batch = batch;
-		this.rm = rm;
-		this.uuid = jobUUID;
-		this.proxy = new CommandJobStreamsProxy();
-		this.waitForId = command.isWaitForId();
-		this.ignoreExitStatus = command.isIgnoreExitStatus();
-		this.error = new StringBuffer();
-	}
-
-	/**
-	 * @return the process wrapper
-	 */
-	public IRemoteProcess getProcess() {
-		return process;
-	}
-
-	/**
-	 * @return object wrapping stream monitors.
-	 */
-	public ICommandJobStreamsProxy getProxy() {
-		return proxy;
-	}
-
-	/**
-	 * @return if job is active
-	 */
-	public boolean isActive() {
-		boolean b = false;
-		synchronized (this) {
-			b = active;
-		}
-		return b;
-	}
-
-	/**
-	 * @return if job is batch
-	 */
-	public boolean isBatch() {
-		return batch;
-	}
-
-	/**
-	 * Used by stream proxy to read stderr from file if submission is batch.
-	 * 
-	 * @param remoteErrPath
-	 *            for stream redirection (batch submissions)
-	 */
-	public void setRemoteErrPath(String remoteErrPath) {
-		this.remoteErrPath = remoteErrPath;
-	}
-
-	/**
-	 * Used by stream proxy to read stdout from file if submission is batch.
-	 * 
-	 * @param remoteOutPath
-	 */
-	public void setRemoteOutPath(String remoteOutPath) {
-		this.remoteOutPath = remoteOutPath;
-	}
-
-	/**
-	 * The resource manager should wait for the job id on the stream (parsed by
-	 * an apposite tokenizer) before returning the status object to the caller.
-	 * 
-	 * @return whether to wait
-	 */
-	public boolean waitForId() {
-		return waitForId;
-	}
-
-	/**
-	 * Uses the IRemoteProcessBuilder to set up the command and environment.
-	 * After start, the tokenizers (if any) are handled, and stream redirection
-	 * managed. Waits for the process, then joins on the consumers.<br>
-	 * <br>
-	 * Note: the resource manager does not join on this thread, but retrieves
-	 * the status object from the job, potentially while it is still running, in
-	 * order to hand it off to the caller for stream processing.
-	 */
-	@Override
-	protected IStatus run(IProgressMonitor monitor) {
-		try {
-			synchronized (this) {
-				active = false;
-			}
-			IRemoteProcessBuilder builder = prepareCommand();
-			prepareEnv(builder);
-
-			process = null;
-			try {
-				process = builder.start();
-			} catch (IOException t) {
-				throw CoreExceptionUtils.newException(Messages.CouldNotLaunch + builder.command(), t);
-			}
-
-			maybeInitializeTokenizers(builder);
-			setOutStreamRedirection(process);
-			setErrStreamRedirection(process);
-			startConsumers(process);
-
-			synchronized (this) {
-				active = true;
-			}
-
-			int exit = 0;
-			try {
-				exit = process.waitFor();
-			} catch (InterruptedException ignored) {
-			}
-
-			if (exit != 0 && !ignoreExitStatus) {
-				String t = error.toString();
-				error.setLength(0);
-				throw CoreExceptionUtils.newException(Messages.ProcessExitValueError + (ZEROSTR + exit) + SP + CO + t, null);
-			}
-
-			joinConsumers();
-		} catch (CoreException ce) {
-			return ce.getStatus();
-		} catch (Throwable t) {
-			return CoreExceptionUtils.getErrorStatus(Messages.ProcessRunError, t);
-		}
-		synchronized (this) {
-			active = false;
-		}
-		return Status.OK_STATUS;
-	}
-
-	private void errorStreamReader(final InputStream err) {
-		new Thread() {
-			@Override
-			public void run() {
-				BufferedReader br = new BufferedReader(new InputStreamReader(err));
-				while (true) {
-					try {
-						String line = br.readLine();
-						if (line == null) {
-							break;
-						}
-						error.append(line).append(LINE_SEP);
-					} catch (EOFException eof) {
-						break;
-					} catch (IOException io) {
-						JAXBCorePlugin.log(io);
-						break;
-					}
-				}
-			}
-		}.start();
-	}
-
-	/**
-	 * Wait for any stream consumer threads to exit.
-	 * 
-	 * @throws CoreException
-	 */
-	private void joinConsumers() throws CoreException {
-		Throwable t = null;
-
-		if (outSplitter != null) {
-			try {
-				outSplitter.join();
-			} catch (InterruptedException ignored) {
-			}
-		}
-
-		if (errSplitter != null) {
-			try {
-				errSplitter.join();
-			} catch (InterruptedException ignored) {
-			}
-		}
-
-		if (stdoutT != null) {
-			try {
-				stdoutT.join();
-			} catch (InterruptedException ignored) {
-			}
-			t = stdoutTokenizer.getInternalError();
-		}
-
-		if (stderrT != null) {
-			try {
-				stderrT.join();
-			} catch (InterruptedException ignored) {
-			}
-			t = stderrTokenizer.getInternalError();
-		}
-
-		if (t != null) {
-			throw CoreExceptionUtils.newException(Messages.ParserInternalError, t);
-		}
-	}
-
-	/**
-	 * Checks to see what tokenizers are configured for this resource manager.
-	 * If the two streams have been joined, it will prefer the redirect parser
-	 * if it exists; otherwise the joined streams will be parsed by the stdout
-	 * parser.<br>
-	 * <br>
-	 * If there is a custom extension tokenizer, it will be instantiated here.
-	 * 
-	 * @param builder
-	 * @throws CoreException
-	 */
-	private void maybeInitializeTokenizers(IRemoteProcessBuilder builder) throws CoreException {
-		TokenizerType t = null;
-
-		if (builder.redirectErrorStream()) {
-			t = command.getRedirectParser();
-		}
-
-		if (t == null) {
-			t = command.getStdoutParser();
-		}
-
-		if (t != null) {
-			try {
-				String type = t.getType();
-				if (type != null) {
-					stdoutTokenizer = getTokenizer(type);
-				} else {
-					stdoutTokenizer = new ConfigurableRegexTokenizer(uuid, t);
-				}
-			} catch (Throwable e) {
-				throw CoreExceptionUtils.newException(Messages.StdoutParserError, e);
-			}
-		}
-
-		t = command.getStderrParser();
-		if (t != null) {
-			try {
-				String type = t.getType();
-				if (type != null) {
-					stderrTokenizer = getTokenizer(type);
-				} else {
-					stderrTokenizer = new ConfigurableRegexTokenizer(uuid, t);
-				}
-			} catch (Throwable e) {
-				throw CoreExceptionUtils.newException(Messages.StdoutParserError, e);
-			}
-		}
-	}
-
-	/**
-	 * Resolves the command arguments against the current environment, then gets
-	 * the process builder from the remote connection.
-	 * 
-	 * @return the process builder
-	 * @throws CoreException
-	 */
-	private IRemoteProcessBuilder prepareCommand() throws CoreException {
-		List<ArgType> args = command.getArg();
-		if (args == null) {
-			throw CoreExceptionUtils.newException(Messages.MissingArglistFromCommandError, null);
-		}
-		RMVariableMap map = RMVariableMap.getActiveInstance();
-		String[] cmdArgs = ArgImpl.getArgs(uuid, args, map);
-		RemoteServicesDelegate delegate = rm.getRemoteServicesDelegate();
-		return delegate.getRemoteServices().getProcessBuilder(delegate.getRemoteConnection(), cmdArgs);
-	}
-
-	/**
-	 * Either appends to or replaces the process builder's environment with the
-	 * Launch Configuration environment variables. Also sets redirectErrorStream
-	 * on the builder.
-	 * 
-	 * @param builder
-	 * @throws CoreException
-	 */
-	private void prepareEnv(IRemoteProcessBuilder builder) throws CoreException {
-		if (!rm.getAppendEnv()) {
-			builder.environment().clear();
-			Map<String, String> live = rm.getLaunchEnv();
-			for (String var : live.keySet()) {
-				builder.environment().put(var, live.get(var));
-			}
-		} else {
-			if (command.isReplaceEnvironment()) {
-				builder.environment().clear();
-			}
-			/*
-			 * first static env, then dynamic
-			 */
-			List<NameValuePairType> vars = command.getEnvironment();
-			RMVariableMap map = RMVariableMap.getActiveInstance();
-			for (NameValuePairType var : vars) {
-				EnvironmentVariableUtils.addVariable(uuid, var, builder.environment(), map);
-			}
-
-			Map<String, String> live = rm.getLaunchEnv();
-			for (String var : live.keySet()) {
-				builder.environment().put(var, live.get(var));
-			}
-		}
-
-		builder.redirectErrorStream(command.isRedirectStderr());
-	}
-
-	/**
-	 * Configures handling of the error stream. If there is a tokenizer, it
-	 * first checks to see if there will be redirection from a remote file, and
-	 * if not, splits the stream between the proxy and the tokenizer in the case
-	 * of an interactive job; if there is a remote file, that stream is given to
-	 * the proxy and the tokenizer gets the stderr of the submission process. If
-	 * there is no tokenizer, then the proxy gets either stderr of the
-	 * submission process if interactive, or redirection from the remote file,
-	 * accordingly.
-	 * 
-	 * @param process
-	 * @throws IOException
-	 */
-	private void setErrStreamRedirection(IRemoteProcess process) throws IOException {
-		if (stderrTokenizer != null) {
-			if (remoteErrPath != null) {
-				tokenizerErr = process.getErrorStream();
-				proxy.setErrMonitor(new CommandJobStreamTailFMonitor(rm, remoteErrPath));
-			} else if (!batch) {
-				PipedInputStream tokenizerErr = new PipedInputStream();
-				this.tokenizerErr = tokenizerErr;
-				PipedInputStream monitorErr = new PipedInputStream();
-				errSplitter = new StreamSplitter(process.getErrorStream(), tokenizerErr, monitorErr);
-				proxy.setErrMonitor(new CommandJobStreamMonitor(monitorErr));
-			} else {
-				tokenizerErr = process.getErrorStream();
-			}
-		} else if (remoteErrPath != null) {
-			proxy.setErrMonitor(new CommandJobStreamTailFMonitor(rm, remoteErrPath));
-			/*
-			 * grab error stream for error reporting
-			 */
-			errorStreamReader(process.getErrorStream());
-		} else if (!batch) {
-			proxy.setErrMonitor(new CommandJobStreamMonitor(process.getErrorStream()));
-		}
-	}
-
-	/**
-	 * Configures handling of the stdout stream. If there is a tokenizer, it
-	 * first checks to see if there will be redirection from a remote file, and
-	 * if not, splits the stream between the proxy and the tokenizer in the case
-	 * of an interactive job; if there is a remote file, that stream is given to
-	 * the proxy and the tokenizer gets the stdout of the submission process. If
-	 * there is no tokenizer, then the proxy gets either stdout of the
-	 * submission process if interactive, or redirection from the remote file,
-	 * accordingly.
-	 * 
-	 * @param process
-	 * @throws IOException
-	 */
-	private void setOutStreamRedirection(IRemoteProcess process) throws IOException {
-		if (stdoutTokenizer != null) {
-			if (remoteOutPath != null) {
-				tokenizerOut = process.getInputStream();
-				proxy.setOutMonitor(new CommandJobStreamTailFMonitor(rm, remoteOutPath));
-			} else if (!batch) {
-				PipedInputStream tokenizerOut = new PipedInputStream();
-				this.tokenizerOut = tokenizerOut;
-				PipedInputStream monitorOut = new PipedInputStream();
-				outSplitter = new StreamSplitter(process.getInputStream(), tokenizerOut, monitorOut);
-				proxy.setOutMonitor(new CommandJobStreamMonitor(monitorOut));
-			} else {
-				tokenizerOut = process.getInputStream();
-			}
-		} else if (remoteOutPath != null) {
-			proxy.setOutMonitor(new CommandJobStreamTailFMonitor(rm, remoteOutPath));
-			errorStreamReader(process.getInputStream());
-		} else if (!batch) {
-			proxy.setOutMonitor(new CommandJobStreamMonitor(process.getInputStream()));
-		}
-	}
-
-	/**
-	 * Initiates stream reading on all consumers.
-	 * 
-	 * @param process
-	 * @throws CoreException
-	 */
-	private void startConsumers(IRemoteProcess process) throws CoreException {
-		if (outSplitter != null) {
-			outSplitter.start();
-		}
-
-		if (errSplitter != null) {
-			errSplitter.start();
-		}
-
-		if (remoteOutPath == null) {
-			proxy.startMonitors();
-		}
-
-		if (stdoutTokenizer != null) {
-			try {
-				stdoutTokenizer.setInputStream(tokenizerOut);
-				stdoutT = new Thread(stdoutTokenizer);
-				stdoutT.start();
-			} catch (Throwable e) {
-				throw CoreExceptionUtils.newException(Messages.StdoutParserError, e);
-			}
-		}
-		if (stderrTokenizer != null) {
-			try {
-				stderrTokenizer.setInputStream(tokenizerErr);
-				stderrT = new Thread(stderrTokenizer);
-				stderrT.start();
-			} catch (Throwable e) {
-				throw CoreExceptionUtils.newException(Messages.StderrParserError, e);
-			}
-		}
-	}
-
-	/**
-	 * Extension-based instantiation for custom tokenizer.
-	 * 
-	 * @param type
-	 *            extension name
-	 * @return the tokenizer instance
-	 * @throws CoreException
-	 */
-	public static IStreamParserTokenizer getTokenizer(String type) throws CoreException {
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(JAXBCorePlugin.PLUGIN_ID,
-				TOKENIZER_EXT_PT);
-		IConfigurationElement[] elements = extensionPoint.getConfigurationElements();
-		for (int i = 0; i < elements.length; i++) {
-			IConfigurationElement element = elements[i];
-			try {
-				if (element.getAttribute(ID).equals(type)) {
-					return (IStreamParserTokenizer) element.createExecutableExtension(CLASS);
-				}
-			} catch (CoreException ce) {
-				throw ce;
-			} catch (Throwable t) {
-				throw CoreExceptionUtils.newException(Messages.StreamTokenizerInstantiationError + type, t);
-			}
-		}
-		return null;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJobStatus.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJobStatus.java
deleted file mode 100644
index 7fb66dc..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJobStatus.java
+++ /dev/null
@@ -1,256 +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.core.runnable.command;
-
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.model.IStreamsProxy;
-import org.eclipse.ptp.remote.core.IRemoteProcess;
-import org.eclipse.ptp.rm.jaxb.core.ICommandJobStatus;
-import org.eclipse.ptp.rm.jaxb.core.ICommandJobStreamMonitor;
-import org.eclipse.ptp.rm.jaxb.core.ICommandJobStreamsProxy;
-import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-import org.eclipse.ptp.rmsystem.IJobStatus;
-
-/**
- * Extension of the IJobStatus class to handle resource manager command jobs.
- * 
- * @author arossi
- * 
- */
-public class CommandJobStatus implements ICommandJobStatus {
-
-	private String jobId;
-	private ILaunchConfiguration launchConfig;
-	private String state;
-	private String stateDetail;
-	private ICommandJobStreamsProxy proxy;
-	private IRemoteProcess process;
-	private final RMVariableMap rmVarMap;
-	private boolean waitEnabled;
-	private long lastUpdateRequest;
-
-	public CommandJobStatus() {
-		jobId = null;
-		state = IJobStatus.UNDETERMINED;
-		rmVarMap = RMVariableMap.getActiveInstance();
-		waitEnabled = true;
-		lastUpdateRequest = 0;
-	}
-
-	/**
-	 * @param jobId
-	 *            either internal UUID or resource-specific id
-	 * @param state
-	 */
-	public CommandJobStatus(String jobId, String state) {
-		this.jobId = jobId;
-		setState(state);
-		rmVarMap = RMVariableMap.getActiveInstance();
-		waitEnabled = false;
-	}
-
-	/**
-	 * Closes the proxy and calls destroy on the process. Used for interactive
-	 * jobs cancellation.
-	 */
-	public synchronized void cancel() {
-		if (proxy != null) {
-			proxy.close();
-		}
-		if (process != null) {
-			process.destroy();
-		}
-	}
-
-	/**
-	 * Notifies all callers of <code>waitForId</code> to exit wait.
-	 */
-	public void cancelWait() {
-		synchronized (this) {
-			waitEnabled = false;
-			notifyAll();
-		}
-	}
-
-	/**
-	 * @return jobId either internal UUID or resource-specific id
-	 */
-	public synchronized String getJobId() {
-		return jobId;
-	}
-
-	public synchronized long getLastUpdateRequest() {
-		return lastUpdateRequest;
-	}
-
-	/**
-	 * @return configuration used for this submission.
-	 */
-	public ILaunchConfiguration getLaunchConfiguration() {
-		return launchConfig;
-	}
-
-	/**
-	 * @return state of the job (not of the submission process).
-	 */
-	public synchronized String getState() {
-		return state;
-	}
-
-	/**
-	 * @return more specific state identifier.
-	 */
-	public synchronized String getStateDetail() {
-		return stateDetail;
-	}
-
-	/**
-	 * Wrapper containing monitoring functionality for the associated output and
-	 * error streams.
-	 */
-	public IStreamsProxy getStreamsProxy() {
-		return proxy;
-	}
-
-	/**
-	 * @return whether a process object has been attached to this status object
-	 *         (in which case the submission is not through an asynchronous job
-	 *         scheduler).
-	 */
-	public boolean isInteractive() {
-		return process != null;
-	}
-
-	/**
-	 * @param launchConfig
-	 *            configuration used for this submission.
-	 */
-	public void setLaunchConfig(ILaunchConfiguration launchConfig) {
-		this.launchConfig = launchConfig;
-	}
-
-	/**
-	 * @param process
-	 *            object (used for interactive cancellation)
-	 */
-	public void setProcess(IRemoteProcess process) {
-		this.process = process;
-	}
-
-	/**
-	 * We also immediately dereference any paths associated withthe proxy
-	 * monitors by calling intialize, as the jobId property may not be in the
-	 * environment after this initial call returns. We also start the monitors
-	 * here, as tail -F will retry until the file appears.
-	 * 
-	 * @param proxy
-	 *            Wrapper containing monitoring functionality for the associated
-	 *            output and error streams.
-	 */
-	public void setProxy(ICommandJobStreamsProxy proxy) {
-		this.proxy = proxy;
-		ICommandJobStreamMonitor m = (ICommandJobStreamMonitor) proxy.getOutputStreamMonitor();
-		if (m != null) {
-			m.initializeFilePath(jobId);
-			m.startMonitoring();
-		}
-		m = (ICommandJobStreamMonitor) proxy.getErrorStreamMonitor();
-		if (m != null) {
-			m.initializeFilePath(jobId);
-			m.startMonitoring();
-		}
-	}
-
-	/**
-	 * @param state
-	 *            of the job (not of the submission process).
-	 */
-	public synchronized void setState(String state) {
-		if (UNDETERMINED.equals(state)) {
-			this.state = UNDETERMINED;
-			stateDetail = UNDETERMINED;
-		} else if (SUBMITTED.equals(state)) {
-			this.state = SUBMITTED;
-			stateDetail = SUBMITTED;
-		} else if (RUNNING.equals(state)) {
-			this.state = RUNNING;
-			stateDetail = RUNNING;
-		} else if (SUSPENDED.equals(state)) {
-			this.state = SUSPENDED;
-			stateDetail = SUSPENDED;
-		} else if (COMPLETED.equals(state)) {
-			this.state = COMPLETED;
-			stateDetail = COMPLETED;
-		} else if (QUEUED_ACTIVE.equals(state)) {
-			this.state = SUBMITTED;
-			stateDetail = QUEUED_ACTIVE;
-		} else if (SYSTEM_ON_HOLD.equals(state)) {
-			this.state = SUBMITTED;
-			stateDetail = SYSTEM_ON_HOLD;
-		} else if (USER_ON_HOLD.equals(state)) {
-			this.state = SUBMITTED;
-			stateDetail = USER_ON_HOLD;
-		} else if (USER_SYSTEM_ON_HOLD.equals(state)) {
-			this.state = SUBMITTED;
-			stateDetail = USER_SYSTEM_ON_HOLD;
-		} else if (SYSTEM_SUSPENDED.equals(state)) {
-			this.state = SUSPENDED;
-			stateDetail = SYSTEM_SUSPENDED;
-		} else if (USER_SUSPENDED.equals(state)) {
-			this.state = SUSPENDED;
-			stateDetail = USER_SUSPENDED;
-		} else if (USER_SYSTEM_SUSPENDED.equals(state)) {
-			this.state = SUSPENDED;
-			stateDetail = USER_SYSTEM_SUSPENDED;
-		} else if (FAILED.equals(state)) {
-			this.state = COMPLETED;
-			stateDetail = FAILED;
-		}
-	}
-
-	/**
-	 * @param time
-	 *            in milliseconds of last update request issued to remote
-	 *            resource
-	 */
-	public synchronized void setUpdateRequestTime(long update) {
-		lastUpdateRequest = update;
-	}
-
-	/**
-	 * Wait until the jobId has been set on the job id property in the
-	 * environment.
-	 * 
-	 * @param uuid
-	 *            key for the property containing as its name the
-	 *            resource-specific jobId and as its value its initial state
-	 *            (SUBMITTED)
-	 */
-	public void waitForJobId(String uuid) {
-		synchronized (this) {
-			while (waitEnabled && jobId == null) {
-				try {
-					wait(1000);
-				} catch (InterruptedException ignored) {
-				}
-				PropertyType p = (PropertyType) rmVarMap.get(uuid);
-				if (p != null) {
-					jobId = p.getName();
-					String v = (String) p.getValue();
-					if (v != null) {
-						state = v;
-					}
-
-				}
-			}
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJobStreamMonitor.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJobStreamMonitor.java
deleted file mode 100644
index d6d9f44..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJobStreamMonitor.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 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
- *     Albert L. Rossi - modifications to support JAXB RM commands (copied
- *                       code from org.eclipse.debug)
- *******************************************************************************/
-
-package org.eclipse.ptp.rm.jaxb.core.runnable.command;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.debug.core.IStreamListener;
-import org.eclipse.ptp.rm.jaxb.core.ICommandJobStreamMonitor;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCorePlugin;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.core.utils.CoreExceptionUtils;
-
-/**
- * Monitors the output stream of a system process and notifies listeners of
- * additions to the stream.<br>
- * <br>
- * The output stream monitor reads system out (or err) via an input stream.<br>
- * <br>
- * This class has been adapted from
- * <code>org.eclipse.debug.internal.core.OutputStreamMonitor</code> (internal,
- * discouraged access).
- * 
- * @author arossi
- * 
- */
-public class CommandJobStreamMonitor implements ICommandJobStreamMonitor, IJAXBNonNLSConstants {
-	class ContentNotifier implements ISafeRunnable {
-
-		private IStreamListener fListener;
-		private String fText;
-
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable exception) {
-			JAXBCorePlugin.log(exception);
-		}
-
-		public void notifyAppend(String text) {
-			if (text == null) {
-				return;
-			}
-			fText = text;
-			Object[] copiedListeners = fListeners.getListeners();
-			for (int i = 0; i < copiedListeners.length; i++) {
-				fListener = (IStreamListener) copiedListeners[i];
-				SafeRunner.run(this);
-			}
-			fListener = null;
-			fText = null;
-		}
-
-		/**
-		 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-		 */
-		public void run() throws Exception {
-			fListener.streamAppended(fText, CommandJobStreamMonitor.this);
-		}
-	}
-
-	protected final StringBuffer fContents;
-	protected final String fEncoding;
-
-	protected ListenerList fListeners;
-	protected Thread fThread;
-	protected boolean fKilled = false;
-	protected int bufferLimit;
-	private final InputStream fStream;
-	private long lastSleep;
-
-	public CommandJobStreamMonitor() {
-		this(null, null);
-	}
-
-	public CommandJobStreamMonitor(InputStream stream) {
-		this(stream, null);
-	}
-
-	/**
-	 * Creates an output stream monitor on the given stream (connected to system
-	 * out or err).
-	 * 
-	 * @param stream
-	 *            input stream to read from
-	 * @param encoding
-	 *            stream encoding or <code>null</code> for system default
-	 */
-	public CommandJobStreamMonitor(InputStream stream, String encoding) {
-		fStream = stream;
-		fEncoding = encoding;
-		fContents = new StringBuffer();
-		bufferLimit = UNDEFINED;
-		fListeners = new ListenerList();
-	}
-
-	/**
-	 * @param listener
-	 *            from client
-	 */
-	public synchronized void addListener(IStreamListener listener) {
-		fListeners.add(listener);
-	}
-
-	/**
-	 * Causes the monitor to close all communications between it and the
-	 * underlying stream by waiting for the thread to terminate.
-	 */
-	public synchronized void close() {
-		fKilled = true;
-		if (fThread != null) {
-			Thread thread = fThread;
-			fThread = null;
-			try {
-				thread.interrupt();
-				thread.join();
-			} catch (InterruptedException ie) {
-			}
-			fContents.setLength(0);
-			fListeners = new ListenerList();
-		}
-	}
-
-	@Override
-	public void finalize() throws Throwable {
-		close();
-		super.finalize();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStreamMonitor#getContents()
-	 */
-	public synchronized String getContents() {
-		return fContents.toString();
-	}
-
-	/*
-	 * Adapter, does nothing. Subclasses may implement. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.core.ICommandJobStreamMonitor#initializeFilePath
-	 * (java.lang.String)
-	 */
-	public void initializeFilePath(String jobId) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.model.IStreamMonitor#removeListener(org.eclipse
-	 * .debug.core.IStreamListener)
-	 */
-	public synchronized void removeListener(IStreamListener listener) {
-		fListeners.remove(listener);
-	}
-
-	/**
-	 * Tune the monitor's buffer size
-	 * 
-	 * @param bufferLimit
-	 *            in chars
-	 * 
-	 */
-	public void setBufferLimit(int bufferLimit) {
-		this.bufferLimit = bufferLimit;
-	}
-
-	/**
-	 * Starts a thread which reads from the stream
-	 */
-	public synchronized void startMonitoring() {
-		if (fThread == null) {
-			fThread = new Thread(new Runnable() {
-				public void run() {
-					read();
-				}
-			}, Messages.CommandJobStreamMonitor_label);
-			fThread.setDaemon(true);
-			fThread.setPriority(Thread.MIN_PRIORITY);
-			fThread.start();
-		}
-	}
-
-	/**
-	 * Notifies the listeners that text has been appended to the stream.
-	 */
-	protected void fireStreamAppended(String text) {
-		getNotifier().notifyAppend(text);
-	}
-
-	protected ContentNotifier getNotifier() {
-		return new ContentNotifier();
-	}
-
-	/**
-	 * Continually reads from the stream.
-	 * <p>
-	 * This method, along with the <code>startReading</code> method is used to
-	 * allow <code>OutputStreamMonitor</code> to implement <code>Runnable</code>
-	 * without publicly exposing a <code>run</code> method.
-	 */
-	protected void read() {
-		if (fStream == null) {
-			JAXBCorePlugin.log(CoreExceptionUtils.getErrorStatus(Messages.CommandJobNullMonitorStreamError, null));
-			return;
-		}
-
-		lastSleep = System.currentTimeMillis();
-		long currentTime = lastSleep;
-		byte[] bytes = new byte[STREAM_BUFFER_SIZE];
-		int read = 0;
-		while (read >= 0) {
-			try {
-				if (fKilled) {
-					break;
-				}
-				read = fStream.read(bytes);
-				if (read > 0) {
-					String text;
-					if (fEncoding != null) {
-						text = new String(bytes, 0, read, fEncoding);
-					} else {
-						text = new String(bytes, 0, read);
-					}
-					synchronized (this) {
-						fContents.append(text);
-						int len = fContents.length();
-						if (bufferLimit != UNDEFINED && len > bufferLimit) {
-							fContents.delete(0, len - bufferLimit);
-						}
-						fireStreamAppended(text);
-					}
-				}
-			} catch (EOFException eof) {
-				break;
-			} catch (IOException ioe) {
-				if (!fKilled) {
-					JAXBCorePlugin.log(ioe);
-				}
-				return;
-			} catch (NullPointerException e) {
-				// killing the stream monitor while reading can cause an NPE
-				// when reading from the stream
-				if (!fKilled && fThread != null) {
-					JAXBCorePlugin.log(e);
-				}
-				return;
-			}
-
-			currentTime = System.currentTimeMillis();
-			if (currentTime - lastSleep > 1000) {
-				lastSleep = currentTime;
-				try {
-					Thread.sleep(1); // just give up CPU to maintain UI
-										// responsiveness.
-				} catch (InterruptedException e) {
-				}
-			}
-		}
-
-		try {
-			fStream.close();
-		} catch (IOException e) {
-			JAXBCorePlugin.log(e);
-		}
-	}
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJobStreamTailFMonitor.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJobStreamTailFMonitor.java
deleted file mode 100644
index 509b538..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJobStreamTailFMonitor.java
+++ /dev/null
@@ -1,189 +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.core.runnable.command;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.eclipse.ptp.remote.core.IRemoteProcess;
-import org.eclipse.ptp.remote.core.IRemoteProcessBuilder;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerControl;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCorePlugin;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.core.utils.CoreExceptionUtils;
-import org.eclipse.ptp.rm.jaxb.core.utils.RemoteServicesDelegate;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-
-/**
- * Subclass which does tail -F on a remote file, presumably one redirected from
- * a process stream.
- * 
- * @author arossi
- * 
- */
-public class CommandJobStreamTailFMonitor extends CommandJobStreamMonitor {
-
-	private final RemoteServicesDelegate delegate;
-	private String remoteFilePath;
-	private IRemoteProcess process;
-
-	/**
-	 * Registers a remote file to monitor via tail -F.
-	 * 
-	 * @param rm
-	 *            resource manager providing remote service
-	 * @param remoteFilePath
-	 *            of the file to be monitored
-	 */
-	public CommandJobStreamTailFMonitor(IJAXBResourceManagerControl rm, String remoteFilePath) {
-		this(rm, remoteFilePath, null);
-	}
-
-	/**
-	 * Registers a remote file to monitor via tail -F.
-	 * 
-	 * @param rm
-	 *            resource manager providing remote service
-	 * @param remoteFilePath
-	 *            of the file to be monitored
-	 * @param encoding
-	 *            stream encoding or <code>null</code> for system default
-	 */
-	public CommandJobStreamTailFMonitor(IJAXBResourceManagerControl rm, String remoteFilePath, String encoding) {
-		this.remoteFilePath = remoteFilePath;
-		delegate = rm.getRemoteServicesDelegate();
-		bufferLimit = UNDEFINED;
-	}
-
-	/*
-	 * Kills the tail -F process. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.core.runnable.command.CommandJobStreamMonitor
-	 * #close()
-	 */
-	@Override
-	public synchronized void close() {
-		if (process != null) {
-			process.destroy();
-		}
-		super.close();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.core.ICommandJobStreamMonitor#initializeFilePath
-	 * (java.lang.String)
-	 */
-	@Override
-	public void initializeFilePath(String jobId) {
-		if (remoteFilePath != null) {
-			remoteFilePath = RMVariableMap.getActiveInstance().getString(jobId, remoteFilePath);
-		}
-	}
-
-	/*
-	 * An actual execution of tail -F using the remote process builder. Retries
-	 * for the inexistent file.
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.core.runnable.command.CommandJobStreamMonitor
-	 * #read()
-	 */
-	@Override
-	protected void read() {
-		if (remoteFilePath == null) {
-			JAXBCorePlugin.log(CoreExceptionUtils.getErrorStatus(Messages.CommandJobNullMonitorStreamError, null));
-			return;
-		}
-
-		String[] args = new String[] { TAIL, MINUS_F, remoteFilePath };
-
-		IRemoteProcessBuilder builder = delegate.getRemoteServices().getProcessBuilder(delegate.getRemoteConnection(), args);
-		try {
-			process = builder.start();
-		} catch (IOException t) {
-			JAXBCorePlugin.log(t);
-			return;
-		}
-
-		/*
-		 * separate thread; execute first
-		 */
-		readError(process.getErrorStream());
-		readStream(process.getInputStream(), true);
-	}
-
-	/**
-	 * Just consume the stream.
-	 * 
-	 * @param error
-	 *            stream from tail -F
-	 */
-	private void readError(final InputStream error) {
-		new Thread() {
-			@Override
-			public void run() {
-				readStream(error, false);
-			}
-		}.start();
-	}
-
-	/**
-	 * Loop until killed.
-	 * 
-	 * @param stream
-	 * @param notify
-	 *            whether to fireStreamAppended or not
-	 */
-	private void readStream(InputStream stream, boolean notify) {
-		int read = 0;
-		byte[] bytes = new byte[STREAM_BUFFER_SIZE];
-		while (!fKilled) {
-			try {
-				read = stream.read(bytes);
-				if (notify) {
-					if (read > 0) {
-						String text;
-						if (fEncoding != null) {
-							text = new String(bytes, 0, read, fEncoding);
-						} else {
-							text = new String(bytes, 0, read);
-						}
-						synchronized (this) {
-							fContents.append(text);
-							int len = fContents.length();
-							if (bufferLimit != UNDEFINED && len > bufferLimit) {
-								fContents.delete(0, len - bufferLimit);
-							}
-							fireStreamAppended(text);
-						}
-					}
-				}
-			} catch (EOFException eof) {
-				break;
-			} catch (IOException ioe) {
-				if (!fKilled) {
-					JAXBCorePlugin.log(ioe);
-				}
-				return;
-			}
-			if (read == 0 && !fKilled) {
-				try {
-					Thread.sleep(TAILF_PAUSE);
-				} catch (InterruptedException e) {
-				}
-			}
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJobStreamsProxy.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJobStreamsProxy.java
deleted file mode 100644
index ab4b69f..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/CommandJobStreamsProxy.java
+++ /dev/null
@@ -1,115 +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.core.runnable.command;
-
-import java.io.IOException;
-
-import org.eclipse.debug.core.model.IStreamMonitor;
-import org.eclipse.ptp.rm.jaxb.core.ICommandJobStreamMonitor;
-import org.eclipse.ptp.rm.jaxb.core.ICommandJobStreamsProxy;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCorePlugin;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-
-/**
- * Implementation of (@see org.eclipse.debug.core.model.IStreamsProxy, @see
- * org.eclipse.debug.core.model.IStreamsProxy2) adapted to resource manager
- * command jobs.<br>
- * <br>
- * 
- * Note that for batch submissions the stream monitors will be attached to a
- * tail -f stream rather than the stream from the actual running process.
- * 
- * @author arossi
- */
-public class CommandJobStreamsProxy implements ICommandJobStreamsProxy {
-
-	private ICommandJobStreamMonitor out;
-	private ICommandJobStreamMonitor err;
-
-	private boolean fClosed = false;
-	private boolean fStarted = false;
-
-	/**
-	 * Closes both monitors.
-	 */
-	public synchronized void close() {
-		if (!fClosed) {
-			if (out != null) {
-				out.close();
-			}
-			if (err != null) {
-				err.close();
-			}
-			fClosed = true;
-		}
-	}
-
-	/**
-	 * At present we do not allow writing to the process. May be supported in
-	 * the future.
-	 */
-	public void closeInputStream() throws IOException {
-		JAXBCorePlugin.log(new IOException(Messages.UnsupportedWriteException));
-	}
-
-	/**
-	 * @return monitor for error stream
-	 */
-	public IStreamMonitor getErrorStreamMonitor() {
-		return err;
-	}
-
-	/**
-	 * @return monitor for output stream
-	 */
-	public IStreamMonitor getOutputStreamMonitor() {
-		return out;
-	}
-
-	/**
-	 * @param err
-	 *            monitor for error stream
-	 */
-	public void setErrMonitor(ICommandJobStreamMonitor err) {
-		this.err = err;
-	}
-
-	/**
-	 * @param out
-	 *            monitor for output stream
-	 */
-	public void setOutMonitor(ICommandJobStreamMonitor out) {
-		this.out = out;
-	}
-
-	/**
-	 * Called via the call to start the stream proxy for batch submissions
-	 * (startProxy) or directly during the command for interactive.
-	 */
-	public synchronized void startMonitors() {
-		if (!fClosed && !fStarted) {
-			if (out != null) {
-				out.startMonitoring();
-			}
-			if (err != null) {
-				err.startMonitoring();
-			}
-			fStarted = true;
-		}
-	}
-
-	/**
-	 * At present we do not allow writing to the process. May be supported in
-	 * the future.
-	 */
-	public void write(String input) throws IOException {
-		JAXBCorePlugin.log(new IOException(Messages.UnsupportedWriteException));
-	}
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/ConfigurableRegexTokenizer.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/ConfigurableRegexTokenizer.java
deleted file mode 100644
index 3bf7f62..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/runnable/command/ConfigurableRegexTokenizer.java
+++ /dev/null
@@ -1,371 +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.core.runnable.command;
-
-import java.io.BufferedReader;
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.IMatchable;
-import org.eclipse.ptp.rm.jaxb.core.IStreamParserTokenizer;
-import org.eclipse.ptp.rm.jaxb.core.data.RegexType;
-import org.eclipse.ptp.rm.jaxb.core.data.TargetType;
-import org.eclipse.ptp.rm.jaxb.core.data.TokenizerType;
-import org.eclipse.ptp.rm.jaxb.core.data.impl.RegexImpl;
-import org.eclipse.ptp.rm.jaxb.core.data.impl.TargetImpl;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.core.utils.CoreExceptionUtils;
-
-/**
- * Stream tokenizer (parser) which can be attached to process streams to
- * retrieve data returned by the command execution; for instance: job id, job
- * status, or system-specific properties.<br>
- * <br>
- * The tokenizer reads from the character stream and attempts to apply regex
- * matches for a set of Property or Attribute targets; a successful match
- * triggers one or more assignment operations; at the end of the tokenization,
- * an additional set of conditional assignment actions can be run on each target
- * based on values on the target or in the resource manager environment.<br>
- * <br>
- * While the configurable tokenizer is not completely general, it has been
- * written to provide maximum flexibility within certain limits. Examples of how
- * to configure the tokenizer are provided in
- * org.eclipse.ptp.rm.jaxb.tests/data/tokenizer-examples.xml.<br>
- * <br>
- * For the two ways to segment the stream, see
- * {@link #findNextSegment(BufferedReader)}. For the two modes of reading, see
- * {@link #read(BufferedReader)}.
- * 
- * @see org.eclipse.ptp.rm.jaxb.core.data.impl.TargetImpl
- * @see org.eclipse.ptp.rm.jaxb.core.data.impl.MatchImpl
- * @see org.eclipse.ptp.rm.jaxb.core.data.impl.RegexImpl
- * @see org.eclipse.ptp.rm.jaxb.core.data.impl.AddImpl
- * @see org.eclipse.ptp.rm.jaxb.core.data.impl.AppendImpl
- * @see org.eclipse.ptp.rm.jaxb.core.data.impl.PutImpl
- * @see org.eclipse.ptp.rm.jaxb.core.data.impl.SetImpl
- * @see org.eclipse.ptp.rm.jaxb.core.data.impl.TestImpl
- * 
- * @author arossi
- * 
- */
-public class ConfigurableRegexTokenizer implements IStreamParserTokenizer, IJAXBNonNLSConstants, Runnable {
-
-	public static final String EXT_ID = "org.eclipse.ptp.rm.jaxb.configurableRegexTokenizer"; //$NON-NLS-1$
-
-	private char delim;
-	private int maxLen;
-	private Integer save;
-	private boolean all;
-	private boolean includeDelim;
-	private boolean applyToAll;
-	private List<IMatchable> toMatch;
-	private RegexImpl exitOn;
-	private RegexImpl exitAfter;
-
-	private Throwable error;
-	private InputStream in;
-
-	private char[] chars;
-	private LinkedList<String> saved;
-	private StringBuffer segment;
-
-	private boolean endOfStream;
-
-	public ConfigurableRegexTokenizer() {
-	}
-
-	/**
-	 * @param uuid
-	 *            id associated with this resource manager operation (can be
-	 *            <code>null</code>).
-	 * @param tokenizer
-	 *            JAXB data element
-	 */
-	public ConfigurableRegexTokenizer(String uuid, TokenizerType tokenizer) {
-		String d = tokenizer.getDelim();
-		if (d != null) {
-			delim = getChar(d);
-			includeDelim = tokenizer.isIncludeDelim();
-		} else {
-			delim = 0;
-			includeDelim = false;
-		}
-
-		maxLen = tokenizer.getMaxMatchLen();
-		if (maxLen != 0) {
-			chars = new char[2 * maxLen];
-		} else {
-			chars = new char[1];
-		}
-
-		save = tokenizer.getSave();
-		if (save != null) {
-			saved = new LinkedList<String>();
-		} else {
-			saved = null;
-		}
-
-		all = tokenizer.isAll();
-		applyToAll = tokenizer.isApplyToAll();
-
-		toMatch = new ArrayList<IMatchable>();
-		List<TargetType> targets = tokenizer.getTarget();
-		for (TargetType target : targets) {
-			toMatch.add(new TargetImpl(uuid, target));
-		}
-
-		RegexType reg = tokenizer.getExitOn();
-		if (reg != null) {
-			exitOn = new RegexImpl(reg);
-		}
-		reg = tokenizer.getExitAfter();
-		if (reg != null) {
-			exitAfter = new RegexImpl(reg);
-		}
-
-		segment = new StringBuffer();
-	}
-
-	/**
-	 * @return error generated during thread execution
-	 */
-	public Throwable getInternalError() {
-		return error;
-	}
-
-	/**
-	 * Calls {@link #read(BufferedReader)}.
-	 */
-	public void run() {
-		BufferedReader br = null;
-		try {
-			br = new BufferedReader(new InputStreamReader(in));
-			read(br);
-		} catch (Throwable t) {
-			error = t;
-			/*
-			 * we do not close the out here because it probably is a standard
-			 * stream
-			 */
-		}
-	}
-
-	/**
-	 * @param stream
-	 *            from process
-	 */
-	public void setInputStream(InputStream stream) {
-		in = stream;
-	}
-
-	/**
-	 * A regular expression can be provided for an exit condition (either on the
-	 * match or after parsing and processing the segment containing the match).
-	 * 
-	 * @param regex
-	 *            defining the pattern which when encountered should trigger an
-	 *            exit from the tokenizer
-	 * @return true if the pattern has been encountered
-	 */
-	private boolean checkExit(RegexImpl regex) {
-		if (regex != null) {
-			if (null != regex.getMatched(segment.toString())) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * There are two ways of segmenting the stream. The first is to provide a
-	 * single-character delimiter (most commonly the line break); the second is
-	 * to define a buffer size. In the latter case, one needs to be assured that
-	 * the expansion of any regex pattern being sought on the stream cannot
-	 * exceed that buffer size, else the match will be lost.
-	 * 
-	 * @param in
-	 *            the reader for the stream
-	 * @throws CoreException
-	 */
-	private void findNextSegment(BufferedReader in) throws CoreException {
-		endOfStream = false;
-		int len = chars.length == 1 ? 1 : chars.length - segment.length();
-		while (true) {
-			int read = 0;
-			try {
-				read = in.read(chars, 0, len);
-				if (read == EOF) {
-					endOfStream = true;
-					break;
-				}
-			} catch (EOFException eof) {
-				endOfStream = true;
-				break;
-			} catch (IOException t) {
-				throw CoreExceptionUtils.newException(Messages.ReadSegmentError, t);
-			}
-
-			if (chars.length == 1) {
-				if (chars[0] == delim) {
-					if (includeDelim) {
-						segment.append(delim);
-					}
-					break;
-				}
-				segment.append(chars[0]);
-			} else {
-				segment.append(chars, 0, read);
-				break;
-			}
-		}
-	}
-
-	/**
-	 * Applies the matches contained in each target to the target. If a matched
-	 * target is also selected by one of its matches, that target is promoted to
-	 * the head of the list of targets.
-	 * 
-	 * @throws Throwable
-	 */
-	private void matchTargets() throws Throwable {
-		IMatchable selected = null;
-		for (IMatchable m : toMatch) {
-			if (m.doMatch(segment) && !applyToAll) {
-				if (m.isSelected()) {
-					selected = m;
-				}
-				break;
-			}
-		}
-
-		if (selected != null) {
-			for (Iterator<IMatchable> i = toMatch.iterator(); i.hasNext();) {
-				IMatchable m = i.next();
-				m.setSelected(false);
-				if (m == selected) {
-					i.remove();
-				}
-			}
-			toMatch.add(0, selected);
-		}
-	}
-
-	/**
-	 * Runs merge and tests on each of the targets.
-	 * 
-	 * @throws Throwable
-	 */
-	private void postProcessTargets() throws Throwable {
-		for (IMatchable m : toMatch) {
-			m.postProcess();
-		}
-	}
-
-	/**
-	 * There are two modes of reading. The default is simply forward, a segment
-	 * at a time. If <code>all</code> is set to true, however, the read
-	 * operation will not apply the matches until it has consumed the entire
-	 * stream. In this case one needs to define a <code>save</code> buffer
-	 * (number of segments). The buffer is cycled so that what is left are the
-	 * last N segments read. These are then applied to the targets one at a
-	 * time.
-	 * 
-	 * @param in
-	 *            the input stream reader
-	 * @throws Throwable
-	 */
-	private void read(BufferedReader in) throws Throwable {
-		boolean exit = false;
-
-		while (!exit) {
-			findNextSegment(in);
-
-			if (checkExit(exitOn)) {
-				break;
-			}
-
-			if (checkExit(exitAfter)) {
-				exit = true;
-			}
-
-			if (all) {
-				if (save != null) {
-					if (segment.length() > 0) {
-						while (saved.size() >= save) {
-							saved.removeFirst();
-						}
-						saved.addLast(segment.toString());
-					}
-					reset();
-				}
-
-				if (endOfStream) {
-					break;
-				}
-
-				continue;
-			}
-
-			matchTargets();
-			reset();
-
-			if (endOfStream) {
-				break;
-			}
-		}
-
-		if (all) {
-			while (!saved.isEmpty()) {
-				segment.append(saved.removeFirst());
-				matchTargets();
-				reset();
-			}
-		}
-
-		postProcessTargets();
-	}
-
-	/**
-	 * Adjusts the buffer. If the read is delimited, the buffer is cleared. Else
-	 * the end of the buffer (with capacity 2X the maximum length indicated by
-	 * the configuration) is shifted forward so that then next
-	 * <code>maxLen</code> characters can be read.
-	 */
-	private void reset() {
-		if (chars.length == 1) {
-			this.segment.setLength(0);
-		} else if (segment.length() == chars.length) {
-			segment.delete(0, maxLen);
-		}
-	}
-
-	/**
-	 * Compensation for escaping.
-	 * 
-	 * @param delim
-	 * @return the non-escaped char
-	 */
-	private static char getChar(String delim) {
-		if (delim.indexOf(RTESC) >= 0 || delim.indexOf(LNESC) >= 0) {
-			return LINE_SEP.charAt(0);
-		} else if (delim.indexOf(TBESC) >= 0) {
-			return TAB.charAt(0);
-		}
-		return delim.charAt(0);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/CoreExceptionUtils.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/CoreExceptionUtils.java
deleted file mode 100644
index 5df1af7..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/CoreExceptionUtils.java
+++ /dev/null
@@ -1,47 +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.core.utils;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCorePlugin;
-
-/**
- * Convenience methods for handling CoreExceptions and Status.ERROR.
- * 
- * @author arossi
- */
-public class CoreExceptionUtils {
-
-	private CoreExceptionUtils() {
-	}
-
-	/**
-	 * @param message
-	 * @param t
-	 * @return error status object
-	 */
-	public static IStatus getErrorStatus(String message, Throwable t) {
-		if (t != null) {
-			JAXBCorePlugin.log(t);
-		}
-		return new Status(Status.ERROR, JAXBCorePlugin.getUniqueIdentifier(), Status.ERROR, message, t);
-	}
-
-	/**
-	 * @param message
-	 * @param t
-	 * @return exception
-	 */
-	public static CoreException newException(String message, Throwable t) {
-		return new CoreException(getErrorStatus(message, t));
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/EnvironmentVariableUtils.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/EnvironmentVariableUtils.java
deleted file mode 100644
index a3830fe..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/EnvironmentVariableUtils.java
+++ /dev/null
@@ -1,159 +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.core.utils;
-
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.data.AttributeType;
-import org.eclipse.ptp.rm.jaxb.core.data.NameValuePairType;
-import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-
-/**
- * Convenience methods for handling name-value pair objects (the JAXB
- * NameValuePair).
- * 
- * @author arossi
- * 
- */
-public class EnvironmentVariableUtils implements IJAXBNonNLSConstants {
-
-	private EnvironmentVariableUtils() {
-	}
-
-	/**
-	 * Add variable to env after resolving against the resource-manager
-	 * environment (used by the CommandJob).
-	 * 
-	 * @param uuid
-	 *            an internal or resource-specific job id.
-	 * @param var
-	 *            name-value pair
-	 * @param env
-	 *            the environment map to which to add the pair
-	 * @param map
-	 *            resource manager active environment map
-	 */
-	public static void addVariable(String uuid, NameValuePairType var, Map<String, String> env, RMVariableMap map) {
-		String key = var.getName();
-		String value = getValue(uuid, key, map);
-		if (value != null && !ZEROSTR.equals(value)) {
-			env.put(var.getName(), value);
-		}
-	}
-
-	/**
-	 * Add variable to buffer after resolving against the resource-manager
-	 * environment (used by the ScriptHandler).
-	 * 
-	 * @param name
-	 *            name of variable
-	 * @param value
-	 *            value of variable
-	 * @param directive
-	 *            first line of shell script
-	 * @param buffer
-	 *            running contents of the script being generated
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.core.runnable.ScriptHandler#composeScript(IProgressMonitor)
-	 */
-	public static void addVariable(String name, String value, String directive, StringBuffer buffer) {
-		if (value != null && !ZEROSTR.equals(value)) {
-			if (SETENV.equals(getSyntax(directive))) {
-				setenv(name, value, buffer);
-			} else if (EXPORT.equals(getSyntax(directive))) {
-				export(name, value, buffer);
-			}
-		}
-	}
-
-	/**
-	 * For debugging purposes.
-	 * 
-	 * @param map
-	 * @return string of n=v lines
-	 */
-	public static String toString(RMVariableMap map) {
-		StringBuffer b = new StringBuffer();
-		for (Object o : map.getVariables().values()) {
-			if (o instanceof PropertyType) {
-				PropertyType p = (PropertyType) o;
-				b.append(p.getName()).append(EQ).append(p.getValue()).append(LINE_SEP);
-			} else if (o instanceof AttributeType) {
-				AttributeType a = (AttributeType) o;
-				b.append(a.getName()).append(EQ).append(a.getValue()).append(LINE_SEP);
-			}
-		}
-
-		return b.toString();
-	}
-
-	/**
-	 * Construct the bash-shell export command.
-	 * 
-	 * @param name
-	 *            of variable
-	 * @param value
-	 *            of variable
-	 * @param buffer
-	 *            running contents of the script being generated
-	 */
-	private static void export(String name, String value, StringBuffer buffer) {
-		buffer.append(EXPORT).append(SP).append(name).append(EQ).append(QT).append(value).append(QT).append(REMOTE_LINE_SEP);
-	}
-
-	/**
-	 * Determines what syntax to use for script environment variable definition
-	 * based on the first line of the script.
-	 * 
-	 * @param directive
-	 *            first line of shell script
-	 * @return syntax type.
-	 */
-	private static String getSyntax(String directive) {
-		if (directive.indexOf(CSH) >= 0) {
-			return SETENV;
-		}
-		return EXPORT;
-	}
-
-	/**
-	 * Convert the simple variable name to a resource-manager map resolver
-	 * reference, and resolve.
-	 * 
-	 * @param uuid
-	 *            an internal or resource-specific job id.
-	 * @param key
-	 *            the variable name
-	 * @param map
-	 *            resource manager active environment map
-	 * @return the resolved value
-	 */
-	private static String getValue(String uuid, String key, RMVariableMap map) {
-		String name = OPENVRM + key + CLOSVAL;
-		return map.getString(uuid, name);
-	}
-
-	/**
-	 * Construct the c-shell setenv command.
-	 * 
-	 * @param name
-	 *            of variable
-	 * @param value
-	 *            of variable
-	 * @param buffer
-	 *            running contents of the script being generated
-	 */
-	private static void setenv(String name, String value, StringBuffer buffer) {
-		buffer.append(SETENV).append(SP).append(name).append(SP).append(QT).append(value).append(QT).append(REMOTE_LINE_SEP);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/FileUtils.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/FileUtils.java
deleted file mode 100644
index 350542f..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/FileUtils.java
+++ /dev/null
@@ -1,157 +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.core.utils;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.EOFException;
-import java.io.IOException;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.ptp.remote.core.IRemoteFileManager;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCorePlugin;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-
-/**
- * Convenience utilities associated with remote file operations.
- * 
- * @see org.eclipse.ptp.remote.core.IRemoteFileManager
- * @see org.eclipse.core.filesystem.IFileStore
- * 
- * @author arossi
- * 
- */
-public class FileUtils implements IJAXBNonNLSConstants {
-
-	/**
-	 * @param from
-	 *            manager for source resource
-	 * @param source
-	 *            file to copy
-	 * @param to
-	 *            manager for target resource
-	 * @param target
-	 *            destination file
-	 * @param progress
-	 * @throws CoreException
-	 */
-	public static void copy(IRemoteFileManager from, String source, IRemoteFileManager to, String target, SubMonitor progress)
-			throws CoreException {
-		if (from == null) {
-			throw CoreExceptionUtils.newException(Messages.Copy_Operation_NullSourceFileManager, null);
-		}
-		if (to == null) {
-			throw CoreExceptionUtils.newException(Messages.Copy_Operation_NullTargetFileManager, null);
-		}
-		if (source == null) {
-			throw CoreExceptionUtils.newException(Messages.Copy_Operation_NullSource, null);
-		}
-		if (target == null) {
-			throw CoreExceptionUtils.newException(Messages.Copy_Operation_NullTarget, null);
-		}
-
-		IFileStore lres = from.getResource(source);
-		if (!lres.fetchInfo(EFS.NONE, progress.newChild(5)).exists()) {
-			throw CoreExceptionUtils.newException(Messages.Copy_Operation_Local_resource_does_not_exist + CO + SP + lres.getName(),
-					null);
-		}
-		IFileStore rres = to.getResource(target);
-		lres.copy(rres, EFS.OVERWRITE, progress.newChild(5));
-	}
-
-	/**
-	 * @param manager
-	 *            for resource where file is located
-	 * @param path
-	 *            of file
-	 * @param progress
-	 * @return contents of file
-	 * @throws CoreException
-	 */
-	public static String read(IRemoteFileManager manager, String path, SubMonitor progress) throws CoreException {
-		if (manager == null) {
-			throw CoreExceptionUtils.newException(Messages.Read_Operation_NullSourceFileManager, null);
-		}
-		if (path == null) {
-			throw CoreExceptionUtils.newException(Messages.Read_Operation_NullPath, null);
-		}
-
-		IFileStore lres = manager.getResource(path);
-		BufferedInputStream is = new BufferedInputStream(lres.openInputStream(EFS.NONE, progress));
-		StringBuffer sb = new StringBuffer();
-		byte[] buffer = new byte[COPY_BUFFER_SIZE];
-		int rcvd = 0;
-
-		try {
-			while (true) {
-				try {
-					rcvd = is.read(buffer, 0, COPY_BUFFER_SIZE);
-				} catch (EOFException eof) {
-					break;
-				}
-
-				if (rcvd == UNDEFINED) {
-					break;
-				}
-				sb.append(new String(buffer, 0, rcvd));
-			}
-		} catch (IOException ioe) {
-			throw CoreExceptionUtils.newException(Messages.Read_OperationFailed + path, null);
-		} finally {
-			try {
-				is.close();
-			} catch (IOException ioe) {
-				JAXBCorePlugin.log(ioe);
-			}
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * @param manager
-	 *            for resource where file is to be written
-	 * @param path
-	 *            of file to write
-	 * @param contents
-	 *            to write to file
-	 * @param progress
-	 * @throws CoreException
-	 */
-	public static void write(IRemoteFileManager manager, String path, String contents, SubMonitor progress) throws CoreException {
-		if (contents == null) {
-			return;
-		}
-		if (manager == null) {
-			throw CoreExceptionUtils.newException(Messages.Write_Operation_NullSourceFileManager, null);
-		}
-		if (path == null) {
-			throw CoreExceptionUtils.newException(Messages.Write_Operation_NullPath, null);
-		}
-
-		IFileStore lres = manager.getResource(path);
-		BufferedOutputStream os = new BufferedOutputStream(lres.openOutputStream(EFS.NONE, progress));
-		try {
-			os.write(contents.getBytes());
-			os.flush();
-		} catch (IOException ioe) {
-			throw CoreExceptionUtils.newException(Messages.Write_OperationFailed + path, ioe);
-		} finally {
-			try {
-				os.close();
-			} catch (IOException ioe) {
-				JAXBCorePlugin.log(ioe);
-			}
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/JAXBInitializationUtils.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/JAXBInitializationUtils.java
deleted file mode 100644
index 09ad12d..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/JAXBInitializationUtils.java
+++ /dev/null
@@ -1,161 +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.core.utils;
-
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import javax.xml.validation.Validator;
-
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCorePlugin;
-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.PropertyType;
-import org.eclipse.ptp.rm.jaxb.core.data.ResourceManagerData;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-import org.xml.sax.SAXException;
-
-/**
- * Convenience methods for validating and unmarshaling XML using JAXB.
- * 
- * @author arossi
- * 
- */
-public class JAXBInitializationUtils implements IJAXBNonNLSConstants {
-
-	private JAXBInitializationUtils() {
-	}
-
-	/**
-	 * Retrieves Property and Attribute definitions from the data tree and adds
-	 * them to the environment map.
-	 * 
-	 * @param rmData
-	 *            the JAXB data tree
-	 * @param instance
-	 *            the active instance of the resource manager environment map
-	 */
-	public static void initializeMap(ResourceManagerData rmData, RMVariableMap instance) {
-		ControlType control = rmData.getControlData();
-		instance.clear();
-		Map<String, Object> env = instance.getVariables();
-		addProperties(env, control);
-		addAttributes(env, control);
-		instance.setInitialized(true);
-	}
-
-	/**
-	 * Delegates to {@link #unmarshalResourceManagerData(URL)}
-	 * 
-	 * @param xml
-	 *            location of the configuration file.
-	 * @return the constructed data tree
-	 * @throws IOException
-	 * @throws SAXException
-	 * @throws URISyntaxException
-	 * @throws JAXBException
-	 */
-	public static ResourceManagerData initializeRMData(URL xml) throws IOException, SAXException, URISyntaxException, JAXBException {
-		return unmarshalResourceManagerData(xml);
-	}
-
-	/**
-	 * Validates the XML against the internal XSD for JAXB resource managers.
-	 * 
-	 * @param instance
-	 *            location of the configuration file.
-	 * @throws SAXException
-	 *             if invalid
-	 * @throws IOException
-	 * @throws URISyntaxException
-	 */
-	public static void validate(URL instance) throws SAXException, IOException, URISyntaxException {
-		URL xsd = JAXBCorePlugin.getResource(RM_XSD);
-		SchemaFactory factory = SchemaFactory.newInstance(XMLSchema);
-		Schema schema = factory.newSchema(xsd);
-		Validator validator = schema.newValidator();
-		Source source = new StreamSource(instance.openStream());
-		validator.validate(source);
-	}
-
-	/**
-	 * Adds the attributes. If the attribute value is <code>null</code>,
-	 * overwrites it with the default.
-	 * 
-	 * @param env
-	 *            the active instance of the resource manager environment map
-	 * @param control
-	 *            JAXB data subtree for control part of resource manager
-	 */
-	private static void addAttributes(Map<String, Object> env, ControlType control) {
-		List<AttributeType> jobAttributes = control.getAttribute();
-		for (AttributeType jobAttribute : jobAttributes) {
-			env.put(jobAttribute.getName(), jobAttribute);
-			if (jobAttribute.getValue() == null) {
-				jobAttribute.setValue(jobAttribute.getDefault());
-			}
-		}
-	}
-
-	/**
-	 * Adds the properties. If the property value is <code>null</code>,
-	 * overwrites it with the default.
-	 * 
-	 * @param env
-	 *            the active instance of the resource manager environment map
-	 * @param control
-	 *            JAXB data subtree for control part of resource manager
-	 */
-	private static void addProperties(Map<String, Object> env, ControlType control) {
-		List<PropertyType> properties = control.getProperty();
-		for (PropertyType property : properties) {
-			env.put(property.getName(), property);
-			if (property.getValue() == null) {
-				property.setValue(property.getDefault());
-			}
-		}
-	}
-
-	/**
-	 * First validates the xml, then gets the JAXB context and calls the JAXB
-	 * unmarshaller from it.
-	 * 
-	 * @param xml
-	 *            location of the configuration file.
-	 * @return the constructed data tree
-	 * @throws JAXBException
-	 *             problem encountered during unmarshaling
-	 * @throws IOException
-	 * @throws SAXException
-	 *             validation error
-	 * @throws URISyntaxException
-	 */
-	private static ResourceManagerData unmarshalResourceManagerData(URL xml) throws JAXBException, IOException, SAXException,
-			URISyntaxException {
-		validate(xml);
-		JAXBContext jc = JAXBContext.newInstance(JAXB_CONTEXT, JAXBInitializationUtils.class.getClassLoader());
-		Unmarshaller u = jc.createUnmarshaller();
-		JAXBElement<?> o = (JAXBElement<?>) u.unmarshal(xml.openStream());
-		ResourceManagerData rmdata = (ResourceManagerData) o.getValue();
-		return rmdata;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/RemoteServicesDelegate.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/RemoteServicesDelegate.java
deleted file mode 100644
index 51ec1c0..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/utils/RemoteServicesDelegate.java
+++ /dev/null
@@ -1,124 +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.core.utils;
-
-import java.net.URI;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.IRemoteConnectionManager;
-import org.eclipse.ptp.remote.core.IRemoteFileManager;
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-
-/**
- * A wrapper for holding initialized remote services information.
- * 
- * @author arossi
- * 
- */
-public class RemoteServicesDelegate implements IJAXBNonNLSConstants {
-	private final IRemoteServices remoteServices;
-	private final IRemoteServices localServices;
-	private final IRemoteConnectionManager remoteConnectionManager;
-	private final IRemoteConnectionManager localConnectionManager;
-	private final IRemoteConnection remoteConnection;
-	private final IRemoteConnection localConnection;
-	private final IRemoteFileManager remoteFileManager;
-	private final IRemoteFileManager localFileManager;
-	private final URI localHome;
-	private final URI remoteHome;
-
-	/**
-	 * On the basis of the passed in identifiers, constructs the local and
-	 * remote services, connection manager, connection, file manager and home
-	 * URIs.
-	 * 
-	 * @param remoteServicesId
-	 *            e.g., "local", "remotetools", "rse"
-	 * @param remoteConnectionName
-	 *            e.g., "ember.ncsa.illinois.edu"
-	 */
-	public RemoteServicesDelegate(String remoteServicesId, String remoteConnectionName) {
-		localServices = PTPRemoteCorePlugin.getDefault().getDefaultServices();
-		assert (localServices != null);
-		localConnectionManager = localServices.getConnectionManager();
-		assert (localConnectionManager != null);
-		/*
-		 * Since it's a local service, it doesn't matter which parameter is
-		 * passed
-		 */
-		localConnection = localConnectionManager.getConnection(ZEROSTR);
-		assert (localConnection != null);
-		localFileManager = localServices.getFileManager(localConnection);
-		assert (localFileManager != null);
-
-		if (remoteServicesId != null) {
-			remoteServices = PTPRemoteCorePlugin.getDefault().getRemoteServices(remoteServicesId, new NullProgressMonitor());
-			assert (null != remoteServices);
-			remoteConnectionManager = remoteServices.getConnectionManager();
-			assert (null != remoteConnectionManager);
-			remoteConnection = remoteConnectionManager.getConnection(remoteConnectionName);
-			assert (null != remoteConnection);
-			remoteFileManager = remoteServices.getFileManager(remoteConnection);
-			assert (null != remoteFileManager);
-		} else {
-			remoteServices = localServices;
-			remoteConnectionManager = localConnectionManager;
-			remoteConnection = localConnection;
-			remoteFileManager = localFileManager;
-		}
-
-		localHome = localFileManager.toURI(localConnection.getWorkingDirectory());
-		remoteHome = remoteFileManager.toURI(remoteConnection.getWorkingDirectory());
-	}
-
-	public IRemoteConnection getLocalConnection() {
-		return localConnection;
-	}
-
-	public IRemoteConnectionManager getLocalConnectionManager() {
-		return localConnectionManager;
-	}
-
-	public IRemoteFileManager getLocalFileManager() {
-		return localFileManager;
-	}
-
-	public URI getLocalHome() {
-		return localHome;
-	}
-
-	public IRemoteServices getLocalServices() {
-		return localServices;
-	}
-
-	public IRemoteConnection getRemoteConnection() {
-		return remoteConnection;
-	}
-
-	public IRemoteConnectionManager getRemoteConnectionManager() {
-		return remoteConnectionManager;
-	}
-
-	public IRemoteFileManager getRemoteFileManager() {
-		return remoteFileManager;
-	}
-
-	public URI getRemoteHome() {
-		return remoteHome;
-	}
-
-	public IRemoteServices getRemoteServices() {
-		return remoteServices;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/variables/LCVariableMap.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/variables/LCVariableMap.java
deleted file mode 100644
index c12ba14..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/variables/LCVariableMap.java
+++ /dev/null
@@ -1,343 +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.core.variables;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.ptp.core.IPTPLaunchConfigurationConstants;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.IVariableMap;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCorePlugin;
-import org.eclipse.ptp.rm.jaxb.core.data.AttributeType;
-import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-
-/**
- * A wrapper for the LaunchConfiguration accessed through the IVariableMap
- * interface.<br>
- * <br>
- * Note that this map is <b>not</b> tightly coupled to a given launch
- * configuration instance. When the map is flushed to the configuration, its
- * internal map simply replaces the attribute map on the configuration working
- * copy. <br>
- * <br>
- * Unlike the RMVariableMap, the internal map here is largely flat in the sense
- * that it holds only name-value primitive wrappers or strings instead of the
- * Property or Attribute objects (an exception is the "environment" Map passed
- * in to the configuration by the Environment Tab).<br>
- * <br>
- * When this map is loaded from its RMVariableMap parent (see
- * {@link #loadValues(RMVariableMap)}), the full set of Properties and
- * Attributes are maintained in a global map, which remains unaltered; a second,
- * volatile map can be swapped in and out by the caller (usually subsets of the
- * global map based on the specific tab doing the calling).<br>
- * <br>
- * This object also maintains the default values defined from the parent in a
- * separate map. Finally, it also searches for and parses into an index the
- * currently checked values (from checkbox tables or trees). This index is used
- * when determining whether to null out the current value of a Property or
- * Attribute in the current (non-global) variable map.
- * 
- * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy
- * @see org.eclipse.ptp.rm.jaxb.core.IVariableMap
- * @see org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap
- * 
- * @author arossi
- */
-public class LCVariableMap implements IVariableMap, IJAXBNonNLSConstants {
-
-	private static LCVariableMap active;
-
-	private Map<String, Object> globalValues;
-	private Map<String, Object> values;
-	private final Map<String, String> defaultValues;
-	private final boolean initialized;
-
-	private LCVariableMap() {
-		this.values = Collections.synchronizedMap(new TreeMap<String, Object>());
-		this.defaultValues = Collections.synchronizedMap(new TreeMap<String, String>());
-		this.initialized = false;
-	}
-
-	/**
-	 * @param name
-	 *            of widget, bound to a Property or Attribute
-	 * @return value of the Property or Attribute, or <code>null</code> if none
-	 */
-	public Object get(String name) {
-		return values.get(name);
-	}
-
-	/**
-	 * @param viewerName
-	 *            of viewer for which to find checked rows
-	 * @return map of checked row model names
-	 */
-	public Map<String, String> getChecked(String viewerName) {
-		Map<String, String> m = new HashMap<String, String>();
-		String checked = (String) values.get(CHECKED_ATTRIBUTES + viewerName);
-		if (checked != null) {
-			String[] split = checked.split(SP);
-			for (String s : split) {
-				m.put(s, s);
-			}
-		}
-		return m;
-	}
-
-	/**
-	 * @param name
-	 *            of widget, bound to a Property or Attribute
-	 * @return default value of the Property or Attribute, or <code>null</code>
-	 *         if none
-	 */
-	public String getDefault(String name) {
-		return defaultValues.get(name);
-	}
-
-	/**
-	 * The ${rm: prefix points to the RMVariableResolver, ${lc: to the
-	 * LCVariableResolver, so we substitute the latter and pass off the
-	 * substitution to the resolver for resolution.
-	 * 
-	 * @param value
-	 *            expression to be resolved
-	 * @return resolved expression
-	 */
-	public String getString(String value) {
-		try {
-			value = value.replaceAll(VRM, VLC);
-			return dereference(value);
-		} catch (CoreException t) {
-			JAXBCorePlugin.log(t);
-		}
-		return value;
-	}
-
-	/**
-	 * Interface method. Only called by {@link #getString(String)}.
-	 * 
-	 * @param jobId
-	 *            is irrelevant
-	 * @param value
-	 *            expression to be resolved
-	 * @return resolved expression
-	 */
-	public String getString(String jobId, String value) {
-		return getString(value);
-	}
-
-	/**
-	 * @return whether the internal maps have been loaded
-	 */
-	public boolean isInitialized() {
-		return initialized;
-	}
-
-	/**
-	 * @param name
-	 *            of widget, bound to a Property or Attribute
-	 * @param value
-	 *            of Property or Attribute
-	 */
-	public void put(String name, Object value) {
-		values.put(name, value);
-	}
-
-	/**
-	 * 
-	 * @param name
-	 *            of widget, bound to a Property or Attribute
-	 * @return value of Property or Attribute
-	 */
-	public Object remove(String name) {
-		return values.remove(name);
-	}
-
-	/**
-	 * Exchange the current volatile map for the one passed in.
-	 * 
-	 * @param newV
-	 *            map to replace current
-	 * @return current map
-	 * @throws CoreException
-	 */
-	public Map<String, Object> swapVariables(Map<String, Object> newV) throws CoreException {
-		Map<String, Object> oldV = values;
-		values = newV;
-		return oldV;
-	}
-
-	/**
-	 * Set the volatile map to the original global map, but first update the
-	 * latter with the most recent values from the configuration.
-	 * 
-	 * @throws CoreException
-	 */
-	@SuppressWarnings("rawtypes")
-	public void updateGlobal(ILaunchConfiguration configuration) throws CoreException {
-		Map attr = configuration.getAttributes();
-		for (Object k : attr.keySet()) {
-			Object val = attr.get(k);
-			if (val != null) {
-				globalValues.put((String) k, attr.get(k));
-			}
-		}
-		values = globalValues;
-	}
-
-	/**
-	 * Replace the attribute map on the configuration with the current
-	 * (volatile) map.
-	 * 
-	 * @param configuration
-	 *            working copy of Launch Tab's current configuration
-	 * @throws CoreException
-	 */
-	public void writeToConfiguration(ILaunchConfigurationWorkingCopy configuration) throws CoreException {
-		configuration.setAttributes(values);
-	}
-
-	/**
-	 * Calls the string substitution method on the variable manager.
-	 * 
-	 * @param expression
-	 *            to be resolved (recursively dereferenced from the map).
-	 * @return the resolved expression
-	 * @throws CoreException
-	 */
-	private String dereference(String expression) throws CoreException {
-		if (expression == null) {
-			return null;
-		}
-		return VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(expression);
-	}
-
-	/**
-	 * Initialize this map from the resource manager environment instance.
-	 * 
-	 * @param rmVars
-	 *            resource manager environment map
-	 * @throws Throwable
-	 */
-	private void loadValues(RMVariableMap rmVars) throws Throwable {
-		for (String s : rmVars.getVariables().keySet()) {
-			loadValues(s, rmVars.getVariables().get(s));
-		}
-		for (String s : rmVars.getDiscovered().keySet()) {
-			loadValues(s, rmVars.getDiscovered().get(s));
-		}
-		globalValues = values;
-		/*
-		 * this map will be set from the tab's local map
-		 */
-		values = null;
-	}
-
-	/**
-	 * If the value of the Property or Attribute is <code>null</code> and it has
-	 * a defined default, the value is set to the default.
-	 * 
-	 * @param key
-	 *            from the original RMVariableMap
-	 * @param value
-	 *            the Property or Attribute
-	 * @throws Throwable
-	 */
-	private void loadValues(String key, Object value) throws Throwable {
-		String name = null;
-		String defVal = null;
-		String strVal = null;
-		Object o = null;
-		if (value instanceof PropertyType) {
-			PropertyType p = (PropertyType) value;
-			name = p.getName();
-			defVal = p.getDefault();
-			o = p.getValue();
-		} else if (value instanceof AttributeType) {
-			AttributeType ja = (AttributeType) value;
-			name = ja.getName();
-			defVal = ja.getDefault();
-			o = ja.getValue();
-			String status = ja.getStatus();
-			put(name + PD + STATUS, status);
-		} else {
-			throw new ArrayStoreException(Messages.IllegalVariableValueType + value.getClass());
-		}
-		defaultValues.put(name, defVal);
-		if (o != null) {
-			strVal = String.valueOf(o);
-		}
-		if (strVal == null) {
-			strVal = defVal;
-		}
-		put(name, strVal);
-	}
-
-	/**
-	 * Creates an instance to be associated with a given Launch Tab.
-	 * 
-	 * @param rmVars
-	 *            environement map for the associated resource manager
-	 * @return the LaunchTab environment map
-	 * @throws Throwable
-	 */
-	public static LCVariableMap createInstance(RMVariableMap rmVars) throws Throwable {
-		LCVariableMap lcMap = new LCVariableMap();
-		lcMap.loadValues(rmVars);
-		return lcMap;
-	}
-
-	/**
-	 * @return the currently active map
-	 */
-	public synchronized static LCVariableMap getActiveInstance() {
-		return active;
-	}
-
-	/**
-	 * Ensures that non-JAXB-spacific attributes remain in the configuration
-	 * during replace/refresh.
-	 * 
-	 * @param configuration
-	 *            current launch settings
-	 * @return map of org.eclipse.debug and org.eclipse.ptp attributes
-	 * @throws CoreException
-	 */
-	public static Map<String, Object> getStandardConfigurationProperties(ILaunchConfiguration configuration) throws CoreException {
-		Map<String, Object> standard = new TreeMap<String, Object>();
-		Map<?, ?> attributes = configuration.getAttributes();
-		for (Object o : attributes.keySet()) {
-			String key = (String) o;
-			if (key.startsWith(DEBUG_PACKAGE) || key.startsWith(PTP_PACKAGE)) {
-				standard.put(key, attributes.get(key));
-			}
-		}
-		standard.put(DIRECTORY, configuration.getAttribute(IPTPLaunchConfigurationConstants.ATTR_WORKING_DIR, ZEROSTR));
-		standard.put(EXEC_PATH, configuration.getAttribute(IPTPLaunchConfigurationConstants.ATTR_EXECUTABLE_PATH, ZEROSTR));
-		standard.put(PROG_ARGS, configuration.getAttribute(IPTPLaunchConfigurationConstants.ATTR_ARGUMENTS, ZEROSTR));
-		return standard;
-	}
-
-	/**
-	 * @param instance
-	 *            to be exported as the currently active map
-	 */
-	public synchronized static void setActiveInstance(LCVariableMap instance) {
-		active = instance;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/variables/LCVariableResolver.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/variables/LCVariableResolver.java
deleted file mode 100644
index 7ca63bd..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/variables/LCVariableResolver.java
+++ /dev/null
@@ -1,47 +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.core.variables;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.variables.IDynamicVariable;
-import org.eclipse.core.variables.IDynamicVariableResolver;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-
-/**
- * Resolver for the LCVariableMap (tag: ${lc:).
- * 
- * @author arossi
- * 
- */
-public class LCVariableResolver implements IDynamicVariableResolver, IJAXBNonNLSConstants {
-
-	/**
-	 * Only looks the the first element of the reference. This is because
-	 * ${rm:name#field} gets replace to become ${lc:name#field}, but the LC map
-	 * itself is flattened from the RC name=Attribute or name=Property to
-	 * name=primitive value.
-	 */
-	public String resolveValue(IDynamicVariable variable, String argument) throws CoreException {
-		LCVariableMap m = LCVariableMap.getActiveInstance();
-		if (m != null) {
-			String[] split = argument.split(PDRX);
-			if (split.length > 1) {
-				if (split[1].equals(VALUE)) {
-					argument = split[0];
-				}
-			}
-			Object value = m.get(argument);
-			if (value != null) {
-				return String.valueOf(value);
-			}
-		}
-		return ZEROSTR;
-	}
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/variables/RMVariableMap.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/variables/RMVariableMap.java
deleted file mode 100644
index 8cc0570..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/variables/RMVariableMap.java
+++ /dev/null
@@ -1,257 +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.core.variables;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.IVariableMap;
-import org.eclipse.ptp.rm.jaxb.core.JAXBCorePlugin;
-import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;
-
-/**
- * Abstraction representing all the Property and Attribute definitions
- * associated with a resource manager configuration. This provides an
- * "environment" for dereferencing the resource manager configuration, such that
- * the values of its Properties and Attributes can reference other Properties
- * and Attributes.<br>
- * <br>
- * 
- * There are two submaps: one contains all the Properties and Attributes defined
- * in the XML configuration; a separate map contains all the Properties and
- * Attributes which are "discovered" at runtime (through tokenization of command
- * output).
- * 
- * @author arossi
- * 
- */
-public class RMVariableMap implements IVariableMap, IJAXBNonNLSConstants {
-	private static RMVariableMap active;
-
-	private final Map<String, Object> variables;
-	private final Map<String, Object> discovered;
-	private boolean initialized;
-
-	private RMVariableMap() {
-		variables = Collections.synchronizedMap(new TreeMap<String, Object>());
-		discovered = Collections.synchronizedMap(new TreeMap<String, Object>());
-		initialized = false;
-	}
-
-	/**
-	 * Reset the internal maps.
-	 */
-	public void clear() {
-		variables.clear();
-		discovered.clear();
-		initialized = false;
-	}
-
-	/**
-	 * Search the two maps for this reference. The predefined variables are
-	 * searched first.
-	 * 
-	 * @param name
-	 *            of Property or Attribute to find.
-	 * @return the found Property or Attribute
-	 */
-	public Object get(String name) {
-		Object o = variables.get(name);
-		if (o == null) {
-			o = discovered.get(name);
-		}
-		return o;
-	}
-
-	/**
-	 * @return map of Properties and Attributes discovered at runtime.
-	 */
-	public Map<String, Object> getDiscovered() {
-		return discovered;
-	}
-
-	/**
-	 * Delegates to {@link #getString(String)}.
-	 * 
-	 * @param value
-	 *            expression to resolve
-	 * @return resolved expression
-	 */
-	public String getString(String value) {
-		return getString(null, value);
-	}
-
-	/**
-	 * Performs the substitution on the string.
-	 * 
-	 * @param value
-	 *            expression to resolve
-	 * @return resolved expression
-	 */
-	public String getString(String jobId, String value) {
-		try {
-			if (jobId != null) {
-				value = value.replaceAll(JOB_ID_TAG, jobId);
-			}
-			return dereference(value);
-		} catch (CoreException t) {
-			JAXBCorePlugin.log(t);
-		}
-		return value;
-	}
-
-	/**
-	 * @return map of Properties and Attributes defined in the XML
-	 *         configuration.
-	 */
-	public Map<String, Object> getVariables() {
-		return variables;
-	}
-
-	/**
-	 * @return whether the map has been initialized from an XML resource manager
-	 *         configuration.
-	 */
-	public boolean isInitialized() {
-		return initialized;
-	}
-
-	/**
-	 * Only creates property and adds it if value is not <code>null</code>.
-	 * 
-	 * @param name
-	 *            of property to add
-	 * @param value
-	 *            of property to add
-	 * @param visible
-	 *            whether this property is to be made available through the user
-	 *            interface (Launch Tab)
-	 */
-	public void maybeAddProperty(String name, Object value, boolean visible) {
-		if (value == null) {
-			return;
-		}
-		PropertyType p = new PropertyType();
-		p.setName(name);
-		p.setValue(value);
-		p.setVisible(visible);
-		variables.put(name, p);
-	}
-
-	/**
-	 * Looks for property in the configuration and uses it to create a Property
-	 * in the current environment. If the property is undefined or has a
-	 * <code>null</code> value in the configuration, this will not overwrite a
-	 * currently defined property in the environment. <br>
-	 * <br>
-	 * Delegates to {@link #maybeAddProperty(String, Object, boolean)}
-	 * 
-	 * @param key1
-	 *            to map the property to in the environemnt
-	 * @param key2
-	 *            to search for the property in the configuration
-	 * @param configuration
-	 *            to search
-	 * @throws CoreException
-	 */
-	public void maybeOverwrite(String key1, String key2, ILaunchConfiguration configuration) throws CoreException {
-		Object value1 = null;
-		Object value2 = null;
-		PropertyType p = (PropertyType) variables.get(key1);
-		if (p != null) {
-			value2 = p.getValue();
-		}
-		value2 = configuration.getAttributes().get(key2);
-		if (value2 == null) {
-			maybeAddProperty(key1, value1, false);
-		} else {
-			maybeAddProperty(key1, value2, false);
-		}
-	}
-
-	/**
-	 * Places a Property or Attribute directly in the environment.
-	 * 
-	 * @param name
-	 *            of Property or Attribute
-	 * @param value
-	 *            of Property or Attribute
-	 */
-	public void put(String name, Object value) {
-		variables.put(name, value);
-	}
-
-	/**
-	 * Removes a Property or Attribute. Checks first in the predefined values
-	 * map, and if it does not exist there, removes from the runtime values map.
-	 * 
-	 * @param name
-	 *            of Property or Attribute to remove
-	 * @return value of Property or Attribute
-	 */
-	public Object remove(String name) {
-		Object o = variables.remove(name);
-		if (o == null) {
-			o = discovered.remove(name);
-		}
-		return o;
-	}
-
-	/**
-	 * @param initialized
-	 *            whether the map has been initialized from an XML resource
-	 *            manager configuration.
-	 */
-	public void setInitialized(boolean initialized) {
-		this.initialized = initialized;
-	}
-
-	/**
-	 * Calls the string substitution method on the variable manager.
-	 * 
-	 * @param expression
-	 *            to be resolved (recursively dereferenced from the map).
-	 * @return the resolved expression
-	 * @throws CoreException
-	 */
-	private String dereference(String expression) throws CoreException {
-		if (expression == null) {
-			return null;
-		}
-		return VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(expression);
-	}
-
-	/**
-	 * @return the currently active instance.
-	 */
-	public synchronized static RMVariableMap getActiveInstance() {
-		return active;
-	}
-
-	/**
-	 * @param instance
-	 *            if <code>null</code>, an empty map is created, set to the
-	 *            active map, and returned. Else the passed-in instance is set
-	 *            and returned.
-	 * @return the resulting active instance
-	 */
-	public synchronized static RMVariableMap setActiveInstance(RMVariableMap instance) {
-		if (instance == null) {
-			instance = new RMVariableMap();
-		}
-		RMVariableMap.active = instance;
-		return RMVariableMap.active;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/variables/RMVariableResolver.java b/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/variables/RMVariableResolver.java
deleted file mode 100644
index a52b03f..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.core/src/org/eclipse/ptp/rm/jaxb/core/variables/RMVariableResolver.java
+++ /dev/null
@@ -1,82 +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.core.variables;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.variables.IDynamicVariable;
-import org.eclipse.core.variables.IDynamicVariableResolver;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.core.utils.CoreExceptionUtils;
-
-/**
- * Resolver for the RMVariableMap (tag: ${rm:). See further
- * {@link #RMVariableResolver()}
- * 
- * @author arossi
- * 
- */
-public class RMVariableResolver implements IDynamicVariableResolver, IJAXBNonNLSConstants {
-
-	/**
-	 * The ${rm: tag can contain a name with a suffix, "#field", denoting the
-	 * field of the retrieved object to access. Hence, ${rm:arch} would yield a
-	 * string value for the Attribute object associated with the name 'arch',
-	 * but ${rm:arch#description} would return the description string for that
-	 * attribute. In most cases, ${rm:arch#value} will be the form the argument
-	 * takes.
-	 */
-	public String resolveValue(IDynamicVariable variable, String argument) throws CoreException {
-		String[] parts = argument.split(PDRX);
-		Object value = RMVariableMap.getActiveInstance().get(parts[0]);
-		if (value != null) {
-			if (parts.length == 2) {
-				try {
-					return invokeGetter(value, parts[1]);
-				} catch (Throwable t) {
-					throw CoreExceptionUtils.newException(Messages.RMVariableResolver_derefError, t);
-				}
-			} else {
-				return String.valueOf(value);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Auxiliary reflection method for retrieving the field value of the object
-	 * corresponding to the resolved name.
-	 * 
-	 * @param target
-	 *            Property or Attribute corresponding to the resolved name
-	 * @param string
-	 *            name of the field
-	 * @return string value of the value returned by invoking "get[field]()" on
-	 *         the target
-	 * @throws SecurityException
-	 * @throws NoSuchMethodException
-	 * @throws IllegalArgumentException
-	 * @throws IllegalAccessException
-	 * @throws InvocationTargetException
-	 */
-	private static String invokeGetter(Object target, String string) throws SecurityException, NoSuchMethodException,
-			IllegalArgumentException, IllegalAccessException, InvocationTargetException {
-		String name = GET + string.substring(0, 1).toUpperCase() + string.substring(1);
-		Method getter = target.getClass().getDeclaredMethod(name, (Class[]) null);
-		Object result = getter.invoke(target, (Object[]) null);
-		if (result == null) {
-			return null;
-		}
-		return String.valueOf(result);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.help/.classpath b/rms/org.eclipse.ptp.rm.jaxb.help/.classpath
deleted file mode 100644
index c0b0b1f..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.help/.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.help/.project b/rms/org.eclipse.ptp.rm.jaxb.help/.project
deleted file mode 100644
index 3b10cd8..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.help/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rm.jaxb.help</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.help/.settings/org.eclipse.jdt.core.prefs b/rms/org.eclipse.ptp.rm.jaxb.help/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 1e7e8ef..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.help/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Sun Apr 17 19:38:48 CDT 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.help/META-INF/MANIFEST.MF b/rms/org.eclipse.ptp.rm.jaxb.help/META-INF/MANIFEST.MF
deleted file mode 100644
index 4f5c264..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.help/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,9 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: JAXBHelp
-Bundle-SymbolicName: org.eclipse.ptp.rm.jaxb.help
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.ptp.rm.jaxb.help.Activator
-Require-Bundle: org.eclipse.core.runtime
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/rms/org.eclipse.ptp.rm.jaxb.help/build.properties b/rms/org.eclipse.ptp.rm.jaxb.help/build.properties
deleted file mode 100644
index c6340f7..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.help/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = eclipse/
-bin.includes = META-INF/,\
-               .
diff --git a/rms/org.eclipse.ptp.rm.jaxb.help/html/JAXBHelpPage.html b/rms/org.eclipse.ptp.rm.jaxb.help/html/JAXBHelpPage.html
deleted file mode 100644
index 96af0e9..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.help/html/JAXBHelpPage.html
+++ /dev/null
@@ -1,92 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>The PTP Configurable Resource Manager</title>
-<link rel="stylesheet" type="text/css" href="help.css">
-</head>
-<body>
-	<h1>The PTP Configurable Resource Manager</h1>
-	<h2>
-		<a name="Introduction">Introduction</a>
-	</h2>
-	<p>
-		The JAXB Resource Manager plug-ins, part of the <a
-			href="../../org.eclipse.ptp.help/html/PLUGINS_ROOT/org.eclipse.ptp.help/html/toc.html">
-			Parallel Tools Platform</a> (PTP), allow you to launch and monitor
-		applications on local or remote resources using resource managers
-		which are configured from an XML file via JAXB (
-		<code>javax.xml.bind</code>
-		) technology.<br>
-	</p>
-	<p>There are two main motivations for providing this class of
-		resource managers:</p>
-	<ol>
-		<li>To allow for maximum configurability. Often job schedulers
-			(PBS, LSF, LoadLeveler, etc.) or interactive runtime systms (OpenMPI,
-			PE, SLURM, etc.) are set up by system administrators in special or
-			non-standard ways which make it difficult to use a generic tool. The
-			configuration file allows a user or community of users to fit the
-			resource manager to a class of systems or even to a single host.</li>
-		<li>Building the resource manager and its UI presentation from an
-			XML configuration means that in most cases no special coding is
-			necessary. Users should be able to accommodate new systems, at least
-			on the client-end, without writing and loading additional Eclipse
-			plugins. (The only qualification here is that the monitoring
-			component also support that type of scheduler or runtime; see the
-			following paragraphs.)</li>
-	</ol>
-	<p>An additional consideration in designing a generically
-		configurable resource manager was to partition the client
-		functionality so as to eliminate the need for special server-side
-		proxies and to scale more successfully in the updating of job and
-		resource information.</p>
-	<p>
-		To this end, JAXB resource managers now consist of two components, a
-		"control", which governs the configuration, launch and cancellation of
-		individual jobs entirely from the client end, and a "monitor", which
-		displays job status as well as global information about the HPC
-		resource. In most cases, the monitor will be a pre-built type provided
-		by the PTP distribution, either a generic class for handling
-		interactive submissions, or a batch-system monitor implemented using <a
-			href="http://www2.fz-juelich.de/jsc/llview">LLView</a>. Since <b>LLView</b>
-		already supports a good number of the standard scheduler types, adding
-		a new resource manager type will normally entail only the specific
-		configuration of its control part. We plan to make available both
-		user-initiated as well as system-wide deployment of the necessary
-		LLView parts (mostly Perl scripts) for monitoring the target resource.
-	</p>
-	<h2>
-		<a name="Requirements">Requirements</a>
-	</h2>
-	<p>In addition to having Eclipse and PTP installed, you need to
-		have the following software dependencies installed.</p>
-	<ul>
-		<li>CDT for Indigo, available from the Eclipse download site or
-			as part of the pre-built PTP package;</li>
-		<li>RSE for Indigo, available from the Eclipse download site or
-			as part of the pre-built PTP package.</li>
-	</ul>
-	<p>If the monitor of any JAXB resource manager uses LLView, an
-		LLView server must be set up separately or an installation must be
-		available to point the client monitoring component to.</p>
-	<p>
-		<b>There are two main sections to the help pages which follow. The
-			first concerns creating or modifying a resource manager
-			configuration; the second are some general guidelines for using the
-			JAXB resource managers. For those interested only in using the JAXB
-			resource managers already provided with the PTP distribution, the
-			first section may be skipped.</b>
-	</p>
-	<h2>
-		<a name="Configuring">Configuring the Resource Manager</a>
-	</h2>
-
-	<h2>
-		<a name="Using">Using the Resource Manager</a>
-	</h2>
-	<p>
-		<a href="toc.html">Back to Table of Contents</a>
-	</p>
-</body>
-</html>
diff --git a/rms/org.eclipse.ptp.rm.jaxb.help/html/help.css b/rms/org.eclipse.ptp.rm.jaxb.help/html/help.css
deleted file mode 100644
index f34a23d..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.help/html/help.css
+++ /dev/null
@@ -1,51 +0,0 @@
-/* following font face declarations need to be removed for DBCS */
-
-
-body, h1, h2, h3, h4, p, table, td, caption, th, ul, ol, dl, li, dd, dt {font-family: Arial, sans-serif; color: #000000}
-pre				{ font-family: Courier, monospace}
-
-/* end font face declarations */
-
-/* following font size declarations should be OK for DBCS */
-body, h1, h2, h3, h4, p, table, td, caption, th, ul, ol, dl, li, dd, dt {font-size: 10pt; }
-pre				{ font-size: 10pt}
-
-/* end font size declarations */
-
-body	     { background: #FFFFFF}
-h1           { font-size: 18pt; margin-top: 5; margin-bottom: 1 }	
-h2           { font-size: 14pt; margin-top: 25; margin-bottom: 3 }
-h3           { font-size: 11pt; margin-top: 20; margin-bottom: 3 }
-h4           { font-size: 10pt; margin-top: 20; margin-bottom: 3; font-style: italic }
-p 	     { font-size: 10pt; }
-pre	     { margin-left: 6; font-size: 9pt }
-
-a:link { color: #006699 }
-a:visited { color: #996699 }
-a:hover  { color: #006699 }
-
-ul	     { margin-top: 0; margin-bottom: 10 }
-li	     { margin-top: 0; margin-bottom: 0 } 
-li p	     { margin-top: 0; margin-bottom: 0 } 
-ol	     { margin-top: 0; margin-bottom: 10 }
-dl	     { margin-top: 0; margin-bottom: 10 }
-dt	     { margin-top: 0; margin-bottom: 0; font-weight: bold }
-dd	     { margin-top: 0; margin-bottom: 0 }
-strong	     { font-weight: bold}
-em	     { font-style: italic}
-var	     { font-style: italic}
-div.revision { border-left-style: solid; border-left-width: thin; 
-				   border-left-color: #7B68EE; padding-left:5 }
-th	     { font-weight: bold }
-
-/* Mike Behm's addition to the style sheet */
-.userinput { font-family: monospace; }
-.guitab, .important, .guibutton, .selectblue, .guimenu, .guilabel, 
-.notetitle  {
-     color: #000000;
-     font-family: helvetica, arial, sans-serif;
-     font-weight: bold;
-     }
-div.linux  {display:none;}
-.firsterm {font-style:italic;}
-
diff --git a/rms/org.eclipse.ptp.rm.jaxb.help/html/images/LaunchTab.pdf b/rms/org.eclipse.ptp.rm.jaxb.help/html/images/LaunchTab.pdf
deleted file mode 100644
index ad85c4b..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.help/html/images/LaunchTab.pdf
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.jaxb.help/html/toc.html b/rms/org.eclipse.ptp.rm.jaxb.help/html/toc.html
deleted file mode 100644
index ba1b3d8..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.help/html/toc.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <meta http-equiv="Content-Type"
- content="text/html; charset=ISO-8859-1">
-  <title>Running JAXB Applications </title>
-  <link rel="stylesheet" type="text/css" href="help.css">
-</head>
-<body>
-<h1>JAXB Resource Manager for PTP</h1>
-<br>
-Release 4.0.<br>
-<h2>Help Topics<br>
-</h2>
-<h1></h1>
-<p>The JAXB Eclipse plug-in, part of the <a
- href="PLUGINS_ROOT/org.eclipse.ptp.help/html/toc.html">Parallel Tools
-Platform</a> (PTP), defines a resource manager that can be configured from an XML file.</p>
-<h3>Table of Contents:
-</h3>
-<ul>
-  <li><a href="JAXBHelpPage.html#Introduction">Introduction</a></li>
-  <li><a href="JAXBHelpPage.html#Requirements"><span
- style="text-decoration: underline;">Requirements</span></a><br>
-  </li>
-  <li><a href="JAXBHelpPage.html#Installation">Installation</a></li>
-  <li><a href="JAXBHelpPage.html#Creating_a_Resource_Manager"><span
- style="text-decoration: underline;">Creating a JAXB Resource Manager</span></a><br>
-  </li>
-</ul>
-</body>
-</html>
diff --git a/rms/org.eclipse.ptp.rm.jaxb.help/src/org/eclipse/ptp/rm/jaxb/help/Activator.java b/rms/org.eclipse.ptp.rm.jaxb.help/src/org/eclipse/ptp/rm/jaxb/help/Activator.java
deleted file mode 100644
index d2d79f1..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.help/src/org/eclipse/ptp/rm/jaxb/help/Activator.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.eclipse.ptp.rm.jaxb.help;
-
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class Activator implements BundleActivator {
-
-	private static BundleContext context;
-
-	static BundleContext getContext() {
-		return context;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext bundleContext) throws Exception {
-		Activator.context = bundleContext;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext bundleContext) throws Exception {
-		Activator.context = null;
-	}
-
-}
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 0727bda..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,28 +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"
-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 2800d17..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = eclipse/
-bin.includes = META-INF/,\
-               .,\
-               data/
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/test-pbs.xml b/rms/org.eclipse.ptp.rm.jaxb.tests/data/test-pbs.xml
deleted file mode 100644
index 318f9fe..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/data/test-pbs.xml
+++ /dev/null
@@ -1,712 +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>${rm:directory#value}/${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 ${rm:Account_Name#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -c">#PBS -c ${rm:Checkpoint#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -W depend=">#PBS -W depend=${rm:depend#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -q">#PBS -q ${rm:destination#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -C">#PBS -C ${rm:line#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -e">#PBS -e ${rm:Error_Path#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -V">#PBS -V ${rm:export_all#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -W group_list=">#PBS -W group_list=${rm:group_list#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -h">#PBS -h ${rm:Hold_Types#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -N">#PBS -N ${rm:Job_Name#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -j">#PBS -j ${rm:Join_Path#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -k">#PBS -k ${rm:Keep_Files#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -m">#PBS -m ${rm:Mail_Points#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -M">#PBS -M ${rm:Mail_Users#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -o">#PBS -o ${rm:Output_Path#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -p">#PBS -p ${rm:Priority#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -r">#PBS -r ${rm:Rerunnable#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l arch=">#PBS -l arch=${rm:Resource_List.arch#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l cput=">#PBS -l cput=${rm:Resource_List.cput#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l file=">#PBS -l file=${rm:Resource_List.file#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l host=">#PBS -l host=${rm:Resource_List.host#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l mem=">#PBS -l mem=${rm:Resource_List.mem#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l nice=">#PBS -l nice=${rm:Resource_List.nice#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l nodes=">#PBS -l nodes=${rm:Resource_List.nodes#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l ompthreads=">#PBS -l ompthreads=${rm:Resource_List.ompthreads#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l pcput=">#PBS -l pcput=${rm:Resource_List.pcput#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l pmem=">#PBS -l pmem=${rm:Resource_List.pmem#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l pvmem=">#PBS -l pvmem=${rm:Resource_List.pvmem#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l vmem=">#PBS -l vmem=${rm:Resource_List.vmem#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -l walltime=">#PBS -l walltime=${rm:Resource_List.walltime#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -S">#PBS -S ${rm:Shell_Path_List#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -W stagein=">#PBS -W stagein=${rm:stagein#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -W stageout=">#PBS -W stageout=${rm:stageout#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -u">#PBS -u ${rm:User_List#value}</arg>
-         </line>
-         <line>
-            <arg isUndefinedIfMatches="#PBS -v">#PBS -v ${rm:Variable_List#value}</arg>
-         </line>
-         <line>
-            <arg>MPI_ARGS="-np ${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=${rm:Job_Name#value}.out</arg>
-         </line>
-         <line>
-            <arg>MPI_COMMAND=${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 ${rm:directory#value}</arg>
-         </line>
-         <line>
-            <arg resolve="false">${MPI_COMMAND} </arg>
-            <arg>${rm:executablePath#value} ${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>${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>${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>${rm:@jobId#name}</arg>
-      </terminate-job>
-      <launch-tab>
-         <basic>
-            <!-- <basic sharedEnvironment="true"> -->
-            <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>${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>${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>${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>${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>${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>${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>${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>${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>${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>${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>${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>${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>${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>${rm:allAttributes#value}</arg>
-                        <arg isUndefinedIfMatches=" destination=''"> destination='${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"/>
-</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 3157ca3..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/data/tokenizer-examples.xml
+++ /dev/null
@@ -1,399 +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/>
-</resource-manager-builder>
\ No newline at end of file
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 3c9d73c..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/JAXBTestsPlugin.java
+++ /dev/null
@@ -1,195 +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.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.core.utils.JAXBInitializationUtils;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.xml.sax.SAXException;
-
-public class JAXBTestsPlugin extends Plugin implements IJAXBNonNLSConstants {
-	// 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(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, Messages.JAXBCorePlugin_Exception_InternalError, 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 d512bd8..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/ManagedFilesTest.java
+++ /dev/null
@@ -1,178 +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.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-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.rm.jaxb.core.runnable.ManagedFilesJob;
-import org.eclipse.ptp.rm.jaxb.core.runnable.ScriptHandler;
-import org.eclipse.ptp.rm.jaxb.core.utils.JAXBInitializationUtils;
-import org.eclipse.ptp.rm.jaxb.core.utils.RemoteServicesDelegate;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-
-public class ManagedFilesTest extends TestCase implements IJAXBNonNLSConstants {
-
-	private static final String xml = 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 RemoteServicesDelegate delegate;
-
-	@Override
-	public void setUp() {
-		try {
-			JAXBTestsPlugin.validate(xml);
-			ResourceManagerData rmdata = JAXBInitializationUtils.initializeRMData(JAXBTestsPlugin.getURL(xml));
-			controlData = rmdata.getControlData();
-			RMVariableMap map = RMVariableMap.setActiveInstance(null);
-			JAXBInitializationUtils.initializeMap(rmdata, map);
-			env = map.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();
-		if (getName().equals("testManagedFiles")) {//$NON-NLS-1$
-			initializeConnections();
-		}
-	}
-
-	@Override
-	public void tearDown() {
-		controlData = null;
-	}
-
-	public void testManagedFiles() {
-		composeScript();
-		if (verbose) {
-			PropertyType contents = (PropertyType) env.get(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, delegate);
-			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, RMVariableMap.getActiveInstance(), live);
-		job.schedule();
-		try {
-			job.join();
-		} catch (InterruptedException t) {
-			t.printStackTrace();
-		}
-
-		PropertyType contents = (PropertyType) env.get(SCRIPT);
-		assertNotNull(contents);
-	}
-
-	private void initializeConnections() {
-		delegate = new RemoteServicesDelegate(null, null);
-	}
-
-	private ManagedFilesType maybeAddManagedFileForScript(ManagedFilesType files) {
-		PropertyType scriptVar = (PropertyType) RMVariableMap.getActiveInstance().get(SCRIPT);
-		PropertyType scriptPathVar = (PropertyType) RMVariableMap.getActiveInstance().get(SCRIPT_PATH);
-		if (scriptVar != null || scriptPathVar != null) {
-			if (files == null) {
-				files = new ManagedFilesType();
-				files.setFileStagingLocation(ECLIPSESETTINGS);
-			}
-			List<ManagedFileType> fileList = files.getFile();
-			ManagedFileType scriptFile = null;
-			if (!fileList.isEmpty()) {
-				for (ManagedFileType f : fileList) {
-					if (f.getName().equals(SCRIPT_FILE)) {
-						scriptFile = f;
-						break;
-					}
-				}
-			}
-			if (scriptFile == null) {
-				scriptFile = new ManagedFileType();
-				scriptFile.setName(SCRIPT_FILE);
-				fileList.add(scriptFile);
-			}
-			scriptFile.setResolveContents(false);
-			scriptFile.setUniqueIdPrefix(true);
-			if (scriptPathVar != null) {
-				scriptFile.setPath(String.valueOf(scriptPathVar.getValue()));
-				scriptFile.setDeleteAfterUse(false);
-			} else {
-				scriptFile.setContents(OPENVRM + SCRIPT + PD + VALUE + CLOSV);
-				scriptFile.setDeleteAfterUse(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(CONTROL_USER_VAR, "fooUser"); //$NON-NLS-1$
-		putValue(CONTROL_ADDRESS_VAR, "abe.ncsa.uiuc.edu"); //$NON-NLS-1$
-		putValue(DIRECTORY, "/u/ncsa/arossi/test"); //$NON-NLS-1$ 
-		putValue(MPI_CMD, "mpiexec"); //$NON-NLS-1$ 
-		putValue(MPI_ARGS, "-np 8"); //$NON-NLS-1$ 
-		putValue(EXEC_PATH, "/u/ncsa/arossi/test/foo"); //$NON-NLS-1$ 
-		if (verbose) {
-			RMDataTest.print(RMVariableMap.getActiveInstance());
-		}
-	}
-}
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 b905af7..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/RMDataTest.java
+++ /dev/null
@@ -1,99 +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.core.IJAXBNonNLSConstants;
-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;
-import org.eclipse.ptp.rm.jaxb.core.utils.JAXBInitializationUtils;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-
-public class RMDataTest extends TestCase implements IJAXBNonNLSConstants {
-
-	private static final String rmxml = DATA + "test-pbs.xml"; //$NON-NLS-1$
-	private static final String tokxml = 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 = RMVariableMap.setActiveInstance(null);
-				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(LT).append(ja.getName()).append(GTLT).append(ja.getType()).append(GTLT).append(ja.getDefault())
-						.append(GTLT).append(ja.getChoice()).append(GTLT).append(ja.getMax()).append(GTLT).append(ja.getMin())
-						.append(GTLT).append(ja.getValidator()).append(GTLT).append(ja.getDescription()).append(GTLT)
-						.append(ja.getTooltip()).append(ja.getValue()).append(GT).append(LINE_SEP);
-			} else if (o instanceof PropertyType) {
-				PropertyType p = (PropertyType) o;
-				buffer.append(LT).append(p.getName()).append(GTLT).append(p.getValue()).append(GT).append(LINE_SEP);
-			} else {
-				buffer.append(LT).append(e.getKey()).append(GTLT).append(e.getValue()).append(GT).append(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 0a86026..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/RMLaunchTest.java
+++ /dev/null
@@ -1,313 +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.NullProgressMonitor;
-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.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;
-import org.eclipse.ptp.rm.jaxb.core.rm.JAXBResourceManager;
-import org.eclipse.ptp.rm.jaxb.core.rm.JAXBResourceManagerConfiguration;
-import org.eclipse.ptp.rm.jaxb.core.rm.JAXBResourceManagerControl;
-import org.eclipse.ptp.rm.jaxb.core.rm.JAXBResourceManagerMonitor;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-import org.eclipse.ptp.rmsystem.AbstractResourceManagerConfiguration;
-import org.eclipse.ptp.rmsystem.IJobStatus;
-import org.eclipse.ptp.rmsystem.ResourceManagerServiceProvider;
-
-public class RMLaunchTest extends TestCase implements IJAXBNonNLSConstants {
-
-	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 = DATA + "test-pbs.xml"; //$NON-NLS-1$
-	private JAXBResourceManagerConfiguration rmConfig;
-	private JAXBResourceManager 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() {
-		try {
-			emulateConfigureWizard();
-			rm = new JAXBResourceManager(rmConfig, new JAXBResourceManagerControl(rmConfig), new JAXBResourceManagerMonitor(
-					rmConfig));
-			PTPCorePlugin.getDefault().getModelManager().addResourceManager(rm);
-			rm.start(new NullProgressMonitor());
-			try {
-				Thread.sleep(2000);
-			} catch (InterruptedException ignored) {
-			}
-			emulateLaunchTab();
-			String jobId = rm.submitJob(launchConfig, ILaunchManager.RUN_MODE, new NullProgressMonitor());
-			System.out.println("SUBMITTED: " + jobId); //$NON-NLS-1$
-			IJobStatus status = rm.getJobStatus(jobId);
-			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);
-		}
-	}
-
-	/*
-	 * 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(ZEROSTR);
-		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(MPI_CMD, "mpiexec"); //$NON-NLS-1$ 
-		env.put(MPI_ARGS, "-machinefile $PBS_NODEFILE -np 8"); //$NON-NLS-1$ 
-		PropertyType queues = (PropertyType) RMVariableMap.getActiveInstance().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 df5762b..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.tests/src/org/eclipse/ptp/rm/jaxb/tests/StreamParserTest.java
+++ /dev/null
@@ -1,515 +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.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.IStreamParserTokenizer;
-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;
-import org.eclipse.ptp.rm.jaxb.core.runnable.command.ConfigurableRegexTokenizer;
-import org.eclipse.ptp.rm.jaxb.core.utils.JAXBInitializationUtils;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-
-public class StreamParserTest extends TestCase implements IJAXBNonNLSConstants {
-
-	protected class Range {
-
-		private final String expression;
-		private int[] from;
-		private int[] to;
-		private int len;
-
-		public Range(String expression) {
-			RMVariableMap map = RMVariableMap.getActiveInstance();
-			assert (null != map);
-			this.expression = map.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(LEN) >= 0) {
-				String[] lenExp = n.split(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(CM);
-			for (int i = 0; i < commas.length; i++) {
-				String[] colon = commas[i].split(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 = 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;
-
-	@Override
-	public void setUp() {
-		RMVariableMap.setActiveInstance(null);
-		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);
-		RMVariableMap.getActiveInstance().getVariables().put(target, p);
-		runTokenizer(startup.get(0).getStdoutParser(), getQstatOut());
-		p = (PropertyType) RMVariableMap.getActiveInstance().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);
-		RMVariableMap.getActiveInstance().getVariables().put(target, p);
-		runTokenizer(startup.get(1).getStdoutParser(), getNoiseBeforeJobId());
-		p = (PropertyType) RMVariableMap.getActiveInstance().getVariables().get(target);
-		assertNotNull(p);
-		assertNotNull(p.getValue());
-		if (verbose) {
-			System.out.println(target + " = " + p.getValue()); //$NON-NLS-1$
-		}
-	}
-
-	public void test02OpenMPI() {
-		target = ATTRIBUTE;
-		runTokenizer(startup.get(2).getStdoutParser(), getOpenMPIOut());
-		Map<String, Object> d = RMVariableMap.getActiveInstance().getDiscovered();
-		for (Object o : d.values()) {
-			AttributeType ja = (AttributeType) o;
-			if (verbose) {
-				System.out.println("DISCOVERED 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 = RMVariableMap.getActiveInstance().getDiscovered();
-		for (Object o : d.values()) {
-			if (o instanceof PropertyType) {
-				PropertyType p = (PropertyType) o;
-				if (verbose) {
-					System.out.println("DISCOVERED 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 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 = ATTRIBUTE;
-		runTokenizer(startup.get(4).getStdoutParser(), getImplicitOrdering());
-		Map<String, Object> d = RMVariableMap.getActiveInstance().getDiscovered();
-		for (Object o : d.values()) {
-			AttributeType ja = (AttributeType) o;
-			if (verbose) {
-				System.out.println("DISCOVERED 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 = RMVariableMap.getActiveInstance().getDiscovered();
-		for (Object o : d.values()) {
-			if (o instanceof PropertyType) {
-				PropertyType p = (PropertyType) o;
-				if (verbose) {
-					System.out.println("DISCOVERED 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 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 = PROPERTY;
-		runTokenizer(startup.get(6).getStdoutParser(), getPropertyDefs());
-		Map<String, Object> d = RMVariableMap.getActiveInstance().getDiscovered();
-		for (Object o : d.values()) {
-			PropertyType p = (PropertyType) o;
-			if (verbose) {
-				System.out.println("DISCOVERED 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);
-		RMVariableMap.getActiveInstance().getVariables().put(target, p);
-		runTokenizer(startup.get(7).getStdoutParser(), getJobStates());
-		p = (PropertyType) RMVariableMap.getActiveInstance().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 = RMVariableMap.getActiveInstance().getDiscovered();
-		for (Object o : d.values()) {
-			if (o instanceof PropertyType) {
-				PropertyType p = (PropertyType) o;
-				if (verbose) {
-					System.out.println("DISCOVERED 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 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 = PROPERTY;
-		runTokenizer(startup.get(9).getStdoutParser(), getMergedOrdering());
-		Map<String, Object> d = RMVariableMap.getActiveInstance().getDiscovered();
-		for (Object o : d.values()) {
-			PropertyType p = (PropertyType) o;
-			if (verbose) {
-				System.out.println("DISCOVERED 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);
-		RMVariableMap.getActiveInstance().getVariables().put(target, p);
-		runTokenizer(startup.get(10).getStdoutParser(), getJobStates());
-		p = (PropertyType) RMVariableMap.getActiveInstance().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);
-		RMVariableMap.getActiveInstance().getVariables().put(target, p);
-		runTokenizer(startup.get(11).getStdoutParser(), getJobStates());
-		p = (PropertyType) RMVariableMap.getActiveInstance().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);
-		RMVariableMap.getActiveInstance().getVariables().put(target, p);
-		runTokenizer(getStatus.getStdoutParser(), getQstat());
-		p = (PropertyType) RMVariableMap.getActiveInstance().getVariables().get(this.target);
-		assertNotNull(p);
-		System.out.println(p.getName() + CM + 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);
-		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" + LINE_SEP + "java.lang.String" + LINE_SEP + LINE_SEP + LINE_SEP + "value_1" + LINE_SEP //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				+ "jobAttribute_2" + LINE_SEP + "java.lang.String" + LINE_SEP + "meaingless attribute" + LINE_SEP //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				+ "ignore this attribute" + LINE_SEP + "value_2" //$NON-NLS-1$ //$NON-NLS-2$
-				+ LINE_SEP;
-		return new ByteArrayInputStream(content.getBytes());
-	}
-
-	private static InputStream getImplicitWithTags() {
-		String content = "PROPERTY" + LINE_SEP + "value:423.4" + LINE_SEP + "name:x" + LINE_SEP + "ATTRIBUTE" + LINE_SEP + "name:y" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-				+ LINE_SEP + "value:-130.42" + LINE_SEP + "PROPERTY" + LINE_SEP + "name:z" + LINE_SEP + "value:-1.7" + 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:SUSPENDED" //$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" + LINE_SEP + "name:foo1;value:bar1" + LINE_SEP + "name:foo0;default:baz0" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				+ 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" + LINE_SEP //$NON-NLS-1$
-				+ "There is currently no way to know what your shell is.  Please look in /etc/passwd" + LINE_SEP //$NON-NLS-1$
-				+ "To get your default account, click your heels three times and say, 'There's no place like home!'" + LINE_SEP //$NON-NLS-1$
-				+ "429324.honest1" + 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$
-				+ LINE_SEP
-				+ "mca:mca:base:param:mca_component_disable_dlopen:help:Whether to attempt to disable opening dynamic components or not" //$NON-NLS-1$
-				+ LINE_SEP
-				+ "mca:mca:base:param:mca_component_disable_dlopen:deprecated:no" //$NON-NLS-1$
-				+ LINE_SEP
-				+ "mca:mpi:base:param:mpi_param_check:value:1" //$NON-NLS-1$
-				+ LINE_SEP
-				+ "mca:mpi:base:param:mpi_param_check:data_source:default value" //$NON-NLS-1$
-				+ LINE_SEP
-				+ "mca:mpi:base:param:mpi_param_check:status:read-only" //$NON-NLS-1$
-				+ 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$
-				+ LINE_SEP
-				+ "mca:mpi:base:param:mpi_param_check:deprecated:no" //$NON-NLS-1$
-				+ LINE_SEP
-				+ "mca:mpi:base:param:mpi_yield_when_idle:value:-1" //$NON-NLS-1$
-				+ LINE_SEP
-				+ "mca:mpi:base:param:mpi_yield_when_idle:data_source:default value" //$NON-NLS-1$
-				+ LINE_SEP
-				+ "mca:mpi:base:param:mpi_yield_when_idle:status:writable" //$NON-NLS-1$
-				+ 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$
-				+ LINE_SEP + "mca:mpi:base:param:mpi_yield_when_idle:deprecated:no" + LINE_SEP //$NON-NLS-1$
-				+ "mca:mpi:base:param:mpi_event_tick_rate:value:-1" + LINE_SEP; //$NON-NLS-1$
-		return new ByteArrayInputStream(content.getBytes());
-	}
-
-	private static InputStream getPropertyDefs() {
-		String content = "<name>pnameA</name><value>pvalueA</value>" + LINE_SEP + "<name>pnameB</name><value>pvalueB</value>" //$NON-NLS-1$ //$NON-NLS-2$
-				+ LINE_SEP + "<name>pnameC</name><value>pvalueC</value>" + LINE_SEP + "<name>pnameD</name><value>pvalueD</value>" //$NON-NLS-1$ //$NON-NLS-2$
-				+ LINE_SEP + "<value>pvalueW</value><name>pnameW</name>" + 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" + LINE_SEP + "iacat2" + LINE_SEP + "indprio" + LINE_SEP + "lincoln_nomss" + LINE_SEP + "cap1" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-				+ LINE_SEP + "lincoln_debug" + LINE_SEP + "long" + LINE_SEP + "iacat" + LINE_SEP + "industrial" + LINE_SEP //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				+ "lincoln" + LINE_SEP + "wide" + LINE_SEP + "nomss" + LINE_SEP + "debug" + LINE_SEP + "iacat3" + LINE_SEP //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-				+ "lincoln_cuda3.2" + LINE_SEP + "fernsler" + LINE_SEP; //$NON-NLS-1$ //$NON-NLS-2$
-		return new ByteArrayInputStream(content.getBytes());
-	}
-
-	private static InputStream getStaggered() {
-		String content = "value:1" + LINE_SEP + "value:2" + LINE_SEP + "name:1" + LINE_SEP + "name:2" + LINE_SEP + "name:3" + LINE_SEP //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-				+ "name:4" + LINE_SEP + "value:3" + LINE_SEP + "value:4" + 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.jaxb.ui/.classpath b/rms/org.eclipse.ptp.rm.jaxb.ui/.classpath
deleted file mode 100644
index c0b0b1f..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/.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.ui/.project b/rms/org.eclipse.ptp.rm.jaxb.ui/.project
deleted file mode 100644
index d1b9a4a..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rm.jaxb.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/rms/org.eclipse.ptp.rm.jaxb.ui/.settings/org.eclipse.jdt.core.prefs b/rms/org.eclipse.ptp.rm.jaxb.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9f79ddd..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Thu Feb 10 20:06:38 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.ui/META-INF/MANIFEST.MF b/rms/org.eclipse.ptp.rm.jaxb.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 3a4b4b9..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,38 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.rm.jaxb.ui;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: %pluginName
-Bundle-Activator: org.eclipse.ptp.rm.jaxb.ui.JAXBUIPlugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.ptp.core,
- org.eclipse.ptp.ui,
- org.eclipse.ptp.launch,
- org.eclipse.debug.ui,
- org.eclipse.ptp.rm.ui,
- org.eclipse.ptp.rm.generic.core;bundle-version="1.0.0",
- org.eclipse.ptp.utils.ui,
- org.eclipse.ptp.rm.core,
- org.eclipse.ptp.services.core;bundle-version="1.0.0",
- org.eclipse.ptp.services.ui;bundle-version="1.0.0",
- org.eclipse.ptp.rm.jaxb.core;bundle-version="1.0.0",
- 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.ptp.remote.core;bundle-version="5.0.0",
- org.eclipse.core.filesystem;bundle-version="1.3.100",
- org.eclipse.ptp.remote.ui;bundle-version="5.0.0",
- org.eclipse.ptp.remotetools.environment.core;bundle-version="2.0.0",
- org.eclipse.ptp.remotetools.environment.generichost;bundle-version="1.4.0",
- org.eclipse.ui.editors;bundle-version="3.7.0",
- org.eclipse.jface.text;bundle-version="3.7.0",
- org.eclipse.ui.ide;bundle-version="3.6.100",
- org.eclipse.core.expressions;bundle-version="3.4.200",
- org.eclipse.ptp.remote.remotetools.core;bundle-version="5.0.0",
- org.eclipse.core.resources
-Bundle-ActivationPolicy: lazy
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/build.properties b/rms/org.eclipse.ptp.rm.jaxb.ui/build.properties
deleted file mode 100644
index 4c6988b..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = eclipse/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               icons/
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/icons/sample.gif b/rms/org.eclipse.ptp.rm.jaxb.ui/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/plugin.xml b/rms/org.eclipse.ptp.rm.jaxb.ui/plugin.xml
deleted file mode 100644
index e18c14e..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/plugin.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.ptp.services.ui.providerContributors">
-      <providerContributor
-            class="org.eclipse.ptp.ui.wizards.RMProviderContributor"
-            id="org.eclipse.ptp.rm.jaxb.JAXBServiceProvider">
-      </providerContributor>
-   </extension>
-   <extension
-         point="org.eclipse.ptp.launch.rmLaunchConfigurations">
-      <launchConfiguration
-            class="org.eclipse.ptp.rm.jaxb.ui.launch.JAXBRMLaunchConfigurationFactory"
-            id="org.eclipse.ptp.rm.jaxb.ui.launchConfiguration">
-      </launchConfiguration>
-   </extension>
-   <extension
-         point="org.eclipse.ptp.ui.rmConfigurationWizards">
-      <configurationWizard
-            class="org.eclipse.ptp.rm.jaxb.ui.wizards.JAXBRMControlConfigurationWizardPageFactory"
-            id="org.eclipse.ptp.rm.jaxb.control">
-      </configurationWizard>
-      <configurationWizard
-            class="org.eclipse.ptp.rm.jaxb.ui.wizards.JAXBRMMonitorConfigurationWizardPageFactory"
-            id="org.eclipse.ptp.rm.jaxb.monitor">
-      </configurationWizard>
-   </extension>
-   <extension
-         point="org.eclipse.ptp.ui.rmConfigurationSelections">
-      <configurationSelection
-            class="org.eclipse.ptp.rm.jaxb.ui.wizards.JAXBRMConfigurationSelectionFactory"
-            id="org.eclipse.ptp.rm.jaxb.JAXBServiceProvider">
-      </configurationSelection>
-   </extension>
-   <extension
-         point="org.eclipse.ui.importWizards">
-      <category
-            id="org.eclipse.ptp.rm.jaxb.ui.wizards.ResourceManagerXML"
-            name="JAXB Resource Manager (Plugin) XML Import">
-      </category>
-      <wizard
-            category="org.eclipse.ptp.rm.jaxb.ui.wizards.ResourceManagerXML"
-            class="org.eclipse.ptp.rm.jaxb.ui.wizards.JAXBRMConfigurationImportWizard"
-            icon="icons/sample.gif"
-            id="org.eclipse.ptp.rm.jaxb.ui.wizards.JAXBRMConfigurationImportWizard"
-            name="Import JAXB Resource Manager XML">
-         <description>
-            Import XML configurations for the JAXB Resource Managers from plugins to the workspace
-         </description>
-      </wizard>
-   </extension>
-
-</plugin>
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/ICellEditorUpdateModel.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/ICellEditorUpdateModel.java
deleted file mode 100644
index 3d64efe..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/ICellEditorUpdateModel.java
+++ /dev/null
@@ -1,95 +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.ui;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.ptp.rm.jaxb.ui.model.ViewerUpdateModel;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * API for update models connected to viewer cell editors.
- * 
- * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel
- * @see org.eclipse.ptp.rm.jaxb.ui.IColumnViewerLabelSupport
- * 
- * @author arossi
- * 
- */
-public interface ICellEditorUpdateModel extends IUpdateModel, IColumnViewerLabelSupport {
-
-	/**
-	 * @return whether the cell is editable
-	 */
-	boolean canEdit();
-
-	/**
-	 * @return the cell editor for this model
-	 */
-	CellEditor getCellEditor();
-
-	/**
-	 * Insert name and value into template as indicated by the pattern
-	 * 
-	 * @param pattern
-	 *            template for constructing an output string representing all
-	 *            the attribute names and values in the viewer
-	 * @return the output string
-	 */
-	String getReplacedValue(String pattern);
-
-	/**
-	 * @return text to display as tooltip
-	 */
-	String getTooltip();
-
-	/**
-	 * @return the underlying value type appropriate for the cell editor in
-	 *         question
-	 */
-	Object getValueForEditor();
-
-	/**
-	 * @return whether this item (row) is checked in the viewer
-	 */
-	boolean isChecked();
-
-	/**
-	 * @param background
-	 *            any defined colors for each column of the viewer
-	 */
-	void setBackground(Color[] background);
-
-	/**
-	 * @param font
-	 *            any defined fonts for each column of the viewer
-	 */
-	void setFont(Font[] font);
-
-	/**
-	 * @param foreground
-	 *            any defined colors for each column of the viewer
-	 */
-	void setForeground(Color[] foreground);
-
-	/**
-	 * Translate the editor value into a type appropriate for storage
-	 * 
-	 * @param value
-	 *            from the editor
-	 */
-	void setValueFromEditor(Object value);
-
-	/**
-	 * @param viewerModel
-	 *            the model of the viewer to which this cell model belongs
-	 */
-	void setViewer(ViewerUpdateModel viewerModel);
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/IColumnViewerLabelSupport.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/IColumnViewerLabelSupport.java
deleted file mode 100644
index 39b3934..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/IColumnViewerLabelSupport.java
+++ /dev/null
@@ -1,48 +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.ui;
-
-import org.eclipse.jface.viewers.ITableColorProvider;
-import org.eclipse.jface.viewers.ITableFontProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Interface implemented by cell editor update models to support cell label
- * providers.
- * 
- * @see org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel
- * 
- * @author arossi
- * 
- */
-public interface IColumnViewerLabelSupport extends ITableColorProvider, ITableFontProvider {
-
-	/**
-	 * @param columnName
-	 * @return image
-	 */
-	Image getColumnImage(String columnName);
-
-	/**
-	 * @return description (only Attributes)
-	 */
-	String getDescription();
-
-	/**
-	 * @param columnName
-	 * @return the text label for the given column
-	 */
-	String getDisplayValue(String columnName);
-
-	/**
-	 * @return tooltip (only Attributes)
-	 */
-	String getTooltip();
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/IFireContentsChangedEnabled.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/IFireContentsChangedEnabled.java
deleted file mode 100644
index 5ed3936..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/IFireContentsChangedEnabled.java
+++ /dev/null
@@ -1,27 +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.ui;
-
-/**
- * Exports tab update call.
- * 
- * @see org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler
- * @sse 
- *      org.eclipse.ptp.launch.ui.extensions.AbstractRMLaunchConfigurationDynamicTab
- *      #fireContentsChanged()
- * @author arossi
- * 
- */
-public interface IFireContentsChangedEnabled {
-	/**
-	 * Used to delegate to the internal contents changed method of the tab
-	 */
-	void fireContentsChanged();
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/IJAXBUINonNLSConstants.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/IJAXBUINonNLSConstants.java
deleted file mode 100644
index d27c2d2..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/IJAXBUINonNLSConstants.java
+++ /dev/null
@@ -1,161 +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.ui;
-
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-
-/**
- * Gathers all internal, unmodifiable string constants into a single place for
- * convenience and the interest of uncluttered code.
- * 
- * @since 5.0
- */
-public interface IJAXBUINonNLSConstants extends IJAXBNonNLSConstants {
-
-	int DEFAULT = UNDEFINED;
-
-	String COLOR_WHITE = "SWT.COLOR_WHITE";//$NON-NLS-1$
-	String COLOR_BLACK = "SWT.COLOR_BLACK";//$NON-NLS-1$
-	String COLOR_RED = "SWT.COLOR_RED";//$NON-NLS-1$
-	String COLOR_DARK_RED = "SWT.COLOR_DARK_RED";//$NON-NLS-1$
-	String COLOR_GREEN = "SWT.COLOR_GREEN";//$NON-NLS-1$
-	String COLOR_DARK_GREEN = "SWT.COLOR_DARK_GREEN";//$NON-NLS-1$
-	String COLOR_YELLOW = "SWT.COLOR_YELLOW";//$NON-NLS-1$
-	String COLOR_DARK_YELLOW = "SWT.COLOR_DARK_YELLOW";//$NON-NLS-1$
-	String COLOR_BLUE = "SWT.COLOR_BLUE";//$NON-NLS-1$
-	String COLOR_DARK_BLUE = "SWT.COLOR_DARK_BLUE";//$NON-NLS-1$
-	String COLOR_MAGENTA = "SWT.COLOR_MAGENTA";//$NON-NLS-1$
-	String COLOR_DARK_MAGENTA = "SWT.COLOR_DARK_MAGENTA";//$NON-NLS-1$
-	String COLOR_CYAN = "SWT.COLOR_CYAN";//$NON-NLS-1$
-	String COLOR_DARK_CYAN = "SWT.COLOR_DARK_CYAN";//$NON-NLS-1$
-	String COLOR_GRAY = "SWT.COLOR_GRAY";//$NON-NLS-1$
-	String COLOR_DARK_GRAY = "SWT.COLOR_DARK_GRAY";//$NON-NLS-1$;
-	String COLOR_INFO_BACKGROUND = "SWT.COLOR_INFO_BACKGROUND";//$NON-NLS-1$
-	String COLOR_INFO_FOREGROUND = "SWT.COLOR_INFO_FOREGROUND";//$NON-NLS-1$
-	String COLOR_LIST_BACKGROUND = "SWT.COLOR_LIST_BACKGROUND";//$NON-NLS-1$
-	String COLOR_LIST_FOREGROUND = "SWT.COLOR_LIST_FOREGROUND";//$NON-NLS-1$
-	String COLOR_LIST_SELECTION = "SWT.COLOR_LIST_SELECTION";//$NON-NLS-1$
-	String COLOR_LIST_SELECTION_TEXT = "SWT.COLOR_LIST_SELECTION_TEXT";//$NON-NLS-1$
-	String COLOR_TITLE_BACKGROUND = "SWT.COLOR_TITLE_BACKGROUND";//$NON-NLS-1$
-	String COLOR_TITLE_BACKGROUND_GRADIENT = "SWT.COLOR_TITLE_BACKGROUND_GRADIENT";//$NON-NLS-1$
-	String COLOR_TITLE_FOREGROUND = "SWT.COLOR_TITLE_FOREGROUND";//$NON-NLS-1$
-	String COLOR_TITLE_INACTIVE_BACKGROUND = "SWT.COLOR_TITLE_INACTIVE_BACKGROUND";//$NON-NLS-1$
-	String COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = "SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT";//$NON-NLS-1$
-	String COLOR_TITLE_INACTIVE_FOREGROUND = "SWT.COLOR_TITLE_INACTIVE_FOREGROUND";//$NON-NLS-1$
-	String COLOR_WIDGET_BACKGROUND = "SWT.COLOR_WIDGET_BACKGROUND";//$NON-NLS-1$
-	String COLOR_WIDGET_BORDER = "SWT.COLOR_WIDGET_BORDER";//$NON-NLS-1$
-	String COLOR_WIDGET_DARK_SHADOW = "SWT.COLOR_WIDGET_DARK_SHADOW";//$NON-NLS-1$
-	String COLOR_WIDGET_FOREGROUND = "SWT.COLOR_WIDGET_FOREGROUND";//$NON-NLS-1$
-	String COLOR_WIDGET_HIGHLIGHT_SHADOW = "SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW";//$NON-NLS-1$
-	String COLOR_WIDGET_LIGHT_SHADOW = "SWT.COLOR_WIDGET_LIGHT_SHADOW";//$NON-NLS-1$
-	String COLOR_WIDGET_NORMAL_SHADOW = "SWT.COLOR_WIDGET_NORMAL_SHADOW";//$NON-NLS-1$
-
-	String COURIER = "Courier";//$NON-NLS-1$
-
-	String COLUMN_NAME = "Name";//$NON-NLS-1$
-	String COLUMN_VALUE = "Value";//$NON-NLS-1$
-	String COLUMN_DEFAULT = "Default";//$NON-NLS-1$
-	String COLUMN_DESC = "Description";//$NON-NLS-1$
-	String COLUMN_STATUS = "Status";//$NON-NLS-1$
-	String COLUMN_TOOLTIP = "Tooltip";//$NON-NLS-1$
-	String COLUMN_TYPE = "Type";//$NON-NLS-1$
-
-	String TABLE = "table";//$NON-NLS-1$
-	String TREE = "tree";//$NON-NLS-1$
-	String LABEL = "label";//$NON-NLS-1$
-	String TEXT = "text";//$NON-NLS-1$
-	String CHECKBOX = "checkbox";//$NON-NLS-1$
-	String SPINNER = "spinner";//$NON-NLS-1$
-	String COMBO = "combo";//$NON-NLS-1$
-	String RADIOBUTTON = "radioButton";//$NON-NLS-1$
-	String BROWSELOCAL = "browseLocal";//$NON-NLS-1$
-	String BROWSEREMOTE = "browseRemote";//$NON-NLS-1$
-
-	// SWT
-	String ALL = "SWT.ALL";//$NON-NLS-1$
-	String ARROW = "SWT.ARROW";//$NON-NLS-1$
-	String BACKGROUND = "SWT.BACKGROUND";//$NON-NLS-1$
-	String BALLOON = "SWT.BALLOON";//$NON-NLS-1$
-	String BAR = "SWT.BAR";//$NON-NLS-1$
-	String BEGINNING = "SWT.BEGINNING";//$NON-NLS-1$
-	String BORDER = "SWT.BORDER";//$NON-NLS-1$
-	String BORDER_DASH = "SWT.BORDER_DASH";//$NON-NLS-1$
-	String BORDER_DOT = "SWT.BORDER_DOT";//$NON-NLS-1$
-	String BORDER_SOLID = "SWT.BORDER_SOLID";//$NON-NLS-1$
-	String BOTTOM = "SWT.BOTTOM";//$NON-NLS-1$
-	String CASCADE = "SWT.CASCADE";//$NON-NLS-1$
-	String CENTER = "SWT.CENTER";//$NON-NLS-1$
-	String CHECK = "SWT.CHECK";//$NON-NLS-1$
-	String DIALOG_TRIM = "SWT.DIALOG_TRIM";//$NON-NLS-1$
-	String DOWN = "SWT.DOWN";//$NON-NLS-1$
-	String DROP_DOWN = "SWT.DROP_DOWN";//$NON-NLS-1$
-	String FILL = "SWT.FILL";//$NON-NLS-1$
-	String FILL_BOTH = "GridData.FILL_BOTH";//$NON-NLS-1$
-	String FILL_EVEN_ODD = "SWT.FILL_EVEN_ODD";//$NON-NLS-1$
-	String FILL_HORIZONTAL = "GridData.FILL_HORIZONTAL";//$NON-NLS-1$
-	String FILL_VERTICAL = "GridData.FILL_VERTICAL";//$NON-NLS-1$
-	String FILL_WINDING = "SWT.FILL_WINDING";//$NON-NLS-1$
-	String FOREGROUND = "SWT.FOREGROUND";//$NON-NLS-1$
-	String FULL_SELECTION = "SWT.FULL_SELECTION";//$NON-NLS-1$
-	String H_SCROLL = "SWT.H_SCROLL";//$NON-NLS-1$
-	String HORIZONTAL = "SWT.HORIZONTAL";//$NON-NLS-1$
-	String LEAD = "SWT.LEAD";//$NON-NLS-1$
-	String LEFT = "SWT.LEFT";//$NON-NLS-1$
-	String LEFT_TO_RIGHT = "SWT.LEFT_TO_RIGHT";//$NON-NLS-1$
-	String LINE_CUSTOM = "SWT.LINE_CUSTOM";//$NON-NLS-1$
-	String LINE_DASH = "SWT.LINE_DASH";//$NON-NLS-1$
-	String LINE_DASHDOT = "SWT.LINE_DASHDOT";//$NON-NLS-1$
-	String LINE_DASHDOTDOT = "SWT.LINE_DASHDOTDOT";//$NON-NLS-1$
-	String LINE_DOT = "SWT.LINE_DOT";//$NON-NLS-1$
-	String LINE_SOLID = "SWT.LINE_SOLID";//$NON-NLS-1$
-	String MODELESS = "SWT.MODELESS";//$NON-NLS-1$
-	String MULTI = "SWT.MULTI";//$NON-NLS-1$
-	String NO = "SWT.NO";//$NON-NLS-1$
-	String NO_BACKGROUND = "SWT.NO_BACKGROUND";//$NON-NLS-1$
-	String NO_FOCUS = "SWT.NO_FOCUS";//$NON-NLS-1$
-	String NO_MERGE_PAINTS = "SWT.NO_MERGE_PAINTS";//$NON-NLS-1$
-	String NO_RADIO_GROUP = "SWT.NO_RADIO_GROUP";//$NON-NLS-1$
-	String NO_REDRAW_RESIZE = "SWT.NO_REDRAW_RESIZE";//$NON-NLS-1$
-	String NO_SCROLL = "SWT.NO_SCROLL";//$NON-NLS-1$
-	String NO_TRIM = "SWT.NO_TRIM";//$NON-NLS-1$
-	String NONE = "SWT.NONE";//$NON-NLS-1$
-	String NORMAL = "SWT.NORMAL";//$NON-NLS-1$
-	String ON_TOP = "SWT.ON_TOP";//$NON-NLS-1$
-	String OPEN = "SWT.OPEN";//$NON-NLS-1$
-	String POP_UP = "SWT.POP_UP";//$NON-NLS-1$
-	String PRIMARY_MODAL = "SWT.PRIMARY_MODAL";//$NON-NLS-1$
-	String PUSH = "SWT.PUSH";//$NON-NLS-1$
-	String RADIO = "SWT.RADIO";//$NON-NLS-1$
-	String READ_ONLY = "SWT.READ_ONLY";//$NON-NLS-1$
-	String RESIZE = "SWT.RESIZE";//$NON-NLS-1$
-	String RIGHT = "SWT.RIGHT";//$NON-NLS-1$
-	String RIGHT_TO_LEFT = "SWT.RIGHT_TO_LEFT";//$NON-NLS-1$
-	String SCROLL_LINE = "SWT.SCROLL_LINE";//$NON-NLS-1$
-	String SCROLL_LOCK = "SWT.SCROLL_LOCK";//$NON-NLS-1$
-	String SCROLL_PAGE = "SWT.SCROLL_PAGE";//$NON-NLS-1$
-	String SHADOW_ETCHED_IN = "SWT.SHADOW_ETCHED_IN";//$NON-NLS-1$
-	String SHADOW_ETCHED_OUT = "SWT.SHADOW_ETCHED_OUT";//$NON-NLS-1$
-	String SHADOW_IN = "SWT.SHADOW_IN";//$NON-NLS-1$
-	String SHADOW_NONE = "SWT.SHADOW_NONE";//$NON-NLS-1$
-	String SHADOW_OUT = "SWT.SHADOW_OUT";//$NON-NLS-1$
-	String SHELL_TRIM = "SWT.SHELL_TRIM";//$NON-NLS-1$
-	String SHORT = "SWT.SHORT";//$NON-NLS-1$
-	String SIMPLE = "SWT.SIMPLE";//$NON-NLS-1$
-	String SINGLE = "SWT.SINGLE";//$NON-NLS-1$
-	String SMOOTH = "SWT.SMOOTH";//$NON-NLS-1$
-	String TITLE = "SWT.TITLE";//$NON-NLS-1$
-	String TOGGLE = "SWT.TOGGLE";//$NON-NLS-1$
-	String TOP = "SWT.TOGGLE";//$NON-NLS-1$
-	String UP = "SWT.UP";//$NON-NLS-1$
-	String V_SCROLL = "SWT.V_SCROLL";//$NON-NLS-1$
-	String VERTICAL = "SWT.VERTICAL";//$NON-NLS-1$
-	String WRAP = "SWT.WRAP";//$NON-NLS-1$
-	String YES = "SWT.YES";//$NON-NLS-1$
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/IUpdateModel.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/IUpdateModel.java
deleted file mode 100644
index 9ee0299..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/IUpdateModel.java
+++ /dev/null
@@ -1,66 +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.ui;
-
-import org.eclipse.ptp.remote.core.IRemoteFileManager;
-import org.eclipse.ptp.rm.jaxb.core.data.ValidatorType;
-import org.eclipse.ptp.rm.jaxb.core.variables.LCVariableMap;
-
-/**
- * Basic API for model objects associated with SWT controls.
- * 
- * @author arossi
- * 
- */
-public interface IUpdateModel extends IJAXBUINonNLSConstants {
-
-	/**
-	 * @return the control to which this model is bound
-	 */
-	Object getControl();
-
-	/**
-	 * @return identifier for the value of the model
-	 */
-	String getName();
-
-	/**
-	 * @return the value retrieved from the associated control/widget
-	 */
-	Object getValueFromControl();
-
-	/**
-	 * Load values and settings from Launch Tab environment.
-	 * 
-	 * @param lcMap
-	 *            Launch Tab environment
-	 */
-	void initialize(LCVariableMap lcMap);
-
-	/**
-	 * Update call triggered by the handler.
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler
-	 */
-	void refreshValueFromMap();
-
-	/**
-	 * Called by the Launch Tab.
-	 */
-	void restoreDefault();
-
-	/**
-	 * @param validator
-	 *            used to validate the value entered by the user
-	 * @param remoteFileManager
-	 *            from the resource manager's services
-	 */
-	void setValidator(ValidatorType validator, IRemoteFileManager remoteFileManager);
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/JAXBUIPlugin.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/JAXBUIPlugin.java
deleted file mode 100644
index 6d28976..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/JAXBUIPlugin.java
+++ /dev/null
@@ -1,135 +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.jaxb.ui;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ptp.rm.core.RMCorePlugin;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class JAXBUIPlugin extends AbstractUIPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.ptp.rm.jaxb.ui"; //$NON-NLS-1$
-
-	// The shared instance
-	private static JAXBUIPlugin plugin;
-
-	/**
-	 * The constructor
-	 */
-	public JAXBUIPlugin() {
-		// Empty implementation.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext
-	 * )
-	 */
-	@Override
-	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
-	 * )
-	 */
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * 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 JAXBUIPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Generate a unique identifier
-	 * 
-	 * @return unique identifier string
-	 */
-	public static String getUniqueIdentifier() {
-		if (getDefault() == null)
-			// If the default instance is not yet initialized,
-			// return a static identifier. This identifier must
-			// match the plugin id defined in plugin.xml
-			return PLUGIN_ID;
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	/**
-	 * 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, Messages.JAXBUIPlugin_Exception_InternalError, e));
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/cell/AttributeViewerEditingSupport.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/cell/AttributeViewerEditingSupport.java
deleted file mode 100644
index b6707a9..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/cell/AttributeViewerEditingSupport.java
+++ /dev/null
@@ -1,93 +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.ui.cell;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel;
-
-/**
- * Editing support for the checkbox attribute viewers.
- * 
- * @author arossi
- * 
- */
-public class AttributeViewerEditingSupport extends EditingSupport {
-
-	private final ColumnViewer viewer;
-
-	/**
-	 * @param viewer
-	 * @see org.eclipse.jface.viewers.CheckboxTableViewer
-	 * @see org.eclipse.jface.viewers.CheckboxTreeViewer
-	 */
-	public AttributeViewerEditingSupport(ColumnViewer viewer) {
-		super(viewer);
-		this.viewer = viewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object)
-	 */
-	@Override
-	protected boolean canEdit(Object element) {
-		if (element instanceof ICellEditorUpdateModel) {
-			boolean b = ((ICellEditorUpdateModel) element).canEdit();
-			return b;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object)
-	 */
-	@Override
-	protected CellEditor getCellEditor(Object element) {
-		if (element instanceof ICellEditorUpdateModel) {
-			CellEditor editor = ((ICellEditorUpdateModel) element).getCellEditor();
-			return editor;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object)
-	 */
-	@Override
-	protected Object getValue(Object element) {
-		if (element instanceof ICellEditorUpdateModel) {
-			Object value = ((ICellEditorUpdateModel) element).getValueForEditor();
-			return value;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object,
-	 * java.lang.Object)
-	 */
-	@Override
-	protected void setValue(Object element, Object value) {
-		if (element instanceof ICellEditorUpdateModel) {
-			((ICellEditorUpdateModel) element).setValueFromEditor(value);
-			viewer.refresh();
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/cell/SpinnerCellEditor.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/cell/SpinnerCellEditor.java
deleted file mode 100644
index ffd85a7..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/cell/SpinnerCellEditor.java
+++ /dev/null
@@ -1,149 +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.ui.cell;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Spinner;
-
-/**
- * CellEditor backed by Spinner.
- * 
- * @author arossi
- * 
- */
-public class SpinnerCellEditor extends CellEditor {
-
-	private Spinner spinner;
-
-	private static final int defaultStyle = SWT.NONE;
-
-	public SpinnerCellEditor() {
-		setStyle(defaultStyle);
-	}
-
-	/**
-	 * @param parent
-	 */
-	public SpinnerCellEditor(Composite parent) {
-		this(parent, defaultStyle);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 *            SWT style appropriate for Spinner
-	 */
-	public SpinnerCellEditor(Composite parent, int style) {
-		this(parent, style, null, null);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 *            SWT style appropriate for Spinner
-	 * @param min
-	 *            value on Spinner
-	 * @param max
-	 *            value on Spinner
-	 */
-	public SpinnerCellEditor(Composite parent, int style, Integer min, Integer max) {
-		super(parent, style);
-
-		if (min != null) {
-			if (max == null) {
-				max = Integer.MAX_VALUE;
-			}
-		}
-
-		if (max != null) {
-			if (min == null) {
-				min = Integer.MIN_VALUE;
-			}
-		}
-
-		if (min != null && max != null) {
-			spinner.setMinimum(min);
-			spinner.setMaximum(max);
-		}
-	}
-
-	/**
-	 * @param parent
-	 * @param min
-	 *            value on Spinner
-	 * @param max
-	 *            value on Spinner
-	 */
-	public SpinnerCellEditor(Composite parent, Integer min, Integer max) {
-		this(parent, defaultStyle, min, max);
-	}
-
-	/**
-	 * @return min value on Spinner
-	 */
-	public int getMin() {
-		return spinner.getMinimum();
-	}
-
-	/**
-	 * @return max value on Spinner
-	 */
-	public Spinner getSpinner() {
-		return spinner;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.CellEditor#createControl(org.eclipse.swt.widgets
-	 * .Composite)
-	 */
-	@Override
-	protected Control createControl(Composite parent) {
-		spinner = new Spinner(parent, getStyle());
-		return spinner;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#doGetValue()
-	 */
-	@Override
-	protected Object doGetValue() {
-		return spinner.getSelection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#doSetFocus()
-	 */
-	@Override
-	protected void doSetFocus() {
-		spinner.setFocus();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#doSetValue(java.lang.Object)
-	 */
-	@Override
-	protected void doSetValue(Object value) {
-		Assert.isTrue(value instanceof Integer);
-		spinner.setSelection((Integer) value);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/dialogs/ScrollingEditableMessageDialog.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/dialogs/ScrollingEditableMessageDialog.java
deleted file mode 100644
index ed59a39..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/dialogs/ScrollingEditableMessageDialog.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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 (NCSA) - design and implementation
- *                           added readOnly option 05/11/2010
- *                         - modified (09/14/2010) to use non-nls interface
- ******************************************************************************/
-package org.eclipse.ptp.rm.jaxb.ui.dialogs;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.ui.util.WidgetBuilderUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Displays text contents for editing/saving. Note: the font hint used is
- * Courier, which should be available on Mac, Windows and Linux platforms. More
- * lightweight than a full-blown text editor.
- * 
- * @author arossi
- */
-public class ScrollingEditableMessageDialog extends MessageDialog implements IJAXBUINonNLSConstants {
-	public static final int DEFAULT_INDEX = 0;
-	public static final String[] DEFAULT_LABELS = { Messages.DialogClose };
-
-	protected Button okButton;
-	protected boolean readOnly;
-	protected Text scrollable;
-	protected String title;
-	protected String value;
-
-	/**
-	 * @param parentShell
-	 * @param name
-	 *            message label for text
-	 * @param value
-	 *            initial text value
-	 */
-	public ScrollingEditableMessageDialog(Shell parentShell, String name, String value) {
-		this(parentShell, name, value, false);
-	}
-
-	/**
-	 * @param parentShell
-	 * @param name
-	 *            message label for text
-	 * @param value
-	 *            initial text value
-	 * @param readOnly
-	 *            if the text box if read only
-	 */
-	public ScrollingEditableMessageDialog(Shell parentShell, String name, String value, boolean readOnly) {
-		this(parentShell, name, value, name, null, MessageDialog.NONE, DEFAULT_LABELS, DEFAULT_INDEX);
-		this.readOnly = readOnly;
-	}
-
-	/**
-	 * @param parentShell
-	 * @param name
-	 *            message label for text
-	 * @param value
-	 *            initial text value
-	 * @param dialogTitle
-	 * @param dialogTitleImage
-	 * @param dialogImageType
-	 * @param dialogButtonLabels
-	 * @param defaultIndex
-	 */
-	public ScrollingEditableMessageDialog(Shell parentShell, String name, String value, String dialogTitle, Image dialogTitleImage,
-			int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
-		super(parentShell, dialogTitle, dialogTitleImage, name, dialogImageType, dialogButtonLabels, defaultIndex);
-		this.value = value;
-		readOnly = false;
-	}
-
-	/**
-	 * The entered value.
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.MessageDialog#open()
-	 */
-	@Override
-	public int open() {
-		createDialogArea(getParentShell());
-		return super.open();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.MessageDialog#buttonPressed(int)
-	 */
-	@Override
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == IDialogConstants.OK_ID) {
-			value = scrollable.getText();
-		} else {
-			value = null;
-		}
-		super.buttonPressed(buttonId);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.dialogs.MessageDialog#configureShell(org.eclipse.swt
-	 * .widgets.Shell)
-	 */
-	@Override
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		if (title != null) {
-			shell.setText(title);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.dialogs.MessageDialog#createButtonsForButtonBar(org
-	 * .eclipse.swt.widgets.Composite)
-	 */
-	@Override
-	protected void createButtonsForButtonBar(Composite parent) {
-		// create OK and Cancel buttons by default
-		okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
-		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
-		// do this here because setting the text will also set enablement on the
-		// OK button
-		scrollable.setFocus();
-		if (value != null) {
-			scrollable.setText(value);
-			scrollable.selectAll();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.dialogs.MessageDialog#createDialogArea(org.eclipse.
-	 * swt.widgets.Composite)
-	 */
-	@Override
-	protected Control createDialogArea(Composite parent) {
-		Control c = super.createDialogArea(parent);
-		GridData data = WidgetBuilderUtils.createGridDataFill(convertWidthInCharsToPixels(160), 550, 1);
-		scrollable = WidgetBuilderUtils.createText(parent, SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.H_SCROLL | SWT.V_SCROLL, data,
-				readOnly, null);
-		WidgetBuilderUtils.applyMonospace(scrollable);
-		return c;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/handlers/ValueUpdateHandler.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/handlers/ValueUpdateHandler.java
deleted file mode 100644
index a9c8d38..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/handlers/ValueUpdateHandler.java
+++ /dev/null
@@ -1,98 +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.ui.handlers;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ptp.rm.jaxb.ui.IFireContentsChangedEnabled;
-import org.eclipse.ptp.rm.jaxb.ui.IUpdateModel;
-
-/**
- * When a widget or cell editor commits a change, this handler is called to
- * refresh all registered widget values from the underlying map. The handler
- * then signals an update on the parent tab.
- * 
- * @author arossi
- * 
- */
-public class ValueUpdateHandler {
-
-	private final Map<Object, IUpdateModel> controlToModelMap;
-	private final IFireContentsChangedEnabled tab;
-
-	/**
-	 * @param tab
-	 *            the parent controller tab
-	 * @see org.eclipse.ptp.rm.jaxb.ui.launch.JAXBControllerLaunchConfigurationTab
-	 */
-	public ValueUpdateHandler(IFireContentsChangedEnabled tab) {
-		controlToModelMap = new HashMap<Object, IUpdateModel>();
-		this.tab = tab;
-	}
-
-	/**
-	 * Adds a widget-to-model mapping to the registered controls map.
-	 * 
-	 * @param control
-	 *            widget or cell editor
-	 * @param model
-	 *            associate data model
-	 */
-	public void addUpdateModelEntry(Object control, IUpdateModel model) {
-		controlToModelMap.put(control, model);
-	}
-
-	/**
-	 * Empties the registered controls map.
-	 */
-	public void clear() {
-		controlToModelMap.clear();
-	}
-
-	/**
-	 * @return the registered controls map.
-	 */
-	public Map<Object, IUpdateModel> getControlToModelMap() {
-		return controlToModelMap;
-	}
-
-	/**
-	 * Broadcasts update request to all other controls by invoking refresh on
-	 * their model objects.
-	 * 
-	 * The value can largely be ignored.
-	 * 
-	 * @param source
-	 *            the control which has been modified
-	 * @param value
-	 *            the new value (if any) produced (unused here)
-	 */
-	public void handleUpdate(Object source, Object value) {
-		for (Object control : controlToModelMap.keySet()) {
-			if (control == source) {
-				continue;
-			}
-			controlToModelMap.get(control).refreshValueFromMap();
-		}
-
-		for (Object control : controlToModelMap.keySet()) {
-			if (control instanceof Viewer) {
-				((Viewer) control).refresh();
-			}
-		}
-
-		/*
-		 * notify the parent tab about the update
-		 */
-		tab.fireContentsChanged();
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/AbstractJAXBLaunchConfigurationTab.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/AbstractJAXBLaunchConfigurationTab.java
deleted file mode 100644
index 99c1c3b..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/AbstractJAXBLaunchConfigurationTab.java
+++ /dev/null
@@ -1,134 +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.ui.launch;
-
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.ptp.core.elements.IPQueue;
-import org.eclipse.ptp.launch.ui.extensions.AbstractRMLaunchConfigurationDynamicTab;
-import org.eclipse.ptp.launch.ui.extensions.RMLaunchValidation;
-import org.eclipse.ptp.rm.jaxb.core.variables.LCVariableMap;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.ui.JAXBUIPlugin;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.ptp.rmsystem.IResourceManager;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Base class for the JAXB LaunchConfiguration tabs which provide views of
- * editable widgets. Up to three such tabs can be configured as children of the
- * controller tab.<br>
- * <br>
- * 
- * Each tab maintains its own local map of values which are set from its
- * widgets, and this swapped into the environment active map when configuration
- * changes are needed.
- * 
- * @see org.eclipse.ptp.rm.jaxb.ui.launch.JAXBDynamicLaunchConfigurationTab
- * @see org.eclipse.ptp.rm.jaxb.ui.launch.JAXBImportedScriptLaunchConfigurationTab
- * 
- * @author arossi
- * 
- */
-public abstract class AbstractJAXBLaunchConfigurationTab extends AbstractRMLaunchConfigurationDynamicTab implements
-		IJAXBUINonNLSConstants {
-
-	protected final JAXBControllerLaunchConfigurationTab parentTab;
-	protected final Map<String, Object> localMap;
-	protected String title;
-	protected Composite control;
-
-	/**
-	 * @param parentTab
-	 *            the controller
-	 * @param dialog
-	 *            the dialog to which this tab belongs
-	 * @param tabIndex
-	 *            child index for the parent
-	 */
-	protected AbstractJAXBLaunchConfigurationTab(JAXBControllerLaunchConfigurationTab parentTab, ILaunchConfigurationDialog dialog) {
-		super(dialog);
-		this.parentTab = parentTab;
-		this.title = Messages.DefaultDynamicTab_title;
-		localMap = new TreeMap<String, Object>();
-	}
-
-	/**
-	 * @return image to display in the folder tab for this LaunchTab
-	 */
-	public abstract Image getImage();
-
-	/**
-	 * @return text to display in the folder tab for this LaunchTab
-	 */
-	public abstract String getText();
-
-	/**
-	 * This performApply is triggered whenever there is an update on the
-	 * controller. We do not want the values of the tab to be flushed to the
-	 * configuration unless this tab is the origin of the change; hence we check
-	 * to see if the tab is visible.<br>
-	 * <br>
-	 * If write to configuration is indicated, the the local map is refreshed,
-	 * swapped in to the active map, and then flushed to the configuration.
-	 * 
-	 * @param configuration
-	 *            working copy of current launch configuration
-	 * @param current
-	 *            resource manager
-	 * @param queue
-	 *            (unused)
-	 */
-	public RMLaunchValidation performApply(ILaunchConfigurationWorkingCopy configuration, IResourceManager rm, IPQueue queue) {
-		if (control.isVisible()) {
-			Map<String, Object> current = null;
-			LCVariableMap lcMap = parentTab.getLCMap();
-			try {
-				refreshLocal(configuration);
-				current = lcMap.swapVariables(localMap);
-				lcMap.writeToConfiguration(configuration);
-			} catch (CoreException t) {
-				JAXBUIPlugin.log(t);
-				return new RMLaunchValidation(false, t.getMessage());
-			} finally {
-				try {
-					lcMap.swapVariables(current);
-				} catch (CoreException t) {
-					JAXBUIPlugin.log(t);
-					return new RMLaunchValidation(false, t.getMessage());
-				}
-			}
-		}
-		return new RMLaunchValidation(true, null);
-	}
-
-	/**
-	 * Tab-specific handling of local variable map.
-	 */
-	protected abstract void doRefreshLocal();
-
-	/**
-	 * Subclasses should call this method, but implement doRefreshLocal().
-	 * 
-	 * @param current
-	 *            configuration
-	 */
-	protected void refreshLocal(ILaunchConfiguration config) throws CoreException {
-		localMap.clear();
-		localMap.putAll(LCVariableMap.getStandardConfigurationProperties(config));
-		doRefreshLocal();
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/ExtensibleJAXBControllerTab.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/ExtensibleJAXBControllerTab.java
deleted file mode 100644
index 87b35f8..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/ExtensibleJAXBControllerTab.java
+++ /dev/null
@@ -1,221 +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.ui.launch;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.ptp.core.elements.IPQueue;
-import org.eclipse.ptp.launch.ui.extensions.AbstractRMLaunchConfigurationDynamicTab;
-import org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationContentsChangedListener;
-import org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab;
-import org.eclipse.ptp.launch.ui.extensions.RMLaunchValidation;
-import org.eclipse.ptp.rmsystem.IResourceManager;
-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.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-/**
- * Base class for the parent controller tab. Maintains list of child
- * controllers, and implements multiplexed versions of the abstract dynamic tab
- * interface.
- * 
- * @author arossi
- * 
- */
-public abstract class ExtensibleJAXBControllerTab extends AbstractRMLaunchConfigurationDynamicTab implements
-		IRMLaunchConfigurationContentsChangedListener {
-
-	private final List<AbstractJAXBLaunchConfigurationTab> tabControllers = new ArrayList<AbstractJAXBLaunchConfigurationTab>();
-
-	private Composite control;
-
-	/**
-	 * @param dialog
-	 */
-	protected ExtensibleJAXBControllerTab(ILaunchConfigurationDialog dialog) {
-		super(dialog);
-	}
-
-	/*
-	 * calls canSave on children (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #canSave(org.eclipse.swt.widgets.Control,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	public RMLaunchValidation canSave(Control control, IResourceManager rm, IPQueue queue) {
-		for (AbstractJAXBLaunchConfigurationTab tabControl : tabControllers) {
-			RMLaunchValidation validation = tabControl.canSave(control, rm, queue);
-			if (!validation.isSuccess()) {
-				return validation;
-			}
-		}
-		return new RMLaunchValidation(true, null);
-	}
-
-	/*
-	 * Builds the tab folder containing child tabs. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #createControl(org.eclipse.swt.widgets.Composite,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	public void createControl(Composite parent, IResourceManager rm, IPQueue queue) throws CoreException {
-		control = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		control.setLayout(layout);
-
-		final TabFolder tabFolder = new TabFolder(control, SWT.NONE);
-		tabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
-		for (AbstractJAXBLaunchConfigurationTab tabControl : tabControllers) {
-			final TabItem simpleTabItem = new TabItem(tabFolder, SWT.NONE);
-			tabControl.createControl(tabFolder, rm, queue);
-			simpleTabItem.setText(tabControl.getText());
-			simpleTabItem.setImage(tabControl.getImage());
-			simpleTabItem.setControl(tabControl.getControl());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #getControl()
-	 */
-	public Control getControl() {
-		return control;
-	}
-
-	/*
-	 * Listener method delegates to the fireContentsChanged method.
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.launch.ui.extensions.
-	 * IRMLaunchConfigurationContentsChangedListener
-	 * #handleContentsChanged(org.eclipse
-	 * .ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab)
-	 */
-	public void handleContentsChanged(IRMLaunchConfigurationDynamicTab factory) {
-		/*
-		 * calls contents changed on all the child tabs
-		 */
-		fireContentsChanged();
-	}
-
-	/*
-	 * Calls initializeFrom on child tabs. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #initializeFrom(org.eclipse.swt.widgets.Control,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue,
-	 * org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public RMLaunchValidation initializeFrom(Control control, IResourceManager rm, IPQueue queue, ILaunchConfiguration configuration) {
-		RMLaunchValidation resultValidation = new RMLaunchValidation(true, null);
-		for (AbstractJAXBLaunchConfigurationTab tabControl : tabControllers) {
-			RMLaunchValidation validation = tabControl.initializeFrom(control, rm, queue, configuration);
-			if (!validation.isSuccess()) {
-				resultValidation = validation;
-			}
-		}
-		return resultValidation;
-	}
-
-	/*
-	 * Calls isValid on child tabs. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #isValid(org.eclipse.debug.core.ILaunchConfiguration,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	public RMLaunchValidation isValid(ILaunchConfiguration launchConfig, IResourceManager rm, IPQueue queue) {
-		for (AbstractJAXBLaunchConfigurationTab tabControl : tabControllers) {
-			RMLaunchValidation validation = tabControl.isValid(launchConfig, rm, queue);
-			if (!validation.isSuccess()) {
-				return validation;
-			}
-		}
-		return new RMLaunchValidation(true, null);
-	}
-
-	/*
-	 * Calls performApply on child tabs. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	public RMLaunchValidation performApply(ILaunchConfigurationWorkingCopy configuration, IResourceManager rm, IPQueue queue) {
-		RMLaunchValidation resultValidation = new RMLaunchValidation(true, null);
-		for (AbstractJAXBLaunchConfigurationTab tabControl : tabControllers) {
-			RMLaunchValidation validation = tabControl.performApply(configuration, rm, queue);
-			if (!validation.isSuccess()) {
-				resultValidation = validation;
-			}
-		}
-		return resultValidation;
-	}
-
-	/*
-	 * Calls setDefaults on child tabs. (non-Javadoc) (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	public RMLaunchValidation setDefaults(ILaunchConfigurationWorkingCopy configuration, IResourceManager rm, IPQueue queue) {
-		RMLaunchValidation resultValidation = new RMLaunchValidation(true, null);
-		for (AbstractJAXBLaunchConfigurationTab tabControl : tabControllers) {
-			RMLaunchValidation validation = tabControl.setDefaults(configuration, rm, queue);
-			if (!validation.isSuccess()) {
-				resultValidation = validation;
-			}
-		}
-		return resultValidation;
-	}
-
-	/**
-	 * @param tabController
-	 */
-	protected void addDynamicTab(AbstractJAXBLaunchConfigurationTab tabController) {
-		tabControllers.add(tabController);
-		tabController.addContentsChangedListener(this);
-	}
-
-	/**
-	 * @return list of child tabs.
-	 */
-	protected List<AbstractJAXBLaunchConfigurationTab> getControllers() {
-		return tabControllers;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/JAXBControllerLaunchConfigurationTab.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/JAXBControllerLaunchConfigurationTab.java
deleted file mode 100644
index 08dbd5f..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/JAXBControllerLaunchConfigurationTab.java
+++ /dev/null
@@ -1,200 +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.ui.launch;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.ptp.core.elements.IPQueue;
-import org.eclipse.ptp.launch.ui.extensions.RMLaunchValidation;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManager;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerConfiguration;
-import org.eclipse.ptp.rm.jaxb.core.data.LaunchTabType;
-import org.eclipse.ptp.rm.jaxb.core.data.ScriptType;
-import org.eclipse.ptp.rm.jaxb.core.data.TabControllerType;
-import org.eclipse.ptp.rm.jaxb.core.utils.RemoteServicesDelegate;
-import org.eclipse.ptp.rm.jaxb.core.variables.LCVariableMap;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-import org.eclipse.ptp.rm.jaxb.ui.IFireContentsChangedEnabled;
-import org.eclipse.ptp.rm.jaxb.ui.JAXBUIPlugin;
-import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
-import org.eclipse.ptp.rmsystem.IResourceManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Implementation of the parent tab. It displays the children inside the tab
- * folder, and relays updates to them.<br>
- * <br>
- * The JAXB data subtree for building tabs, remote services delegate, Script (if
- * any), update handler and launch configuration variable map (environment built
- * from the resource manager environment) are held by the parent and accessed by
- * the child tabs.
- * 
- * @author arossi
- */
-public class JAXBControllerLaunchConfigurationTab extends ExtensibleJAXBControllerTab implements IFireContentsChangedEnabled {
-
-	private final RemoteServicesDelegate delegate;
-	private final IJAXBResourceManagerConfiguration rmConfig;
-	private final LaunchTabType launchTabData;
-	private final ScriptType script;
-	private final ValueUpdateHandler updateHandler;
-
-	private ScrolledComposite scrolledParent;
-	private LCVariableMap lcMap;
-
-	/**
-	 * @param rm
-	 *            the resource manager
-	 * @param dialog
-	 *            the launch dialog parent
-	 * @throws Throwable
-	 */
-	public JAXBControllerLaunchConfigurationTab(IJAXBResourceManager rm, ILaunchConfigurationDialog dialog) throws Throwable {
-		super(dialog);
-		rmConfig = rm.getJAXBConfiguration();
-		rmConfig.setActive();
-		script = rmConfig.getResourceManagerData().getControlData().getScript();
-		launchTabData = rmConfig.getResourceManagerData().getControlData().getLaunchTab();
-		delegate = rm.getControl().getRemoteServicesDelegate();
-		updateHandler = new ValueUpdateHandler(this);
-		if (launchTabData != null) {
-			TabControllerType controller = launchTabData.getBasic();
-			if (controller != null) {
-				addDynamicTab(new JAXBDynamicLaunchConfigurationTab(rm, dialog, controller, this));
-			}
-			controller = launchTabData.getAdvanced();
-			if (controller != null) {
-				addDynamicTab(new JAXBDynamicLaunchConfigurationTab(rm, dialog, controller, this));
-			}
-			String title = launchTabData.getCustomController();
-			if (title != null) {
-				addDynamicTab(new JAXBImportedScriptLaunchConfigurationTab(rm, dialog, title, this));
-			}
-		}
-	}
-
-	/*
-	 * No composites or controls are specific to the parent. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.launch.ExtensibleJAXBControllerTab#createControl
-	 * (org.eclipse.swt.widgets.Composite,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	@Override
-	public void createControl(Composite parent, IResourceManager rm, IPQueue queue) throws CoreException {
-		updateHandler.clear();
-		if (parent instanceof ScrolledComposite) {
-			scrolledParent = (ScrolledComposite) parent;
-		}
-		super.createControl(parent, rm, queue);
-	}
-
-	/*
-	 * Delegates to all registered listeners, which then call
-	 * handleContentsChanged. The ResourceTab ContentsChangedListener is always
-	 * included here, and this triggers its updateButtons and performApply
-	 * methods, which then propagates down to the child tabs. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.AbstractRMLaunchConfigurationDynamicTab
-	 * #fireContentsChanged()
-	 */
-	@Override
-	public void fireContentsChanged() {
-		super.fireContentsChanged();
-	}
-
-	/**
-	 * @return remote services info
-	 */
-	public RemoteServicesDelegate getDelegate() {
-		return delegate;
-	}
-
-	/**
-	 * @return JAXB elements for building the launch tab controls
-	 */
-	public LaunchTabType getLaunchTabData() {
-		return launchTabData;
-	}
-
-	/**
-	 * @return launch tab environment map (built from the resource manager
-	 *         environment)
-	 */
-	public LCVariableMap getLCMap() {
-		return lcMap;
-	}
-
-	/**
-	 * @return JAXB data element for resource manager script
-	 */
-	public ScriptType getScript() {
-		return script;
-	}
-
-	/**
-	 * @return handler responsible for notifying all widgets to refresh their
-	 *         values from the launch tab environment map
-	 */
-	public ValueUpdateHandler getUpdateHandler() {
-		return updateHandler;
-	}
-
-	/**
-	 * @return whether this resource manager uses a script
-	 */
-	public boolean hasScript() {
-		return script != null;
-	}
-
-	/*
-	 * resets the resource manager environment to active, rebuilds the launch
-	 * tab environment map, and clears the controls registered with the update
-	 * handler. This is necessary because on calls to this method subsequent to
-	 * the first, the widgets it contained will have been disposed.
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.launch.ExtensibleJAXBControllerTab#initializeFrom
-	 * (org.eclipse.swt.widgets.Control,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue,
-	 * org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	@Override
-	public RMLaunchValidation initializeFrom(Control control, IResourceManager rm, IPQueue queue, ILaunchConfiguration configuration) {
-		try {
-			rmConfig.setActive();
-			lcMap = LCVariableMap.createInstance(RMVariableMap.getActiveInstance());
-			LCVariableMap.setActiveInstance(lcMap);
-			updateHandler.clear();
-		} catch (Throwable t) {
-			JAXBUIPlugin.log(t);
-			return new RMLaunchValidation(false, t.getMessage());
-		}
-		return super.initializeFrom(control, rm, queue, configuration);
-	}
-
-	/*
-	 * Attempt to suggest resizing to scrolled ResourcesTab composite.
-	 */
-	public void resize(Control control) {
-		if (scrolledParent != null) {
-			scrolledParent.setMinSize(control.computeSize(SWT.DEFAULT, SWT.DEFAULT));
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/JAXBDynamicLaunchConfigurationTab.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/JAXBDynamicLaunchConfigurationTab.java
deleted file mode 100644
index e1cb4f6..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/JAXBDynamicLaunchConfigurationTab.java
+++ /dev/null
@@ -1,426 +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.ui.launch;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ptp.core.elements.IPQueue;
-import org.eclipse.ptp.launch.ui.extensions.RMLaunchValidation;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManager;
-import org.eclipse.ptp.rm.jaxb.core.data.TabControllerType;
-import org.eclipse.ptp.rm.jaxb.core.runnable.ScriptHandler;
-import org.eclipse.ptp.rm.jaxb.core.utils.CoreExceptionUtils;
-import org.eclipse.ptp.rm.jaxb.core.variables.LCVariableMap;
-import org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.IUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.JAXBUIPlugin;
-import org.eclipse.ptp.rm.jaxb.ui.dialogs.ScrollingEditableMessageDialog;
-import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.ui.model.ViewerUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.util.LaunchTabBuilder;
-import org.eclipse.ptp.rm.jaxb.ui.util.WidgetActionUtils;
-import org.eclipse.ptp.rm.jaxb.ui.util.WidgetBuilderUtils;
-import org.eclipse.ptp.rmsystem.IResourceManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-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.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Launch Tab which builds its control from the JAXB data elements. The number,
- * type and disposition of widgets connected to Properties or Attributes is
- * almost entirely configurable via the XML.<br>
- * <br>
- * Aside from being registered with the update handler, the widgets specific to
- * this tab are also maintained in a local map so that their values (and only
- * theirs) will appear in the environment when performApply() is called. A list
- * of viewers is also kept so that refresh can be called on them when the tab is
- * (re-)initialized or the defaults are reset. <br>
- * <br>
- * If different widgets on different tabs reference the same Property or
- * Attribute, its value will change everywhere. However, if the
- * <code>shared</code> property is set to true, then the local map is populated
- * by values produced from all tabs and defaults are likewise reset on all
- * widgets in the update handler. This shared option is motivated by a scenario
- * in which the attributes are partitioned (empty intersection) between the
- * various tabs, but all of them are necessary to the definition of the job
- * submission. The default (not shared) implies that the tabs have intersecting
- * subsets of the whole attribute set, any one of which is sufficient to
- * configure a launch.
- * 
- * @author arossi
- * 
- */
-public class JAXBDynamicLaunchConfigurationTab extends AbstractJAXBLaunchConfigurationTab implements SelectionListener {
-
-	private final TabControllerType controller;
-	private final ValueUpdateHandler updateHandler;
-	private final List<Viewer> viewers;
-	private final Map<Object, IUpdateModel> localWidgets;
-	private final boolean shared;
-
-	private ILaunchConfiguration listenerConfiguration;
-
-	/**
-	 * @param rm
-	 *            the resource manager
-	 * @param dialog
-	 *            the ancestor main launch dialog
-	 * @param controller
-	 *            the JAXB data element from which this tab's control will be
-	 *            built
-	 * @param parentTab
-	 *            the parent controller tab
-	 */
-	public JAXBDynamicLaunchConfigurationTab(IJAXBResourceManager rm, ILaunchConfigurationDialog dialog,
-			TabControllerType controller, JAXBControllerLaunchConfigurationTab parentTab) {
-		super(parentTab, dialog);
-		this.controller = controller;
-		shared = controller.isSharedEnvironment();
-		String title = controller.getTitle();
-		if (title != null) {
-			this.title = title;
-		}
-		updateHandler = parentTab.getUpdateHandler();
-		localWidgets = new HashMap<Object, IUpdateModel>();
-		viewers = new ArrayList<Viewer>();
-	}
-
-	/*
-	 * Value validation is handled up front, so this just return true.
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #canSave(org.eclipse.swt.widgets.Control,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	public RMLaunchValidation canSave(Control control, IResourceManager rm, IPQueue queue) {
-		return new RMLaunchValidation(true, null);
-	}
-
-	/*
-	 * Maintains the top-level control element on which to rehang the rest of
-	 * the controls when rebuilt. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #createControl(org.eclipse.swt.widgets.Composite,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	public void createControl(Composite parent, IResourceManager rm, IPQueue queue) throws CoreException {
-		control = WidgetBuilderUtils.createComposite(parent, 1);
-		LaunchTabBuilder builder = new LaunchTabBuilder(this);
-		try {
-			builder.build(control);
-		} catch (Throwable t) {
-			CoreExceptionUtils.newException(Messages.CreateControlConfigurableError, t);
-		}
-		createViewScriptGroup(control);
-		parentTab.resize(this.control);
-	}
-
-	/**
-	 * The top-level control.
-	 */
-	public Control getControl() {
-		return control;
-	}
-
-	/**
-	 * Used by the LaunchTabBuilder.
-	 * 
-	 * @return the JAXB data element used to build the control
-	 */
-	public TabControllerType getController() {
-		return controller;
-	}
-
-	@Override
-	public Image getImage() {
-		return null;
-	}
-
-	/**
-	 * Used by the LaunchTabBuilder.
-	 * 
-	 * @return the map of widgets specific to this tab.
-	 */
-	public Map<Object, IUpdateModel> getLocalWidgets() {
-		return localWidgets;
-	}
-
-	/**
-	 * Used by the LaunchTabBuilder
-	 * 
-	 * @return the main controller tab
-	 */
-	public JAXBControllerLaunchConfigurationTab getParent() {
-		return parentTab;
-	}
-
-	/**
-	 * @return title of tab.
-	 */
-	@Override
-	public String getText() {
-		return title;
-	}
-
-	/*
-	 * 1. resets the configuation. 2. clears viewers and repopulate that list.
-	 * 3. repopulates the handler with local widgets. 4. initializes the (new)
-	 * widgets from the original global map. 5. initializes the checked state on
-	 * any checkbox viewers and then refreshes them. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #initializeFrom(org.eclipse.swt.widgets.Control,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue,
-	 * org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public RMLaunchValidation initializeFrom(Control control, IResourceManager rm, IPQueue queue, ILaunchConfiguration configuration) {
-		try {
-			ValueUpdateHandler handler = getParent().getUpdateHandler();
-			listenerConfiguration = configuration;
-
-			viewers.clear();
-			for (Map.Entry<Object, IUpdateModel> e : localWidgets.entrySet()) {
-				Object key = e.getKey();
-				if (key instanceof Viewer) {
-					Viewer viewer = (Viewer) key;
-					viewers.add(viewer);
-				}
-				handler.addUpdateModelEntry(key, e.getValue());
-			}
-
-			LCVariableMap lcMap = parentTab.getLCMap();
-			lcMap.updateGlobal(configuration);
-
-			for (IUpdateModel m : localWidgets.values()) {
-				m.initialize(lcMap);
-			}
-
-			for (IUpdateModel m : localWidgets.values()) {
-				if (m instanceof ViewerUpdateModel) {
-					((ViewerUpdateModel) m).initializeChecked();
-				}
-			}
-
-			for (Viewer v : viewers) {
-				v.refresh();
-			}
-		} catch (Throwable t) {
-			JAXBUIPlugin.log(t);
-			return new RMLaunchValidation(false, t.getMessage());
-		}
-		return new RMLaunchValidation(true, null);
-	}
-
-	/*
-	 * Value validation is now handled up front, so this just returns true.
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #isValid(org.eclipse.debug.core.ILaunchConfiguration,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	public RMLaunchValidation isValid(ILaunchConfiguration launchConfig, IResourceManager rm, IPQueue queue) {
-		return new RMLaunchValidation(true, null);
-	}
-
-	/*
-	 * Defaults are taken care of by the load method on the LCVariableMap
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	public RMLaunchValidation setDefaults(ILaunchConfigurationWorkingCopy configuration, IResourceManager rm, IPQueue queue) {
-		return new RMLaunchValidation(true, null);
-	}
-
-	/*
-	 * Tab acts a listener for viewScript button. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse
-	 * .swt.events.SelectionEvent)
-	 */
-	public void widgetDefaultSelected(SelectionEvent e) {
-		widgetSelected(e);
-	}
-
-	/*
-	 * Tab acts a listener for viewScript button. If the resource manager does
-	 * not use a script, this call returns immediately; else it calls
-	 * #realizeLocalScript(ILaunchConfiguration), then displays the result in a
-	 * read-only dialog. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
-	 * .events.SelectionEvent)
-	 */
-	public void widgetSelected(SelectionEvent e) {
-		Shell shell = Display.getDefault().getActiveShell();
-		try {
-			if (!parentTab.hasScript()) {
-				MessageDialog.openWarning(shell, Messages.ScriptNotSupportedWarning_title, Messages.ScriptNotSupportedWarning
-						+ LINE_SEP);
-				return;
-			}
-			String text = realizeLocalScript(listenerConfiguration);
-			new ScrollingEditableMessageDialog(shell, Messages.DisplayScript, text, true).open();
-		} catch (Throwable t) {
-			WidgetActionUtils.errorMessage(shell, t, Messages.DisplayScriptError, Messages.DisplayScriptErrorTitle, false);
-		}
-	}
-
-	/*
-	 * Writes values of local widgets or cell editors (if the viewer row is
-	 * selected) to the local map. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.launch.AbstractJAXBLaunchConfigurationTab#
-	 * doRefreshLocal()
-	 */
-	@Override
-	protected void doRefreshLocal() {
-		for (IUpdateModel m : getModels()) {
-			if (m instanceof ICellEditorUpdateModel) {
-				if (((ICellEditorUpdateModel) m).isChecked()) {
-					localMap.put(m.getName(), m.getValueFromControl());
-				}
-			} else {
-				localMap.put(m.getName(), m.getValueFromControl());
-				if (m instanceof ViewerUpdateModel) {
-					((ViewerUpdateModel) m).putCheckedSettings(localMap);
-				}
-			}
-		}
-	}
-
-	/*
-	 * Adds the View Script and Restore Defaults buttons to the bottom of the
-	 * control pane.
-	 */
-	private void createViewScriptGroup(final Composite control) {
-		GridLayout layout = WidgetBuilderUtils.createGridLayout(2, true);
-		GridData gd = WidgetBuilderUtils.createGridData(SWT.NONE, 2);
-		Group grp = WidgetBuilderUtils.createGroup(control, SWT.NONE, layout, gd);
-		if (parentTab.hasScript()) {
-			WidgetBuilderUtils.createPushButton(grp, Messages.ViewScript, this);
-		}
-
-		WidgetBuilderUtils.createPushButton(grp, Messages.DefaultValues, new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {
-				widgetSelected(e);
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				resetDefaults();
-			}
-		});
-	}
-
-	/*
-	 * Determines whether the set of widgets is local or global.
-	 * 
-	 * @return the set of widgets to be accessed for values.
-	 */
-	private Collection<IUpdateModel> getModels() {
-		Collection<IUpdateModel> models = null;
-		if (shared) {
-			models = updateHandler.getControlToModelMap().values();
-		} else {
-			models = localWidgets.values();
-		}
-		return models;
-	}
-
-	/*
-	 * After refreshing the local map, it swaps in the map to be the active
-	 * environment, adds any environment variables from the Environment Tab,
-	 * then schedules a script handler job. Swaps the previous map back into the
-	 * active environement when the handler returns.
-	 */
-	@SuppressWarnings({ "unchecked", "rawtypes" })
-	private synchronized String realizeLocalScript(ILaunchConfiguration config) throws Throwable {
-		String value = ZEROSTR;
-		refreshLocal(config);
-		LCVariableMap lcMap = parentTab.getLCMap();
-		Map<String, Object> current = lcMap.swapVariables(localMap);
-		Map env = config.getAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, (Map) null);
-		ScriptHandler job = new ScriptHandler(null, parentTab.getScript(), lcMap, env);
-		job.schedule();
-		try {
-			job.join();
-		} catch (InterruptedException ignored) {
-		}
-		value = job.getScriptValue();
-		lcMap.swapVariables(current);
-		return value;
-	}
-
-	/*
-	 * First resets default values from the LCVariableMap on widgets and
-	 * selected rows in the viewers, then has the viewers rewrite their
-	 * templated strings. The update handler is called to refresh all the
-	 * widgets from the map, and then the viewers are refreshed.
-	 */
-	private synchronized void resetDefaults() {
-		Collection<IUpdateModel> models = getModels();
-		for (IUpdateModel m : models) {
-			if (m instanceof ICellEditorUpdateModel) {
-				if (((ICellEditorUpdateModel) m).isChecked()) {
-					m.restoreDefault();
-				}
-			} else {
-				m.restoreDefault();
-			}
-		}
-		for (IUpdateModel m : models) {
-			if (m instanceof ViewerUpdateModel) {
-				((ViewerUpdateModel) m).storeValue();
-			}
-		}
-		updateHandler.handleUpdate(null, null);
-		for (Viewer v : viewers) {
-			v.refresh();
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/JAXBImportedScriptLaunchConfigurationTab.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/JAXBImportedScriptLaunchConfigurationTab.java
deleted file mode 100644
index a6faa1a..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/JAXBImportedScriptLaunchConfigurationTab.java
+++ /dev/null
@@ -1,310 +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.ui.launch;
-
-import java.io.BufferedReader;
-import java.io.EOFException;
-import java.io.File;
-import java.io.FileReader;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ptp.core.elements.IPQueue;
-import org.eclipse.ptp.launch.ui.extensions.RMLaunchValidation;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManager;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.ui.util.WidgetActionUtils;
-import org.eclipse.ptp.rm.jaxb.ui.util.WidgetBuilderUtils;
-import org.eclipse.ptp.rmsystem.IResourceManager;
-import org.eclipse.swt.SWT;
-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.graphics.Image;
-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.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Specialized Launch Tab for displaying (read only) custom batch scripts. To
- * edit scripts, they should be imported into the workspace. The selection of a
- * pre-existent file sets the SCRIPT_PATH variable in the environment which
- * overrides any SCRIPT content that may have been previously set.
- * 
- * @author arossi
- * 
- */
-public class JAXBImportedScriptLaunchConfigurationTab extends AbstractJAXBLaunchConfigurationTab implements SelectionListener {
-
-	private Text choice;
-	private Text editor;
-	private Button browseWorkspace;
-	private Button clear;
-
-	private String selected;
-	private final StringBuffer contents;
-
-	/**
-	 * @param rm
-	 *            the resource manager
-	 * @param dialog
-	 *            the ancestor main launch dialog
-	 * @param title
-	 *            to display in the parent TabFolder tab
-	 * @param parentTab
-	 *            the parent controller tab
-	 */
-	public JAXBImportedScriptLaunchConfigurationTab(IJAXBResourceManager rm, ILaunchConfigurationDialog dialog, String title,
-			JAXBControllerLaunchConfigurationTab parentTab) {
-		super(parentTab, dialog);
-		if (title != null) {
-			this.title = title;
-		}
-		contents = new StringBuffer();
-	}
-
-	/*
-	 * Nothing to validate here. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #canSave(org.eclipse.swt.widgets.Control,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	public RMLaunchValidation canSave(Control control, IResourceManager rm, IPQueue queue) {
-		return new RMLaunchValidation(true, null);
-	}
-
-	/*
-	 * Fixed construction of read-only text field and browse button for the
-	 * selection, a clear button to clear the choice, and a large text area for
-	 * displaying the script. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #createControl(org.eclipse.swt.widgets.Composite,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	public void createControl(final Composite parent, IResourceManager rm, IPQueue queue) throws CoreException {
-		control = WidgetBuilderUtils.createComposite(parent, 1);
-		GridLayout layout = WidgetBuilderUtils.createGridLayout(5, true);
-		GridData gd = WidgetBuilderUtils.createGridData(GridData.FILL_HORIZONTAL, true, false, 700, DEFAULT, 5, DEFAULT);
-		Composite comp = WidgetBuilderUtils.createComposite(control, SWT.NONE, layout, gd);
-		WidgetBuilderUtils.createLabel(comp, Messages.BatchScriptPath, SWT.LEFT, 1);
-		GridData gdsub = WidgetBuilderUtils.createGridData(GridData.FILL_HORIZONTAL, true, false, 275, DEFAULT, 2, DEFAULT);
-		String s = selected == null ? ZEROSTR : selected.toString();
-		choice = WidgetBuilderUtils.createText(comp, SWT.BORDER, gdsub, true, s);
-		browseWorkspace = WidgetBuilderUtils.createPushButton(comp, Messages.JAXBRMConfigurationSelectionWizardPage_1, this);
-		clear = WidgetBuilderUtils.createPushButton(comp, Messages.ClearScript, this);
-		layout = WidgetBuilderUtils.createGridLayout(5, true);
-		Group grp = WidgetBuilderUtils.createGroup(control, SWT.NONE, layout, null);
-		int style = SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL;
-		gdsub = WidgetBuilderUtils.createGridDataFill(700, 700, 5);
-		editor = WidgetBuilderUtils.createText(grp, style, gdsub, true, ZEROSTR, null, null);
-		WidgetBuilderUtils.applyMonospace(editor);
-		editor.addMouseListener(new MouseListener() {
-			public void mouseDoubleClick(MouseEvent e) {
-
-			}
-
-			public void mouseDown(MouseEvent e) {
-			}
-
-			public void mouseUp(MouseEvent e) {
-				MessageDialog.openWarning(parent.getShell(), Messages.ReadOnlyWarning_title, Messages.ReadOnlyWarning);
-			}
-		});
-
-		selected = null;
-		parentTab.resize(control);
-		updateControls();
-	}
-
-	/**
-	 * The top-level control.
-	 */
-	public Control getControl() {
-		return control;
-	}
-
-	@Override
-	public Image getImage() {
-		return null;
-	}
-
-	/**
-	 * @return title of tab.
-	 */
-	@Override
-	public String getText() {
-		return title;
-	}
-
-	/*
-	 * If there is a script path in the configuration, display that script.
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #initializeFrom(org.eclipse.swt.widgets.Control,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue,
-	 * org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public RMLaunchValidation initializeFrom(Control control, IResourceManager rm, IPQueue queue, ILaunchConfiguration configuration) {
-		try {
-			String uriStr = configuration.getAttribute(SCRIPT_PATH, ZEROSTR);
-			if (!ZEROSTR.equals(uriStr)) {
-				selected = uriStr;
-			} else {
-				selected = null;
-			}
-			uploadScript();
-		} catch (Throwable t) {
-			WidgetActionUtils.errorMessage(control.getShell(), t, Messages.ErrorOnLoadFromStore, Messages.ErrorOnLoadTitle, false);
-		}
-		return new RMLaunchValidation(true, null);
-	}
-
-	/*
-	 * Nothing to do here. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #isValid(org.eclipse.debug.core.ILaunchConfiguration,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	public RMLaunchValidation isValid(ILaunchConfiguration launchConfig, IResourceManager rm, IPQueue queue) {
-		return new RMLaunchValidation(true, null);
-	}
-
-	/*
-	 * Nothing to do here. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.launch.ui.extensions.IRMLaunchConfigurationDynamicTab
-	 * #setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy,
-	 * org.eclipse.ptp.rmsystem.IResourceManager,
-	 * org.eclipse.ptp.core.elements.IPQueue)
-	 */
-	public RMLaunchValidation setDefaults(ILaunchConfigurationWorkingCopy configuration, IResourceManager rm, IPQueue queue) {
-		return new RMLaunchValidation(true, null);
-	}
-
-	/*
-	 * Tab acts as listener for browse and clear buttons (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse
-	 * .swt.events.SelectionEvent)
-	 */
-	public void widgetDefaultSelected(SelectionEvent e) {
-		widgetSelected(e);
-	}
-
-	/*
-	 * Tab acts as listener for browse and clear buttons (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
-	 * .events.SelectionEvent)
-	 */
-	public void widgetSelected(SelectionEvent e) {
-		Object source = e.getSource();
-		try {
-			if (source == browseWorkspace) {
-				selected = WidgetActionUtils.browseWorkspace(control.getShell());
-				updateContents();
-			} else if (source == clear) {
-				selected = null;
-				updateContents();
-			}
-		} catch (Throwable t) {
-			WidgetActionUtils.errorMessage(control.getShell(), t, Messages.WidgetSelectedError, Messages.WidgetSelectedErrorTitle,
-					false);
-		}
-	}
-
-	/*
-	 * If there is a path selected, store it in the local map as the
-	 * SCRIPT_PATH.(non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.launch.AbstractJAXBLaunchConfigurationTab#
-	 * doRefreshLocal()
-	 */
-	@Override
-	protected void doRefreshLocal() {
-		if (selected != null) {
-			localMap.put(SCRIPT_PATH, selected);
-		}
-	}
-
-	/*
-	 * Reads in the script if the selected path is set, then notifies the
-	 * ResourcesTab of the change.
-	 */
-	private void updateContents() throws Throwable {
-		uploadScript();
-		fireContentsChanged();
-	}
-
-	/*
-	 * Display the selected path and the script if they are set; enable the
-	 * clear button if script is non-empty.
-	 */
-	private void updateControls() {
-		if (selected != null) {
-			choice.setText(selected);
-		} else {
-			choice.setText(ZEROSTR);
-		}
-		editor.setText(contents.toString());
-		if (ZEROSTR.equals(contents)) {
-			clear.setEnabled(false);
-		} else {
-			clear.setEnabled(true);
-		}
-	}
-
-	/*
-	 * If selected is set, read in the contents of the file with that path.
-	 * Calls #updateControls().
-	 */
-	private void uploadScript() throws Throwable {
-		contents.setLength(0);
-		if (null != selected) {
-			BufferedReader br = new BufferedReader(new FileReader(new File(selected)));
-			while (true) {
-				try {
-					String line = br.readLine();
-					if (line == null) {
-						break;
-					}
-					contents.append(line).append(LINE_SEP);
-				} catch (EOFException eof) {
-					break;
-				}
-			}
-		}
-		updateControls();
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/JAXBRMLaunchConfigurationFactory.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/JAXBRMLaunchConfigurationFactory.java
deleted file mode 100644
index 86d8251..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/launch/JAXBRMLaunchConfigurationFactory.java
+++ /dev/null
@@ -1,48 +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.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.jaxb.core.IJAXBResourceManager;
-import org.eclipse.ptp.rm.jaxb.core.rm.JAXBResourceManager;
-import org.eclipse.ptp.rm.jaxb.core.utils.CoreExceptionUtils;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.ptp.rmsystem.IResourceManager;
-
-/**
- * JAXB implementation. Provides the controller tab.
- * 
- * @author arossi
- * 
- */
-public class JAXBRMLaunchConfigurationFactory extends AbstractRMLaunchConfigurationFactory implements IJAXBUINonNLSConstants {
-
-	@Override
-	public Class<? extends IResourceManager> getResourceManagerClass() {
-		return JAXBResourceManager.class;
-	}
-
-	@Override
-	protected IRMLaunchConfigurationDynamicTab doCreate(IResourceManager rm, ILaunchConfigurationDialog dialog)
-			throws CoreException {
-		if (!(rm instanceof IJAXBResourceManager)) {
-			throw CoreExceptionUtils.newException(Messages.JAXBRMLaunchConfigurationFactory_wrongRMType + rm, null);
-		}
-		try {
-			return new JAXBControllerLaunchConfigurationTab((IJAXBResourceManager) rm, dialog);
-		} catch (Throwable t) {
-			throw CoreExceptionUtils.newException(Messages.JAXBRMLaunchConfigurationFactory_doCreateError + rm, t);
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/messages/Messages.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/messages/Messages.java
deleted file mode 100644
index dd2d8a7..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/messages/Messages.java
+++ /dev/null
@@ -1,111 +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.ui.messages;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rm.jaxb.ui.messages.messages"; //$NON-NLS-1$
-
-	public static String JAXBUIPlugin_Exception_InternalError;
-	public static String JAXBConnectionWizardPage_Description;
-	public static String JAXBRMControlConfigurationWizardPage_Title;
-	public static String JAXBRMMonitoringConfigurationWizardPage_Title;
-
-	public static String JAXBRMConfigurationImportWizard_createResourceManagersProject;
-
-	public static String JAXBRMConfigurationSelectionWizardPage_0;
-	public static String JAXBRMConfigurationSelectionWizardPage_1;
-	public static String JAXBRMConfigurationSelectionWizardPage_Project_Selection_Title;
-	public static String JAXBRMConfigurationSelectionWizardPage_Project_Selection_Message;
-
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_0;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_1;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_2;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_3;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_3b;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_4;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_5;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_6;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_7;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_8;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_9;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_10;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_11;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_12;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_13;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_14;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_15;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_16;
-	public static String AbstractRemoteProxyResourceManagerConfigurationWizardPage_17;
-
-	public static String Project_required;
-	public static String Enter_project_before_browsing_for_program;
-	public static String Program_selection;
-	public static String Choose_program_to_run_from_NAME;
-	public static String Selection_must_be_file;
-
-	public static String CustomBatchScriptTab_title;
-	public static String MXGroupTitle;
-	public static String ManualLaunch;
-
-	public static String ClearScript;
-	public static String BatchScriptPath;
-	public static String DefaultDynamicTab_title;
-	public static String ViewScript;
-	public static String ErrorOnLoadTitle;
-	public static String ErrorOnLoadFromStore;
-	public static String WidgetSelectedError;
-	public static String WidgetSelectedErrorTitle;
-	public static String MissingLaunchConfigurationError;
-	public static String JAXBRMLaunchConfigurationFactory_wrongRMType;
-	public static String JAXBRMLaunchConfigurationFactory_doCreateError;
-
-	public static String FileContentsDirty;
-	public static String ErrorOnCopyFromFields;
-	public static String WriteToFileCanceled;
-	public static String RenameFile;
-	public static String RenameFileTitle;
-	public static String DefaultValues;
-	public static String ToggleShowHideSelectedAttributes;
-	public static String DialogClose;
-	public static String DisplayScript;
-	public static String DisplayScriptError;
-	public static String DisplayScriptErrorTitle;
-	public static String ViewerLabelProviderColumnError;
-	public static String ScriptNotSupportedWarning;
-	public static String ScriptNotSupportedWarning_title;
-	public static String CreateControlConfigurableError;
-	public static String ReadOnlyWarning;
-	public static String ReadOnlyWarning_title;
-
-	public static String ValidationError;
-	public static String ValidationError_title;
-	public static String InvalidConfiguration;
-	public static String InvalidConfiguration_title;
-
-	public static String ConfigurationImportWizardTitle;
-	public static String ConfigurationImportWizardPageTitle;
-	public static String ConfigurationImportWizardPageDescription;
-	public static String ConfigurationImportWizardPageTooltip;
-	public static String ConfigurationImportWizardPageLabel;
-	public static String ResourceManagersNotExist;
-	public static String ResourceManagersNotExist_title;
-
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		// Prevent instances.
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/messages/messages.properties b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/messages/messages.properties
deleted file mode 100644
index 7c5cc94..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/messages/messages.properties
+++ /dev/null
@@ -1,85 +0,0 @@
-JAXBRMLaunchConfigurationFactory_wrongRMType=Could not create launch tab: incorrect Resource Manager type: 
-JAXBRMLaunchConfigurationFactory_doCreateError=Problem instantiating ResourceManager
-
-JAXBUIPlugin_Exception_InternalError=Internal error
-JAXBConnectionWizardPage_Description=Enter connection information
-JAXBRMControlConfigurationWizardPage_Title=Control Connection configuration
-JAXBRMMonitoringConfigurationWizardPage_Title=Monitoring Connection configuration
-
-JAXBRMConfigurationImportWizard_createResourceManagersProject=Do you wish to create a "resourceManagers" project now?
-JAXBRMConfigurationSelectionWizardPage_0=Select File
-JAXBRMConfigurationSelectionWizardPage_1=Browse Workspace
-JAXBRMConfigurationSelectionWizardPage_Project_Selection_Title=Local Project Selection
-JAXBRMConfigurationSelectionWizardPage_Project_Selection_Message=Choose the local project to browse
-Project_required=Please select the project first
-Enter_project_before_browsing_for_program=Enter project before browsing for program
-Program_selection=Program Selection
-Choose_program_to_run_from_NAME=Choose program to run
-Selection_must_be_file=Selection must be file
-
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_0=Cancelled by user
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_1=Connection Error
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_2=Could not open connection
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_3=Connection Error
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_3b=Share Connection
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_4=Remote service provider:
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_5=Connection name:
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_6=New...
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_7=Path to service executable:
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_8=Browse
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_9=Executable Options...
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_10=Tunneling Options
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_11=None
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_12=Local address for connection:
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_13=SSH port forwarding
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_14=Service Options
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_15=Extra service command-line arguments:
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_16=Select service executable
-AbstractRemoteProxyResourceManagerConfigurationWizardPage_17=Invalid service executable
-
-ConfigurationImportWizardTitle=JAXB Resource Manager XML Configuration Import Wizard
-ConfigurationImportWizardPageTitle=Import Configuration XML From Plugin
-ConfigurationImportWizardPageDescription=Import a JAXB Resource Manager XML configuration from a plugin into the workspace.
-ConfigurationImportWizardPageTooltip=To import or export configurations from remote or local file systems, use the wizards in General/FileSystem or RemoteSystems.
-ConfigurationImportWizardPageLabel=Select a configuration to import: 
-
-ValidationError=The value entered is not valid; value will be reset to previous
-ValidationError_title=Invalid Value
-InvalidConfiguration=The XML for the following resource manager(s) is invalid and thus was skipped:
-InvalidConfiguration_title=Invalid Resource Manager XML
-
-ViewerLabelProviderColumnError=Selected column is greater than number of columns
-
-ScriptNotSupportedWarning=This Resource Manager does not generate a submission script
-ScriptNotSupportedWarning_title=Inapplicable Request
-
-ResourceManagersNotExist=To import a resource manager configuration, you must first create a "resourceManagers" project in your workspace.
-ResourceManagersNotExist_title=Missing 'resourceManagers' project
-
-ErrorOnLoadFromStore=Problem loading values from configuration 
-ErrorOnCopyFromFields=Problem copying values from widgets 
-DefaultValues=Restore Defaults
-
-CustomBatchScriptTab_title=Custom Batch Script Editor
-MXGroupTitle=mxGroup
-ManualLaunch=Launch server manually
-ClearScript=Clear Script
-BatchScriptPath=Script Path:
-DefaultDynamicTab_title=Standard Job Configuration 
-ViewScript=View Script
-ErrorOnLoadTitle=Load Values Error
-WidgetSelectedError=Could not complete widget selection action
-WidgetSelectedErrorTitle=Widget Selected Error
-MissingLaunchConfigurationError=Missing launch configuration
-FileContentsDirty=File contents have been changed but not saved.
-WriteToFileCanceled=Write to file canceled
-RenameFile=New File Path: 
-RenameFileTitle=Rename File
-ToggleShowHideSelectedAttributes=Show Only Checked Items
-DialogClose=Close
-DisplayScript=Script with current values
-DisplayScriptError=Problem with generating script
-DisplayScriptErrorTitle=Display script error
-CreateControlConfigurableError=createControl for the Configurable Attributes Tab failed
-ReadOnlyWarning=Editor window is for display only; to edit script, import it into the workspace.
-ReadOnlyWarning_title=Cannot Edit
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/AbstractUpdateModel.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/AbstractUpdateModel.java
deleted file mode 100644
index 36d29cc..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/AbstractUpdateModel.java
+++ /dev/null
@@ -1,163 +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.ui.model;
-
-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.ptp.remote.core.IRemoteFileManager;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.core.data.ValidatorType;
-import org.eclipse.ptp.rm.jaxb.core.variables.LCVariableMap;
-import org.eclipse.ptp.rm.jaxb.ui.IUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.ui.util.WidgetActionUtils;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * Base class for implementations of the IUpdateModel controlling the data
- * associated with a widget or cell editor.
- * 
- * @author arossi
- * 
- */
-public abstract class AbstractUpdateModel implements IUpdateModel, IJAXBNonNLSConstants {
-
-	/**
-	 * Used with ModifyListeners so as to avoid a save on every keystroke.
-	 * 
-	 * @author arossi
-	 */
-	protected class ValidateJob extends UIJob {
-		public ValidateJob() {
-			super(VALIDATE);
-		}
-
-		@Override
-		public IStatus runInUIThread(IProgressMonitor monitor) {
-			storeValue();
-			return Status.OK_STATUS;
-		}
-	}
-
-	protected final Job validateJob;
-
-	protected boolean canSave;
-	protected String name;
-	protected LCVariableMap lcMap;
-	protected ValueUpdateHandler handler;
-	protected boolean refreshing;
-	protected ValidatorType validator;
-	protected IRemoteFileManager remoteFileManager;
-	protected String defaultValue;
-	protected Object mapValue;
-
-	/**
-	 * @param name
-	 *            name of the model, which will correspond to the name of a
-	 *            Property or Attribute if the widget value is to be saved.
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 */
-	protected AbstractUpdateModel(String name, ValueUpdateHandler handler) {
-		this.name = name;
-		canSave = (name != null && !ZEROSTR.equals(name));
-		this.handler = handler;
-		refreshing = false;
-		validateJob = new ValidateJob();
-	}
-
-	/**
-	 * @return The widget or cell editor.
-	 */
-	public abstract Object getControl();
-
-	/**
-	 * @return name of the model, which will correspond to the name of a
-	 *         Property or Attribute if the widget value is to be saved.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * If this widget saves its value to a Property of Attribute, then the
-	 * default value here is retrieved. The widget value is then refreshed from
-	 * the map, and if the value is <code>null</code>, the default value is
-	 * restored to the map and another refresh is called on the actual value.
-	 */
-	public void initialize(LCVariableMap lcMap) {
-		this.lcMap = lcMap;
-		if (name != null) {
-			defaultValue = lcMap.getDefault(name);
-		}
-		refreshValueFromMap();
-		if (mapValue == null) {
-			restoreDefault();
-			refreshValueFromMap();
-		}
-	}
-
-	/**
-	 * Sets the actual value in the current environment to the default value.
-	 */
-	public void restoreDefault() {
-		lcMap.put(name, defaultValue);
-	}
-
-	/**
-	 * @validator JAXB data element describing either regex or efs validation
-	 *            for the widget value.
-	 * @remoteFileManager provided in case the validation is to be done on a
-	 *                    file path.
-	 */
-	public void setValidator(ValidatorType validator, IRemoteFileManager remoteFileManager) {
-		this.validator = validator;
-		this.remoteFileManager = remoteFileManager;
-	}
-
-	/**
-	 * Delegates to the handler update method.
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler#handleUpdate(Object,
-	 *      Object)
-	 * 
-	 * @param value
-	 *            updated value (currently unused)
-	 */
-	protected void handleUpdate(Object value) {
-		handler.handleUpdate(getControl(), value);
-	}
-
-	/**
-	 * Retrieves the value from the control, validates if there is a validator
-	 * set, then writes to the current environment map and calls the update
-	 * handler.
-	 */
-	protected void storeValue() {
-		Object value = getValueFromControl();
-		if (validator != null) {
-			try {
-				WidgetActionUtils.validate(String.valueOf(value), validator, remoteFileManager);
-			} catch (Exception t) {
-				WidgetActionUtils.errorMessage(Display.getCurrent().getActiveShell(), t, Messages.ValidationError,
-						Messages.ValidationError_title, false);
-				refreshValueFromMap();
-				return;
-			}
-		}
-		lcMap.put(name, value);
-		handleUpdate(value);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/ButtonUpdateModel.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/ButtonUpdateModel.java
deleted file mode 100644
index ff9e887..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/ButtonUpdateModel.java
+++ /dev/null
@@ -1,108 +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.ui.model;
-
-import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Button;
-
-/**
- * Update Model for Button widgets.
- * 
- * @author arossi
- * 
- */
-public class ButtonUpdateModel extends AbstractUpdateModel implements SelectionListener {
-
-	private final Button button;
-
-	/**
-	 * @param name
-	 *            name of the model, which will correspond to the name of a
-	 *            Property or Attribute if the widget value is to be saved.
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 * @param button
-	 *            the widget to which this model corresponds
-	 */
-	public ButtonUpdateModel(String name, ValueUpdateHandler handler, Button button) {
-		super(name, handler);
-		this.button = button;
-		button.addSelectionListener(this);
-	}
-
-	@Override
-	public Object getControl() {
-		return button;
-	}
-
-	/*
-	 * @return Boolean value of the selection (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#getValueFromControl()
-	 */
-	public Object getValueFromControl() {
-		return button.getSelection();
-	}
-
-	/*
-	 * Sets the selection on the button after translating the value from the
-	 * current environment. Turns on the refreshing flag so as not to trigger
-	 * further updates from the listener. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#refreshValueFromMap()
-	 */
-	public void refreshValueFromMap() {
-		refreshing = true;
-		mapValue = lcMap.get(name);
-		boolean b = false;
-		if (mapValue != null) {
-			if (mapValue instanceof String) {
-				b = Boolean.parseBoolean((String) mapValue);
-			} else {
-				b = (Boolean) mapValue;
-			}
-		}
-		button.setSelection(b);
-		refreshing = false;
-	}
-
-	/*
-	 * Model serves as widget selection listener: calls {@link #storeValue()}
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse
-	 * .swt.events.SelectionEvent)
-	 */
-	public void widgetDefaultSelected(SelectionEvent e) {
-		if (refreshing) {
-			return;
-		}
-		storeValue();
-	}
-
-	/*
-	 * Model serves as widget selection listener: calls {@link #storeValue()}
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
-	 * .events.SelectionEvent)
-	 */
-	public void widgetSelected(SelectionEvent e) {
-		if (refreshing) {
-			return;
-		}
-		storeValue();
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/CellEditorUpdateModel.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/CellEditorUpdateModel.java
deleted file mode 100644
index 29ad9dc..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/CellEditorUpdateModel.java
+++ /dev/null
@@ -1,420 +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.ui.model;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CheckboxCellEditor;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.ICheckable;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.ptp.rm.jaxb.core.variables.LCVariableMap;
-import org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.cell.SpinnerCellEditor;
-import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Specialized base class for the Viewer cell editor models.
- * 
- * @author arossi
- * 
- */
-public abstract class CellEditorUpdateModel extends AbstractUpdateModel implements ICellEditorUpdateModel {
-
-	protected boolean readOnly;
-	protected String tooltip;
-	protected String description;
-	protected String status;
-	protected Color[] foreground;
-	protected Color[] background;
-	protected Font[] font;
-	protected CellEditor editor;
-	protected ViewerUpdateModel viewer;
-
-	protected String stringValue;
-	protected int index;
-	protected String[] items;
-	protected boolean booleanValue;
-	protected int integerValue;
-
-	/**
-	 * @param name
-	 *            of the model, which will correspond to the name of a Property
-	 *            or Attribute the value is to be saved to
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 * @param editor
-	 *            the cell editor for the value cell
-	 * @param items
-	 *            if this is a combo editor, the selection items
-	 * @param readOnly
-	 *            if this is a text box, whether it is editable
-	 * @param tooltip
-	 *            to display
-	 * @param description
-	 *            to display
-	 * @param status
-	 *            the attribute's status value, if any
-	 */
-	protected CellEditorUpdateModel(String name, ValueUpdateHandler handler, CellEditor editor, String[] items, boolean readOnly,
-			String tooltip, String description, String status) {
-		super(name, handler);
-		this.editor = editor;
-		this.readOnly = readOnly;
-		this.items = items;
-		this.tooltip = tooltip;
-		this.description = description;
-		this.status = status;
-	}
-
-	/*
-	 * The combo cell editor does not allow write-ins. So effectively the only
-	 * widget which can be "read-only" is a text box. We must allow edit on the
-	 * others for them to appear. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#canEdit()
-	 */
-	public boolean canEdit() {
-		return isChecked() && !((editor instanceof TextCellEditor) && readOnly);
-	}
-
-	/*
-	 * Return the background color for the column, if set. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.ITableColorProvider#getBackground(java.lang
-	 * .Object, int)
-	 */
-	public Color getBackground(Object element, int columnIndex) {
-		if (background == null) {
-			return null;
-		}
-		return background[columnIndex];
-	}
-
-	/*
-	 * The cell editor for this row or node. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#getCellEditor()
-	 */
-	public CellEditor getCellEditor() {
-		return editor;
-	}
-
-	public Image getColumnImage(String columnName) {
-		return null;
-	}
-
-	/*
-	 * Returns cell editor. @see #getCellEditor() (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.AbstractUpdateModel#getControl()
-	 */
-	@Override
-	public Object getControl() {
-		return editor;
-	}
-
-	/*
-	 * Returns the description string. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.IColumnViewerLabelSupport#getDescription()
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/*
-	 * Return the font for the column, if set. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object,
-	 * int)
-	 */
-	public Font getFont(Object element, int columnIndex) {
-		if (font == null) {
-			return null;
-		}
-		return font[columnIndex];
-	}
-
-	/*
-	 * Return the foreground color for the column, if set. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object,
-	 * int)
-	 */
-	public Color getForeground(Object element, int columnIndex) {
-		if (foreground == null) {
-			return null;
-		}
-		return foreground[columnIndex];
-	}
-
-	/*
-	 * For generating a templated string using all the names and values in the
-	 * viewer rows. Skips non-checked items. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#getReplacedValue(java
-	 * .lang.String)
-	 */
-	public String getReplacedValue(String pattern) {
-		if (!isChecked()) {
-			return ZEROSTR;
-		}
-		String value = getValueAsString();
-		if (ZEROSTR.equals(value)) {
-			return ZEROSTR;
-		}
-		String result = pattern.replaceAll(NAME_TAG, name);
-		result = result.replaceAll(VALUE_TAG, value);
-		return result;
-	}
-
-	/*
-	 * Returns the tooltip string. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#getTooltip()
-	 */
-	public String getTooltip() {
-		return tooltip;
-	}
-
-	/**
-	 * @return the type of the value (Boolean, Integer or String)
-	 */
-	public String getType() {
-		if (editor instanceof CheckboxCellEditor) {
-			return Boolean.TYPE.getCanonicalName();
-		} else if (editor instanceof SpinnerCellEditor) {
-			return Integer.TYPE.getCanonicalName();
-		}
-		return STRING;
-	}
-
-	/*
-	 * The editor needs the selection index for a combo box; otherwise the value
-	 * is of the same type as the stored value. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#getValueForEditor()
-	 */
-	public Object getValueForEditor() {
-		if (editor instanceof TextCellEditor) {
-			return stringValue;
-		} else if (editor instanceof CheckboxCellEditor) {
-			return booleanValue;
-		} else if (editor instanceof SpinnerCellEditor) {
-			return integerValue;
-		} else if (editor instanceof ComboBoxCellEditor) {
-			return index;
-		}
-		return null;
-	}
-
-	/*
-	 * The most recent update on the map value (@see #setValueFromEditor)
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#getValueFromControl()
-	 */
-	public Object getValueFromControl() {
-		return mapValue;
-	}
-
-	/*
-	 * Also sets whether this model is currently on a checked viewer item.
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.model.AbstractUpdateModel#initialize(org.eclipse
-	 * .ptp.rm.jaxb.core.variables.LCVariableMap)
-	 */
-	@Override
-	public void initialize(LCVariableMap lcMap) {
-		super.initialize(lcMap);
-		this.lcMap = lcMap;
-	}
-
-	/*
-	 * Whether the model item is checked in the viewer. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#isChecked()
-	 */
-	public boolean isChecked() {
-		return ((ICheckable) viewer.getControl()).getChecked(this);
-	}
-
-	/*
-	 * Casts or converts the map value to the proper type to set it to the
-	 * correct internal field. For combo box editors both the string value of
-	 * the selection and the index are maintained.(non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#refreshValueFromMap()
-	 */
-	public void refreshValueFromMap() {
-		refreshing = true;
-		mapValue = lcMap.get(name);
-		if (editor instanceof TextCellEditor) {
-			stringValue = ZEROSTR;
-			if (mapValue != null) {
-				stringValue = (String) mapValue;
-			}
-		} else if (editor instanceof CheckboxCellEditor) {
-			booleanValue = false;
-			if (mapValue != null) {
-				if (mapValue instanceof String) {
-					booleanValue = Boolean.parseBoolean((String) mapValue);
-				} else {
-					booleanValue = (Boolean) mapValue;
-				}
-			}
-		} else if (editor instanceof SpinnerCellEditor) {
-			SpinnerCellEditor e = (SpinnerCellEditor) editor;
-			integerValue = e.getMin();
-			if (mapValue != null) {
-				if (mapValue instanceof String) {
-					integerValue = Integer.parseInt((String) mapValue);
-				} else {
-					integerValue = (Integer) mapValue;
-				}
-			}
-		} else if (editor instanceof ComboBoxCellEditor) {
-			if (mapValue == null) {
-				index = UNDEFINED;
-				stringValue = ZEROSTR;
-			} else {
-				stringValue = (String) mapValue;
-				for (int i = 0; i < items.length; i++) {
-					if (items[i].equals(stringValue)) {
-						index = i;
-						break;
-					}
-				}
-				if (index == items.length) {
-					index = UNDEFINED;
-					stringValue = ZEROSTR;
-				}
-			}
-		}
-		refreshing = false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#setBackground(org.eclipse
-	 * .swt.graphics.Color[])
-	 */
-	public void setBackground(Color[] background) {
-		this.background = background;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#setFont(org.eclipse
-	 * .swt.graphics.Font[])
-	 */
-	public void setFont(Font[] font) {
-		this.font = font;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#setForeground(org.eclipse
-	 * .swt.graphics.Color[])
-	 */
-	public void setForeground(Color[] foreground) {
-		this.foreground = foreground;
-	}
-
-	/*
-	 * Casts the value to its appropriate field. For combo boxes, also sets the
-	 * selection string from the index. Calls storeValue on the viewer to update
-	 * the viewer template string; this in turn calls #getReplacedValue on all
-	 * its cell models. Finishes with call to store value on the current cell
-	 * value.(non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#setValueFromEditor(
-	 * java.lang.Object)
-	 */
-	public void setValueFromEditor(Object value) {
-		if (editor instanceof TextCellEditor) {
-			stringValue = ZEROSTR;
-			if (value != null) {
-				stringValue = (String) value;
-			}
-			mapValue = stringValue;
-		} else if (editor instanceof CheckboxCellEditor) {
-			if (value == null) {
-				booleanValue = false;
-			} else {
-				booleanValue = (Boolean) value;
-			}
-			mapValue = booleanValue;
-		} else if (editor instanceof SpinnerCellEditor) {
-			SpinnerCellEditor e = (SpinnerCellEditor) editor;
-			if (value == null) {
-				integerValue = e.getMin();
-			} else {
-				integerValue = (Integer) value;
-			}
-			mapValue = integerValue;
-		} else if (editor instanceof ComboBoxCellEditor) {
-			if (value == null || ((Integer) value) == UNDEFINED) {
-				index = UNDEFINED;
-				stringValue = ZEROSTR;
-			} else {
-				index = (Integer) value;
-				stringValue = items[index];
-			}
-			mapValue = stringValue;
-		}
-		viewer.storeValue();
-		storeValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel#setViewer(org.eclipse
-	 * .ptp.rm.jaxb.ui.model.ViewerUpdateModel)
-	 */
-	public void setViewer(ViewerUpdateModel viewer) {
-		this.viewer = viewer;
-	}
-
-	/**
-	 * @return appropriate string value for current editor value.
-	 */
-	protected String getValueAsString() {
-		if (editor instanceof TextCellEditor || editor instanceof ComboBoxCellEditor) {
-			return stringValue;
-		} else if (editor instanceof CheckboxCellEditor) {
-			return String.valueOf(booleanValue);
-		} else if (editor instanceof SpinnerCellEditor) {
-			return String.valueOf(integerValue);
-		}
-		return ZEROSTR;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/ComboUpdateModel.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/ComboUpdateModel.java
deleted file mode 100644
index dbb4ab4..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/ComboUpdateModel.java
+++ /dev/null
@@ -1,126 +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.ui.model;
-
-import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
-import org.eclipse.ptp.rm.jaxb.ui.util.WidgetActionUtils;
-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.widgets.Combo;
-
-/**
- * Update Model for Combo widgets.
- * 
- * @author arossi
- * 
- */
-public class ComboUpdateModel extends AbstractUpdateModel implements ModifyListener, SelectionListener {
-
-	private final Combo combo;
-
-	/**
-	 * @param name
-	 *            name of the model, which will correspond to the name of a
-	 *            Property or Attribute if the widget value is to be saved.
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 * @param combo
-	 *            the widget to which this model corresponds
-	 */
-	public ComboUpdateModel(String name, ValueUpdateHandler handler, Combo combo) {
-		super(name, handler);
-		this.combo = combo;
-		this.combo.addModifyListener(this);
-		this.combo.addSelectionListener(this);
-	}
-
-	@Override
-	public Object getControl() {
-		return combo;
-	}
-
-	/*
-	 * @return value of the selection (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#getValueFromControl()
-	 */
-	public Object getValueFromControl() {
-		return WidgetActionUtils.getSelected(combo);
-	}
-
-	/*
-	 * Model serves as widget modify listener; uses the ValidateJob to delay
-	 * processing of text. Sets refreshing flag to block further updates being
-	 * triggered during the refresh. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events
-	 * .ModifyEvent)
-	 */
-	public void modifyText(ModifyEvent e) {
-		if (refreshing) {
-			return;
-		}
-		validateJob.cancel();
-		validateJob.schedule(VALIDATE_TIMER);
-	}
-
-	/*
-	 * Sets the map value one the combo. Sets refreshing flag to block further
-	 * updates being triggered during the refresh. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#refreshValueFromMap()
-	 */
-	public void refreshValueFromMap() {
-		refreshing = true;
-		mapValue = lcMap.get(name);
-		String s = ZEROSTR;
-		if (mapValue != null) {
-			s = (String) mapValue;
-		}
-		s = WidgetActionUtils.select(combo, s);
-		refreshing = false;
-	}
-
-	/*
-	 * Model serves as widget selection listener; calls {@link #storeValue()}
-	 * Sets refreshing flag to block further updates being triggered during the
-	 * refresh. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse
-	 * .swt.events.SelectionEvent)
-	 */
-	public void widgetDefaultSelected(SelectionEvent e) {
-		if (refreshing) {
-			return;
-		}
-		storeValue();
-	}
-
-	/*
-	 * Model serves as widget selection listener; calls {@link #storeValue()}
-	 * Sets refreshing flag to block further updates being triggered during the
-	 * refresh. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse
-	 * .swt.events.SelectionEvent)
-	 */
-	public void widgetSelected(SelectionEvent e) {
-		if (refreshing) {
-			return;
-		}
-		storeValue();
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/DynamicControlUpdateModel.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/DynamicControlUpdateModel.java
deleted file mode 100644
index 6cf2ad3..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/DynamicControlUpdateModel.java
+++ /dev/null
@@ -1,79 +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.ui.model;
-
-import java.util.List;
-
-import org.eclipse.ptp.rm.jaxb.core.data.ArgType;
-import org.eclipse.ptp.rm.jaxb.core.data.impl.ArgImpl;
-import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
-
-/**
- * Base class for special model type which can be read-only. In the latter case,
- * it has a list of args which must be resolved using the refreshed environment,
- * but it does not store a value. If it is instead provided with a
- * name/reference, it acts in the default manner, refreshing and storing the
- * value entered.
- * 
- * @author arossi
- * 
- */
-public abstract class DynamicControlUpdateModel extends AbstractUpdateModel {
-
-	protected List<ArgType> dynamic;
-
-	/**
-	 * Constructor for read-only widget.
-	 * 
-	 * @param dynamic
-	 *            arguments which need to be resolved using the refreshed
-	 *            environment.
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 */
-	protected DynamicControlUpdateModel(List<ArgType> dynamic, ValueUpdateHandler handler) {
-		super(ZEROSTR, handler);
-		this.dynamic = dynamic;
-	}
-
-	/**
-	 * Default constructor for editable widget.
-	 * 
-	 * @param name
-	 *            name of the model, which will correspond to the name of a
-	 *            Property or Attribute if the widget value is to be saved.
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 */
-	protected DynamicControlUpdateModel(String name, ValueUpdateHandler handler) {
-		super(name, handler);
-	}
-
-	/**
-	 * @return the string which results from resolving the arguments.
-	 */
-	protected String getResolvedDynamic() {
-		return ArgImpl.toString(null, dynamic, lcMap);
-	}
-
-	/*
-	 * Only saves for editable subclasses. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.AbstractUpdateModel#storeValue()
-	 */
-	@Override
-	protected void storeValue() {
-		if (canSave) {
-			super.storeValue();
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/InfoTreeNodeModel.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/InfoTreeNodeModel.java
deleted file mode 100644
index 3b1c555..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/InfoTreeNodeModel.java
+++ /dev/null
@@ -1,159 +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.ui.model;
-
-import org.eclipse.ptp.rm.jaxb.ui.IColumnViewerLabelSupport;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The only model without a widget or editor. Used to display information nodes
- * in a Tree Viewer.
- * 
- * @author arossi
- * 
- */
-public class InfoTreeNodeModel implements IColumnViewerLabelSupport, IJAXBUINonNLSConstants {
-	private final String id;
-	private final String displayCol;
-	private final ValueTreeNodeUpdateModel parent;
-
-	/**
-	 * @param parent
-	 *            the main (editable) node entry for the Property or Attribute
-	 * @param id
-	 *            what field of the data object this node represents
-	 * @param inValueCol
-	 *            whether to display the field value in the Value column of the
-	 *            viewer. (<code>false</code> means that its value displays in a
-	 *            column whose name matches the id.
-	 */
-	public InfoTreeNodeModel(ValueTreeNodeUpdateModel parent, String id, boolean inValueCol) {
-		this.parent = parent;
-		this.id = id;
-		if (inValueCol) {
-			this.displayCol = COLUMN_VALUE;
-		} else {
-			this.displayCol = id;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.ITableColorProvider#getBackground(java.lang
-	 * .Object, int)
-	 */
-	public Color getBackground(Object element, int columnIndex) {
-		return parent.getBackground(element, columnIndex);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.IColumnViewerLabelSupport#getColumnImage(java
-	 * .lang.String)
-	 */
-	public Image getColumnImage(String columnName) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.IColumnViewerLabelSupport#getDescription()
-	 */
-	public String getDescription() {
-		return parent.getDescription();
-	}
-
-	/*
-	 * Display name of this field (=id) in the name column, and its value either
-	 * in the value column or in the column which matches its id. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.IColumnViewerLabelSupport#getDisplayValue(
-	 * java.lang.String)
-	 */
-	public String getDisplayValue(String columnName) {
-		String displayValue = null;
-		if (COLUMN_NAME.equals(columnName)) {
-			displayValue = id;
-		} else if (displayCol.equals(columnName)) {
-			if (parent.isChecked()) {
-				if (COLUMN_DESC.equals(id)) {
-					displayValue = parent.getDescription();
-				} else if (COLUMN_DEFAULT.equals(id)) {
-					displayValue = parent.getDefault();
-				} else if (COLUMN_TYPE.equals(id)) {
-					displayValue = parent.getType();
-				} else if (COLUMN_VALUE.equals(id)) {
-					displayValue = parent.getValueAsString();
-				} else if (COLUMN_STATUS.equals(id)) {
-					displayValue = parent.getStatus();
-				}
-			}
-		}
-		if (displayValue == null) {
-			return ZEROSTR;
-		}
-		return displayValue;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object,
-	 * int)
-	 */
-	public Font getFont(Object element, int columnIndex) {
-		return parent.getFont(element, columnIndex);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.ITableColorProvider#getForeground(java.lang
-	 * .Object, int)
-	 */
-	public Color getForeground(Object element, int columnIndex) {
-		return parent.getForeground(element, columnIndex);
-	}
-
-	/**
-	 * @return the main (editable) node entry for the Property or Attribute
-	 */
-	public ValueTreeNodeUpdateModel getParent() {
-		return parent;
-	}
-
-	/*
-	 * Display the tooltip only on the name node; if this is the description
-	 * node, display that. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IColumnViewerLabelSupport#getTooltip()
-	 */
-	public String getTooltip() {
-		String ttip = null;
-		if (COLUMN_NAME.equals(id)) {
-			ttip = parent.getTooltip();
-		} else if (COLUMN_DESC.equals(id)) {
-			ttip = parent.getDescription();
-		}
-		return ttip;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/SpinnerUpdateModel.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/SpinnerUpdateModel.java
deleted file mode 100644
index d769c36..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/SpinnerUpdateModel.java
+++ /dev/null
@@ -1,94 +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.ui.model;
-
-import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Spinner;
-
-/**
- * Update Model for Spinner widgets.
- * 
- * @author arossi
- * 
- */
-public class SpinnerUpdateModel extends AbstractUpdateModel implements ModifyListener {
-
-	private final Spinner spinner;
-
-	/**
-	 * @param name
-	 *            name of the model, which will correspond to the name of a
-	 *            Property or Attribute if the widget value is to be saved.
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 * @param spinner
-	 *            the widget to which this model corresponds
-	 */
-	public SpinnerUpdateModel(String name, ValueUpdateHandler handler, Spinner spinner) {
-		super(name, handler);
-		this.spinner = spinner;
-		spinner.addModifyListener(this);
-	}
-
-	@Override
-	public Object getControl() {
-		return spinner;
-	}
-
-	/*
-	 * @return Integer value of the selection (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#getValueFromControl()
-	 */
-	public Object getValueFromControl() {
-		return spinner.getSelection();
-	}
-
-	/*
-	 * Model serves as widget modify listener; calls {@link #storeValue()}
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events
-	 * .ModifyEvent)
-	 */
-	public void modifyText(ModifyEvent e) {
-		if (refreshing) {
-			return;
-		}
-		storeValue();
-	}
-
-	/*
-	 * Sets the value on the spinner after translating from the current
-	 * environment. If <code>null</code>, resets spinner to minimum value. Turns
-	 * on the refreshing flag so as not to trigger further updates from the
-	 * listener. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#refreshValueFromMap()
-	 */
-	public void refreshValueFromMap() {
-		refreshing = true;
-		mapValue = lcMap.get(name);
-		int i = spinner.getMinimum();
-		if (mapValue != null) {
-			if (mapValue instanceof String) {
-				i = Integer.parseInt((String) mapValue);
-			} else {
-				i = (Integer) mapValue;
-			}
-		}
-		spinner.setSelection(i);
-		refreshing = false;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/TableRowUpdateModel.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/TableRowUpdateModel.java
deleted file mode 100644
index b2e4091..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/TableRowUpdateModel.java
+++ /dev/null
@@ -1,98 +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.ui.model;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.ptp.rm.jaxb.core.data.AttributeType;
-import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
-
-/**
- * Cell editor for Table Viewer.
- * 
- * @author arossi
- * 
- */
-public class TableRowUpdateModel extends CellEditorUpdateModel {
-
-	/**
-	 * Cell editor model for Table row with underlying Property data.
-	 * 
-	 * @param name
-	 *            of the model, which will correspond to the name of a Property
-	 *            or Attribute the value is to be saved to
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 * @param editor
-	 *            the cell editor for the value cell
-	 * @param items
-	 *            if this is a combo editor, the selection items
-	 * @param readOnly
-	 *            if this is a text box, whether it is editable
-	 */
-	public TableRowUpdateModel(String name, ValueUpdateHandler handler, CellEditor editor, String[] items, boolean readOnly) {
-		super(name, handler, editor, items, readOnly, ZEROSTR, ZEROSTR, ZEROSTR);
-	}
-
-	/**
-	 * * Cell editor model for Table row with underlying Attribute data.
-	 * 
-	 * @param name
-	 *            of the model, which will correspond to the name of a Property
-	 *            or Attribute the value is to be saved to
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 * @param editor
-	 *            the cell editor for the value cell
-	 * @param items
-	 *            if this is a combo editor, the selection items
-	 * @param readOnly
-	 *            if this is a text box, whether it is editable
-	 * @param data
-	 *            the Attribute object
-	 */
-	public TableRowUpdateModel(String name, ValueUpdateHandler handler, CellEditor editor, String[] items, boolean readOnly,
-			AttributeType data) {
-		super(name, handler, editor, items, readOnly, data.getTooltip(), data.getDescription(), data.getStatus());
-	}
-
-	/*
-	 * For a table row, the field to access on the model corresponds to the
-	 * column name. If the item is not checked, an empty string is
-	 * returned.(non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.IColumnViewerLabelSupport#getDisplayValue(
-	 * java.lang.String)
-	 */
-	public String getDisplayValue(String columnName) {
-		String displayValue = null;
-		if (COLUMN_NAME.equals(columnName)) {
-			displayValue = name;
-		} else if (isChecked()) {
-			if (COLUMN_DESC.equals(columnName)) {
-				displayValue = description;
-			} else if (COLUMN_DEFAULT.equals(columnName)) {
-				displayValue = defaultValue;
-			} else if (COLUMN_TYPE.equals(columnName)) {
-				displayValue = getType();
-			} else if (COLUMN_VALUE.equals(columnName)) {
-				displayValue = getValueAsString();
-			} else if (COLUMN_STATUS.equals(columnName)) {
-				displayValue = status;
-			}
-		}
-		if (displayValue == null) {
-			return ZEROSTR;
-		}
-		return displayValue;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/TextUpdateModel.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/TextUpdateModel.java
deleted file mode 100644
index 642c8f0..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/TextUpdateModel.java
+++ /dev/null
@@ -1,117 +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.ui.model;
-
-import java.util.List;
-
-import org.eclipse.ptp.rm.jaxb.core.data.ArgType;
-import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Update Model for Text widgets.
- * 
- * @author arossi
- * 
- */
-public class TextUpdateModel extends DynamicControlUpdateModel implements ModifyListener {
-
-	private final Text text;
-
-	/**
-	 * Read-only dynamic text.
-	 * 
-	 * @param args
-	 *            to be resolved in refreshed environment and used as the text
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 * @param text
-	 *            the widget to which this model corresponds
-	 */
-	public TextUpdateModel(List<ArgType> args, ValueUpdateHandler handler, Text text) {
-		super(args, handler);
-		this.text = text;
-		text.addModifyListener(this);
-	}
-
-	/**
-	 * Default (editable) text.
-	 * 
-	 * @param name
-	 *            name of the model, which will correspond to the name of a
-	 *            Property or Attribute if the widget value is to be saved.
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 * @param text
-	 *            the widget to which this model corresponds
-	 */
-	public TextUpdateModel(String name, ValueUpdateHandler handler, Text text) {
-		super(name, handler);
-		this.text = text;
-		text.addModifyListener(this);
-	}
-
-	@Override
-	public Object getControl() {
-		return text;
-	}
-
-	/*
-	 * @return String value of the selection (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#getValueFromControl()
-	 */
-	public Object getValueFromControl() {
-		return text.getText();
-	}
-
-	/*
-	 * Model serves as widget modify listener; uses the ValidateJob to delay
-	 * processing of text. Sets refreshing flag to block further updates being
-	 * triggered during the refresh. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events
-	 * .ModifyEvent)
-	 */
-	public void modifyText(ModifyEvent e) {
-		if (refreshing) {
-			return;
-		}
-		validateJob.cancel();
-		validateJob.schedule(VALIDATE_TIMER);
-	}
-
-	/*
-	 * Sets the value on the text, either by resolving the arguments for
-	 * read-only, or by retrieving the value. Turns on the refreshing flag so as
-	 * not to trigger further updates from the listener. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#refreshValueFromMap()
-	 */
-	public void refreshValueFromMap() {
-		refreshing = true;
-		if (!canSave) {
-			mapValue = getResolvedDynamic();
-		} else {
-			mapValue = lcMap.get(name);
-		}
-		String s = ZEROSTR;
-		if (mapValue != null) {
-			s = (String) mapValue;
-		}
-		text.setText(s);
-		refreshing = false;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/ValueTreeNodeUpdateModel.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/ValueTreeNodeUpdateModel.java
deleted file mode 100644
index 1fbbb24..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/ValueTreeNodeUpdateModel.java
+++ /dev/null
@@ -1,141 +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.ui.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.ptp.rm.jaxb.core.data.AttributeType;
-import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
-
-/**
- * Cell editor for the (editable) value nodes of a Tree Viewer.
- * 
- * @author arossi
- * 
- */
-public class ValueTreeNodeUpdateModel extends CellEditorUpdateModel {
-
-	private final List<InfoTreeNodeModel> children;
-
-	/**
-	 * Cell editor model for Tree node with underlying Property data.
-	 * 
-	 * @param name
-	 *            of the model, which will correspond to the name of a Property
-	 *            or Attribute the value is to be saved to
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 * @param editor
-	 *            the cell editor for the value cell
-	 * @param items
-	 *            if this is a combo editor, the selection items
-	 * @param readOnly
-	 *            if this is a text box, whether it is editable
-	 * @param inValueCol
-	 *            whether to display the field value in the Value column of the
-	 *            viewer. (<code>false</code> means that its value displays in a
-	 *            column whose name matches the id.
-	 */
-	public ValueTreeNodeUpdateModel(String name, ValueUpdateHandler handler, CellEditor editor, String[] items, boolean readOnly,
-			boolean inValueCol) {
-		super(name, handler, editor, items, readOnly, ZEROSTR, ZEROSTR, ZEROSTR);
-		children = new ArrayList<InfoTreeNodeModel>();
-		generateChildren(inValueCol);
-	}
-
-	/**
-	 * Cell editor model for Tree node with underlying Attribute data.
-	 * 
-	 * @param name
-	 *            of the model, which will correspond to the name of a Property
-	 *            or Attribute the value is to be saved to
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 * @param editor
-	 *            the cell editor for the value cell
-	 * @param items
-	 *            if this is a combo editor, the selection items
-	 * @param readOnly
-	 *            if this is a text box, whether it is editable
-	 * @param inValueCol
-	 *            whether to display the field value in the Value column of the
-	 *            viewer. (<code>false</code> means that its value displays in a
-	 *            column whose name matches the id.
-	 * @param data
-	 *            the Attribute object
-	 */
-	public ValueTreeNodeUpdateModel(String name, ValueUpdateHandler handler, CellEditor editor, String[] items, boolean readOnly,
-			boolean inValueCol, AttributeType data) {
-		super(name, handler, editor, items, readOnly, data.getTooltip(), data.getDescription(), data.getStatus());
-		children = new ArrayList<InfoTreeNodeModel>();
-		generateChildren(inValueCol);
-	}
-
-	/**
-	 * @return the info nodes attached to this Property or Attribute
-	 */
-	public List<InfoTreeNodeModel> getChildren() {
-		return children;
-	}
-
-	/**
-	 * @return defaultValue (used by info children)
-	 */
-	public String getDefault() {
-		return defaultValue;
-	}
-
-	/*
-	 * The parent value node displays only the name and the editable value.
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.jaxb.ui.IColumnViewerLabelSupport#getDisplayValue(
-	 * java.lang.String)
-	 */
-	public String getDisplayValue(String columnName) {
-		String displayValue = null;
-		if (COLUMN_NAME.equals(columnName)) {
-			displayValue = name;
-		} else if (isChecked() && COLUMN_VALUE.equals(columnName)) {
-			displayValue = getValueAsString();
-		}
-		if (displayValue == null) {
-			return ZEROSTR;
-		}
-		return displayValue;
-	}
-
-	/**
-	 * @return attribute status field value, if any (used by info children)
-	 */
-	public String getStatus() {
-		return status;
-	}
-
-	/**
-	 * Creates the info nodes for this entry.
-	 * 
-	 * @param inValueCol
-	 *            whether to display the field value in the Value column of the
-	 *            viewer. (<code>false</code> means that its value displays in a
-	 *            column whose name matches the id.
-	 */
-	private void generateChildren(boolean inValueCol) {
-		children.add(new InfoTreeNodeModel(this, COLUMN_DEFAULT, inValueCol));
-		children.add(new InfoTreeNodeModel(this, COLUMN_TYPE, inValueCol));
-		children.add(new InfoTreeNodeModel(this, COLUMN_STATUS, inValueCol));
-		children.add(new InfoTreeNodeModel(this, COLUMN_DESC, inValueCol));
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/ViewerUpdateModel.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/ViewerUpdateModel.java
deleted file mode 100644
index 43c27f9..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/model/ViewerUpdateModel.java
+++ /dev/null
@@ -1,305 +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.ui.model;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ICheckable;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.ptp.rm.jaxb.core.data.TemplateType;
-import org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.JAXBUIPlugin;
-import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Button;
-
-/**
- * Update model for the entire viewer (CheckboxTable or CheckboxTree). <br>
- * <br>
- * The viewer needs to be acted on as a whole on updates when check state
- * changes, and it needs to be refreshed after updates.
- * 
- * @author arossi
- * 
- */
-public class ViewerUpdateModel extends AbstractUpdateModel implements ICheckStateListener, IDoubleClickListener, SelectionListener {
-	private final StringBuffer checked;
-	private final StringBuffer templatedValue;
-	private final String pattern;
-	private final String separator;
-	private final ICheckable viewer;
-	private final ColumnViewer columnViewer;
-	private Button showOnlySelected;
-
-	/**
-	 * Used to filter out unchecked items.
-	 */
-	private final ViewerFilter filter = new ViewerFilter() {
-		@Override
-		public boolean select(Viewer viewer, Object parentElement, Object element) {
-			if (element instanceof ICellEditorUpdateModel) {
-				return ((ICheckable) viewer).getChecked(element);
-			} else if (element instanceof InfoTreeNodeModel) {
-				Object parent = ((InfoTreeNodeModel) element).getParent();
-				return ((ICheckable) viewer).getChecked(parent);
-			}
-			return false;
-		}
-	};
-
-	/**
-	 * @param name
-	 *            An arbitrary name given to the viewer; the viewer string
-	 *            output (produced from the pattern template) will be stored in
-	 *            the environment as the value of this name, and thus can be
-	 *            referenced by other widget models.
-	 * @param handler
-	 *            the handler for notifying other widgets to refresh their
-	 *            values
-	 * @param viewer
-	 *            the checkable viewer the object models
-	 * @param template
-	 *            JAXB data element defining a pattern by which to process the
-	 *            name-value pairs associated with the items of the viewer into
-	 *            a single output string
-	 */
-	public ViewerUpdateModel(String name, ValueUpdateHandler handler, ICheckable viewer, TemplateType template) {
-		super(name, handler);
-		this.viewer = viewer;
-		this.columnViewer = (ColumnViewer) viewer;
-		pattern = template.getPattern();
-		String s = template.getSeparator();
-		separator = s == null ? ZEROSTR : s;
-		checked = new StringBuffer();
-		templatedValue = new StringBuffer();
-		viewer.addCheckStateListener(this);
-		columnViewer.addDoubleClickListener(this);
-	}
-
-	/*
-	 * Model serves as CheckStateListener for the viewer. When check state
-	 * changes, the checked values are stored, and the update handler notified.
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse
-	 * .jface.viewers.CheckStateChangedEvent)
-	 */
-	public void checkStateChanged(CheckStateChangedEvent event) {
-		Object target = event.getElement();
-		if (!(target instanceof ICellEditorUpdateModel)) {
-			viewer.setChecked(target, false);
-		}
-		storeValue();
-		handleUpdate(null);
-	}
-
-	/*
-	 * Model serves as DoubleClickListener for the viewer. Multiple rows can be
-	 * selected, and their checked state toggled using a double-click. Each
-	 * toggle generates a CheckStateChangedEvent passed directly to the {@link
-	 * #checkStateChanged(CheckStateChangedEvent)} method.(non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse
-	 * .jface.viewers.DoubleClickEvent)
-	 */
-	public void doubleClick(DoubleClickEvent event) {
-		List<CheckStateChangedEvent> csEvents = new ArrayList<CheckStateChangedEvent>();
-		try {
-			IStructuredSelection selection = (IStructuredSelection) ((ColumnViewer) viewer).getSelection();
-			List<?> selected = selection.toList();
-			if (!selected.isEmpty()) {
-				for (Object o : selected) {
-					boolean checked = viewer.getChecked(o);
-					if (o instanceof ICellEditorUpdateModel) {
-						ICellEditorUpdateModel model = (ICellEditorUpdateModel) o;
-						viewer.setChecked(model, !checked);
-					} else {
-						viewer.setChecked(o, false);
-					}
-					csEvents.add(new CheckStateChangedEvent(viewer, o, !checked));
-				}
-			}
-		} catch (Throwable t) {
-			JAXBUIPlugin.log(t);
-		}
-		for (CheckStateChangedEvent e : csEvents) {
-			checkStateChanged(e);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.AbstractUpdateModel#getControl()
-	 */
-	@Override
-	public Object getControl() {
-		return viewer;
-	}
-
-	/*
-	 * Returns the mapValue in this case, since there is not actually a single
-	 * value associated with the viewer. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#getValueFromControl()
-	 */
-	public Object getValueFromControl() {
-		return mapValue;
-	}
-
-	/**
-	 * Set up the initial state of the viewer from the initial state of the
-	 * items; set the button state controlling the filter from the initial map
-	 * value.
-	 * 
-	 * @throws CoreException
-	 */
-	@SuppressWarnings("unchecked")
-	public void initializeChecked() throws CoreException {
-		Map<String, String> allChecked = lcMap.getChecked(name);
-		Collection<Object> input = (Collection<Object>) ((Viewer) viewer).getInput();
-		for (Object o : input) {
-			boolean checked = false;
-			if (o instanceof ICellEditorUpdateModel) {
-				ICellEditorUpdateModel model = (ICellEditorUpdateModel) o;
-				if (allChecked.isEmpty()) {
-					checked = true;
-				} else {
-					checked = allChecked.containsKey(model.getName());
-				}
-				viewer.setChecked(model, checked);
-			} else {
-				viewer.setChecked(o, false);
-			}
-		}
-
-		Boolean b = (Boolean) lcMap.get(SHOW_ONLY_CHECKED + name);
-		if (b == null) {
-			b = false;
-		}
-		showOnlySelected.setSelection(b);
-		if (b) {
-			columnViewer.addFilter(filter);
-		}
-		storeValue();
-		handleUpdate(null);
-	}
-
-	/*
-	 * Store the checked string and the show-only-checked setting (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.AbstractUpdateModel#storeValue()
-	 */
-	@SuppressWarnings("unchecked")
-	public void putCheckedSettings(Map<String, Object> localMap) {
-		checked.setLength(0);
-		Collection<Object> input = (Collection<Object>) ((Viewer) viewer).getInput();
-		for (Object o : input) {
-			if (o instanceof ICellEditorUpdateModel) {
-				ICellEditorUpdateModel model = (ICellEditorUpdateModel) o;
-				if (model.isChecked()) {
-					checked.append(model.getName()).append(SP);
-				}
-			}
-		}
-		localMap.put(CHECKED_ATTRIBUTES + name, checked.toString().trim());
-		localMap.put(SHOW_ONLY_CHECKED + name, showOnlySelected.getSelection());
-	}
-
-	/*
-	 * Retrieves the last value of the pattern string.(non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel#refreshValueFromMap()
-	 */
-	public void refreshValueFromMap() {
-		mapValue = lcMap.get(name);
-	}
-
-	/**
-	 * @param showOnlySelected
-	 *            whether to apply filter to viewer
-	 */
-	public void setShowAll(Button showOnlySelected) {
-		this.showOnlySelected = showOnlySelected;
-	}
-
-	/*
-	 * Store the template setting (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.AbstractUpdateModel#storeValue()
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public void storeValue() {
-		templatedValue.setLength(0);
-		Collection<Object> input = (Collection<Object>) ((Viewer) viewer).getInput();
-		for (Object o : input) {
-			if (o instanceof ICellEditorUpdateModel) {
-				ICellEditorUpdateModel model = (ICellEditorUpdateModel) o;
-				/*
-				 * model will return ZEROSTR if the entry is not selected
-				 */
-				String replaced = model.getReplacedValue(pattern);
-				if (!ZEROSTR.equals(replaced)) {
-					templatedValue.append(separator).append(replaced);
-				}
-			}
-		}
-		templatedValue.delete(0, separator.length());
-		String t = templatedValue.toString().trim();
-		if (!ZEROSTR.equals(t)) {
-			lcMap.put(name, t);
-		} else {
-			lcMap.remove(name);
-		}
-	}
-
-	/*
-	 * Model serves as widget selected listener for the filter button.
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse
-	 * .swt.events.SelectionEvent)
-	 */
-	public void widgetDefaultSelected(SelectionEvent e) {
-		widgetSelected(e);
-	}
-
-	/*
-	 * Model serves as widget selected listener for the filter button.
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
-	 * .events.SelectionEvent)
-	 */
-	public void widgetSelected(SelectionEvent e) {
-		if (showOnlySelected.getSelection()) {
-			columnViewer.addFilter(filter);
-		} else {
-			columnViewer.removeFilter(filter);
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/providers/TableDataContentProvider.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/providers/TableDataContentProvider.java
deleted file mode 100644
index 5573e10..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/providers/TableDataContentProvider.java
+++ /dev/null
@@ -1,49 +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 - modifications
- *  M Venkataramana - original code: http://eclipse.dzone.com/users/venkat_r_m
- ******************************************************************************/
-package org.eclipse.ptp.rm.jaxb.ui.providers;
-
-import java.util.Collection;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ptp.rm.jaxb.ui.model.TableRowUpdateModel;
-
-/**
- * For Attribute Table Viewer.
- * 
- * @author arossi
- * 
- */
-public class TableDataContentProvider implements IStructuredContentProvider {
-
-	public void dispose() {
-	}
-
-	/*
-	 * TableRowUpdateModel serves as the data model for the viewer.
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java
-	 * .lang.Object)
-	 */
-	@SuppressWarnings("unchecked")
-	public Object[] getElements(Object inputElement) {
-		if (inputElement instanceof Collection<?>) {
-			Collection<TableRowUpdateModel> list = (Collection<TableRowUpdateModel>) inputElement;
-			return list.toArray();
-		}
-		return new Object[0];
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/providers/TreeDataContentProvider.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/providers/TreeDataContentProvider.java
deleted file mode 100644
index e40f252..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/providers/TreeDataContentProvider.java
+++ /dev/null
@@ -1,77 +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 - modifications
- *  M Venkataramana - original code: http://eclipse.dzone.com/users/venkat_r_m
- ******************************************************************************/
-package org.eclipse.ptp.rm.jaxb.ui.providers;
-
-import java.util.Collection;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ptp.rm.jaxb.ui.model.ValueTreeNodeUpdateModel;
-
-/**
- * For Attribute Tree Viewer.
- * 
- * @author arossi
- * 
- */
-public class TreeDataContentProvider implements ITreeContentProvider {
-	public void dispose() {
-	}
-
-	/*
-	 * Only Value nodes have children. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.
-	 * Object)
-	 */
-	public Object[] getChildren(Object parentElement) {
-		if (parentElement instanceof ValueTreeNodeUpdateModel) {
-			return ((ValueTreeNodeUpdateModel) parentElement).getChildren().toArray();
-		}
-		return new Object[0];
-	}
-
-	/*
-	 * ValueTreeNodeUpdateModel serves as the main data model for the viewer,
-	 * with its children being InfoTreeNodeModel objects. (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java
-	 * .lang.Object)
-	 */
-	@SuppressWarnings("unchecked")
-	public Object[] getElements(Object inputElement) {
-		if (inputElement instanceof Collection<?>) {
-			Collection<ValueTreeNodeUpdateModel> list = (Collection<ValueTreeNodeUpdateModel>) inputElement;
-			return list.toArray();
-		}
-		return new Object[0];
-	}
-
-	public Object getParent(Object element) {
-		return null;
-	}
-
-	/*
-	 * Only Value nodes have children. (non-Javadoc) (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.
-	 * Object)
-	 */
-	public boolean hasChildren(Object element) {
-		return (element instanceof ValueTreeNodeUpdateModel);
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/providers/ViewerDataCellLabelProvider.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/providers/ViewerDataCellLabelProvider.java
deleted file mode 100644
index 70d3e13..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/providers/ViewerDataCellLabelProvider.java
+++ /dev/null
@@ -1,217 +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 - modifications
- *  M Venkataramana - original code: http://eclipse.dzone.com/users/venkat_r_m
- ******************************************************************************/
-package org.eclipse.ptp.rm.jaxb.ui.providers;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.CellLabelProvider;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.ptp.rm.jaxb.core.data.ColumnDataType;
-import org.eclipse.ptp.rm.jaxb.ui.IColumnViewerLabelSupport;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Cell label provider for the viewers allows for tooltip text display.
- * 
- * @author arossi
- * 
- */
-public class ViewerDataCellLabelProvider extends CellLabelProvider implements IJAXBUINonNLSConstants {
-	private final List<ColumnDataType> columnData;
-
-	/**
-	 * @param columnData
-	 *            info on name, colors and font for a given column.
-	 */
-	public ViewerDataCellLabelProvider(List<ColumnDataType> columnData) {
-		this.columnData = columnData;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.CellLabelProvider#getToolTipDisplayDelayTime
-	 * (java.lang.Object)
-	 */
-	@Override
-	public int getToolTipDisplayDelayTime(Object object) {
-		return 500;
-	}
-
-	/*
-	 * Gets the tooltip related to underlying model type. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.ValueTreeNodeUpdateModel
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.InfoTreeNodeModel
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.CellLabelProvider#getToolTipText(java.lang.
-	 * Object)
-	 */
-	@Override
-	public String getToolTipText(Object element) {
-		if (element instanceof IColumnViewerLabelSupport) {
-			IColumnViewerLabelSupport support = (IColumnViewerLabelSupport) element;
-			return support.getTooltip();
-		}
-		return super.getToolTipText(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.CellLabelProvider#getToolTipTimeDisplayed(java
-	 * .lang.Object)
-	 */
-	@Override
-	public int getToolTipTimeDisplayed(Object object) {
-		return 3000;
-	}
-
-	/*
-	 * Provides cell text, colors and font based on its column index.
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.CellLabelProvider#update(org.eclipse.jface.
-	 * viewers.ViewerCell)
-	 */
-	@Override
-	public void update(ViewerCell cell) {
-		int index = cell.getColumnIndex();
-		Object element = cell.getElement();
-		Color color = getBackground(element, index);
-		if (color != null) {
-			cell.setBackground(color);
-		}
-		color = getForeground(element, index);
-		if (color != null) {
-			cell.setBackground(color);
-		}
-		Font font = getFont(element, index);
-		if (font != null) {
-			cell.setFont(font);
-		}
-		Image img = getColumnImage(element, index);
-		if (img != null) {
-			cell.setImage(img);
-		}
-		cell.setText(getColumnText(element, index));
-	}
-
-	/**
-	 * Delegates to the
-	 * {@link IColumnViewerLabelSupport#getBackground(Object, int)} method.
-	 * 
-	 * @param element
-	 *            model object
-	 * @param columnIndex
-	 * @return column background color, if any
-	 */
-	private Color getBackground(Object element, int columnIndex) {
-		if (element instanceof IColumnViewerLabelSupport) {
-			IColumnViewerLabelSupport support = (IColumnViewerLabelSupport) element;
-			return support.getBackground(element, columnIndex);
-		}
-		return null;
-	}
-
-	/**
-	 * Delegates to the {@link IColumnViewerLabelSupport#getColumnImage(String)}
-	 * method.
-	 * 
-	 * @param element
-	 *            model object
-	 * @param columnIndex
-	 * @return column image, if any
-	 */
-	private Image getColumnImage(Object element, int columnIndex) {
-		if (element instanceof IColumnViewerLabelSupport) {
-			IColumnViewerLabelSupport support = (IColumnViewerLabelSupport) element;
-			return support.getColumnImage(getColumnName(columnIndex));
-		}
-		return null;
-	}
-
-	/**
-	 * Accesses name from the ColumnData element at given index.
-	 * 
-	 * @param element
-	 *            model object
-	 * @param columnIndex
-	 * @return column name
-	 */
-	private String getColumnName(int columnIndex) {
-		if (columnIndex >= columnData.size()) {
-			throw new ArrayIndexOutOfBoundsException(Messages.ViewerLabelProviderColumnError + columnIndex);
-		}
-		return columnData.get(columnIndex).getName();
-	}
-
-	/**
-	 * Delegates to the
-	 * {@link IColumnViewerLabelSupport#getDisplayValue(String)} method.
-	 * 
-	 * @param element
-	 *            model object
-	 * @param columnIndex
-	 * @return column text
-	 */
-	private String getColumnText(Object element, int columnIndex) {
-		if (element instanceof IColumnViewerLabelSupport) {
-			IColumnViewerLabelSupport support = (IColumnViewerLabelSupport) element;
-			return support.getDisplayValue(getColumnName(columnIndex));
-		}
-		return ZEROSTR;
-	}
-
-	/**
-	 * Delegates to the {@link IColumnViewerLabelSupport#getFont(Object, int)}
-	 * method.
-	 * 
-	 * @param element
-	 *            model object
-	 * @param columnIndex
-	 * @return column font, if any
-	 */
-	private Font getFont(Object element, int columnIndex) {
-		if (element instanceof IColumnViewerLabelSupport) {
-			IColumnViewerLabelSupport support = (IColumnViewerLabelSupport) element;
-			return support.getFont(element, columnIndex);
-		}
-		return null;
-	}
-
-	/**
-	 * Delegates to the
-	 * {@link IColumnViewerLabelSupport#getForeground(Object, int)} method.
-	 * 
-	 * @param element
-	 *            model object
-	 * @param columnIndex
-	 * @return column foreground color, if any
-	 */
-	private Color getForeground(Object element, int columnIndex) {
-		Color color = null;
-		if (element instanceof IColumnViewerLabelSupport) {
-			IColumnViewerLabelSupport support = (IColumnViewerLabelSupport) element;
-			color = support.getForeground(element, columnIndex);
-		}
-		return color;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/sorters/AttributeViewerSorter.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/sorters/AttributeViewerSorter.java
deleted file mode 100644
index d2a1658..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/sorters/AttributeViewerSorter.java
+++ /dev/null
@@ -1,52 +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.ui.sorters;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-
-/**
- * Sorts the viewer on the name column. Clicking a second time on the column
- * reverses the direction of the sort.
- * 
- * @author arossi
- * 
- */
-public class AttributeViewerSorter extends ViewerSorter implements IJAXBUINonNLSConstants {
-	protected int toggle = 1;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.
-	 * viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	@Override
-	public int compare(Viewer viewer, Object o1, Object o2) {
-		int result = 0;
-
-		if (o1 instanceof ICellEditorUpdateModel && o2 instanceof ICellEditorUpdateModel) {
-			ICellEditorUpdateModel c1 = (ICellEditorUpdateModel) o1;
-			ICellEditorUpdateModel c2 = (ICellEditorUpdateModel) o2;
-			String name1 = c1.getDisplayValue(COLUMN_NAME);
-			String name2 = c2.getDisplayValue(COLUMN_NAME);
-			result = name1.compareTo(name2);
-		}
-
-		return result * toggle;
-	}
-
-	public void toggle() {
-		toggle *= -1;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/LaunchTabBuilder.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/LaunchTabBuilder.java
deleted file mode 100644
index b5b861c..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/LaunchTabBuilder.java
+++ /dev/null
@@ -1,584 +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.ui.util;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.ptp.rm.jaxb.core.data.AttributeType;
-import org.eclipse.ptp.rm.jaxb.core.data.AttributeViewerType;
-import org.eclipse.ptp.rm.jaxb.core.data.ColumnDataType;
-import org.eclipse.ptp.rm.jaxb.core.data.CompositeType;
-import org.eclipse.ptp.rm.jaxb.core.data.FillLayoutType;
-import org.eclipse.ptp.rm.jaxb.core.data.FontType;
-import org.eclipse.ptp.rm.jaxb.core.data.FormAttachmentType;
-import org.eclipse.ptp.rm.jaxb.core.data.FormDataType;
-import org.eclipse.ptp.rm.jaxb.core.data.FormLayoutType;
-import org.eclipse.ptp.rm.jaxb.core.data.GridDataType;
-import org.eclipse.ptp.rm.jaxb.core.data.GridLayoutType;
-import org.eclipse.ptp.rm.jaxb.core.data.LayoutDataType;
-import org.eclipse.ptp.rm.jaxb.core.data.LayoutType;
-import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;
-import org.eclipse.ptp.rm.jaxb.core.data.RowDataType;
-import org.eclipse.ptp.rm.jaxb.core.data.RowLayoutType;
-import org.eclipse.ptp.rm.jaxb.core.data.TabFolderType;
-import org.eclipse.ptp.rm.jaxb.core.data.TabItemType;
-import org.eclipse.ptp.rm.jaxb.core.data.ViewerItemsType;
-import org.eclipse.ptp.rm.jaxb.core.data.WidgetType;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-import org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.ui.IUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.launch.JAXBDynamicLaunchConfigurationTab;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.ui.model.ViewerUpdateModel;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Object responsible for constructing the configurable JAXB Launch
- * Configuration Tab, as well as building and registering the related model
- * objects and listeners.
- * 
- * @see org.eclipse.ptp.rm.jaxb.ui.launch.JAXBDynamicLaunchConfigurationTab
- * 
- * @author arossi
- * 
- */
-public class LaunchTabBuilder implements IJAXBUINonNLSConstants {
-
-	private final JAXBDynamicLaunchConfigurationTab tab;
-	private final Map<Object, IUpdateModel> localWidgets;
-
-	/**
-	 * @param tab
-	 *            whose control is configurable from the JAXB data tree
-	 */
-	public LaunchTabBuilder(JAXBDynamicLaunchConfigurationTab tab) {
-		this.tab = tab;
-		this.localWidgets = tab.getLocalWidgets();
-	}
-
-	/**
-	 * Root call to build the SWT widget tree. Calls
-	 * {@link #addComposite(CompositeDescriptor, Composite)} or
-	 * {@link #addFolder(TabFolderDescriptor, Composite)}. <br>
-	 * <br>
-	 * Clears the widgets map, in the case or reinitializaton.
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.CompositeDescriptor
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.TabFolderDescriptor
-	 * 
-	 * @param parent
-	 *            root control of the configurable launch tab
-	 * @throws Throwable
-	 */
-	public void build(Composite parent) throws Throwable {
-		localWidgets.clear();
-		List<Object> top = tab.getController().getTabFolderOrComposite();
-		for (Object o : top) {
-			if (o instanceof CompositeType) {
-				addComposite((CompositeType) o, parent);
-			} else if (o instanceof TabFolderType) {
-				addFolder((TabFolderType) o, parent);
-			}
-		}
-	}
-
-	/**
-	 * Constructs the viewer, its row items and their update models, and add it
-	 * to the tree. Calls
-	 * {@link UpdateModelFactory#createModel(ColumnViewer, AttributeViewer, JAXBDynamicLaunchConfigurationTab)}
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.AttributeViewer
-	 * @see org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.ViewerUpdateModel
-	 * @see org.eclipse.ptp.rm.jaxb.ui.util.UpdateModelFactory#createModel(ColumnViewer,
-	 *      AttributeViewer, JAXBDynamicLaunchConfigurationTab)
-	 * 
-	 * @param descriptor
-	 *            JAXB data element describing CheckboxTableViewer or
-	 *            CheckboxTreeViewer for displaying a subset of the resource
-	 *            manager properties and attributes
-	 * @param parent
-	 *            control to which to add the viewer
-	 */
-	private void addAttributeViewer(AttributeViewerType descriptor, Composite parent) {
-		Layout layout = createLayout(descriptor.getLayout());
-		Object data = createLayoutData(descriptor.getLayoutData());
-		int style = WidgetBuilderUtils.getStyle(descriptor.getStyle());
-		Button showHide = WidgetBuilderUtils.createCheckButton(parent, Messages.ToggleShowHideSelectedAttributes, null);
-		ColumnViewer viewer = null;
-		if (TABLE.equals(descriptor.getType())) {
-			viewer = addCheckboxTableViewer(parent, data, layout, style, descriptor);
-		} else if (TREE.equals(descriptor.getType())) {
-			viewer = addCheckboxTreeViewer(parent, data, layout, style, descriptor);
-		}
-		if (viewer != null) {
-			Collection<ICellEditorUpdateModel> rows = addRows(viewer, descriptor);
-			ViewerUpdateModel model = UpdateModelFactory.createModel(viewer, descriptor, tab);
-			for (ICellEditorUpdateModel row : rows) {
-				row.setViewer(model);
-			}
-			viewer.setInput(rows);
-			showHide.addSelectionListener(model);
-			model.setShowAll(showHide);
-			localWidgets.put(viewer, model);
-		}
-	}
-
-	/**
-	 * Constructs and configures the SWT TableViewer. Calls
-	 * {@link WidgetBuilderUtils#createTable(Composite, Integer, Object)},
-	 * {@link WidgetBuilderUtils#setupAttributeTable(CheckboxTableViewer, List, org.eclipse.jface.viewers.ISelectionChangedListener, boolean, boolean, boolean, boolean)}
-	 * 
-	 * @see org.eclipse.jface.viewers.CheckboxTableViewer
-	 * 
-	 * @param parent
-	 *            control to which to add the viewer
-	 * @param data
-	 *            underlying data object (Property or Attribute)
-	 * @param layout
-	 *            SWT layout applicable to the viewer
-	 * @param style
-	 *            of the viewer
-	 * @param descriptor
-	 *            JAXB data element describing CheckboxTableViewer or
-	 *            CheckboxTreeViewer for displaying a subset of the resource
-	 *            manager properties and attributes
-	 * @return the viewer
-	 */
-	private CheckboxTableViewer addCheckboxTableViewer(Composite parent, Object data, Layout layout, int style,
-			AttributeViewerType descriptor) {
-		style |= (SWT.CHECK | SWT.FULL_SELECTION);
-		Table t = WidgetBuilderUtils.createTable(parent, style, data);
-		CheckboxTableViewer viewer = new CheckboxTableViewer(t);
-		WidgetBuilderUtils.setupAttributeTable(viewer, descriptor.getColumnData(), null, descriptor.isSort(),
-				descriptor.isTooltipEnabled(), descriptor.isHeaderVisible(), descriptor.isLinesVisible());
-		return viewer;
-	}
-
-	/**
-	 * Constructs and configures the SWT TreeViewer. Calls
-	 * {@link WidgetBuilderUtils#createTree(Composite, Integer, Object)},
-	 * {@link WidgetBuilderUtils#setupAttributeTree(CheckboxTreeViewer, List, org.eclipse.jface.viewers.ISelectionChangedListener, boolean, boolean, boolean, boolean)}
-	 * 
-	 * @see org.eclipse.jface.viewers.CheckboxTreeViewer
-	 * 
-	 * @param parent
-	 *            control to which to add the viewer
-	 * @param data
-	 *            underlying data object (Property or Attribute)
-	 * @param layout
-	 *            SWT layout applicable to the viewer
-	 * @param style
-	 *            of the viewer
-	 * @param descriptor
-	 *            JAXB data element describing CheckboxTableViewer or
-	 *            CheckboxTreeViewer for displaying a subset of the resource
-	 *            manager properties and attributes
-	 * @return the viewer
-	 */
-	private CheckboxTreeViewer addCheckboxTreeViewer(Composite parent, Object data, Layout layout, int style,
-			AttributeViewerType descriptor) {
-		style |= (SWT.CHECK | SWT.FULL_SELECTION);
-		Tree t = WidgetBuilderUtils.createTree(parent, style, data);
-		CheckboxTreeViewer viewer = new CheckboxTreeViewer(t);
-		WidgetBuilderUtils.setupAttributeTree(viewer, descriptor.getColumnData(), null, descriptor.isSort(),
-				descriptor.isTooltipEnabled(), descriptor.isHeaderVisible(), descriptor.isLinesVisible());
-		return viewer;
-	}
-
-	/**
-	 * Adds an SWT Composite widget. Calls
-	 * {@link WidgetBuilderUtils#createComposite(Composite, Integer, Layout, Object)}
-	 * ,
-	 * {@link WidgetBuilderUtils#createGroup(Composite, Integer, Layout, Object, String)}
-	 * , {@link #addFolder(TabFolderType, Composite)},
-	 * {@link #addComposite(CompositeType, Composite)},
-	 * {@link #addWidget(Composite, Widget)}, or
-	 * {@link #addAttributeViewer(AttributeViewer, Composite)}.
-	 * 
-	 * @see org.eclipse.swt.widgets.Composite
-	 * @see org.eclipse.swt.widgets.Group
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.TabFolderType
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.CompositeType
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.Widget
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.AttributeViewer
-	 * 
-	 * @param descriptor
-	 *            JAXB data element describing the contents and layout of the
-	 *            composite
-	 * @param parent
-	 *            control to which to add the composite
-	 * @return the SWT Composite
-	 */
-	private Composite addComposite(CompositeType descriptor, Composite parent) {
-		Layout layout = createLayout(descriptor.getLayout());
-		Object data = createLayoutData(descriptor.getLayoutData());
-		int style = WidgetBuilderUtils.getStyle(descriptor.getStyle());
-		Composite composite = null;
-		if (descriptor.isGroup()) {
-			composite = WidgetBuilderUtils.createGroup(parent, style, layout, data, descriptor.getTitle());
-		} else {
-			composite = WidgetBuilderUtils.createComposite(parent, style, layout, data);
-		}
-		List<Object> widget = descriptor.getTabFolderOrCompositeOrWidget();
-		for (Object o : widget) {
-			if (o instanceof TabFolderType) {
-				addFolder((TabFolderType) o, composite);
-			} else if (o instanceof CompositeType) {
-				addComposite((CompositeType) o, composite);
-			} else if (o instanceof WidgetType) {
-				addWidget(composite, (WidgetType) o);
-			} else if (o instanceof AttributeViewerType) {
-				addAttributeViewer((AttributeViewerType) o, composite);
-			}
-		}
-		String attr = descriptor.getBackground();
-		if (attr != null) {
-			composite.setBackground(WidgetBuilderUtils.getColor(attr));
-		}
-		FontType fd = descriptor.getFont();
-		if (fd != null) {
-			composite.setFont(WidgetBuilderUtils.getFont(fd));
-		}
-		return composite;
-	}
-
-	/**
-	 * Constructs and configures an SWT TabFolder and its TabItems. Calls
-	 * {@link #addItem(TabFolder, TabItemType, int)}.
-	 * 
-	 * @see org.eclipse.swt.widgets.TabFolder
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.TabFolderType
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.TabItemType
-	 * 
-	 * @param descriptor
-	 *            JAXB data element describing the folder contents and layout
-	 * @param parent
-	 *            control to which to add the folder
-	 * @return the SWT TabFolder
-	 */
-	private TabFolder addFolder(TabFolderType descriptor, Composite parent) {
-		TabFolder folder = new TabFolder(parent, WidgetBuilderUtils.getStyle(descriptor.getStyle()));
-		Layout layout = createLayout(descriptor.getLayout());
-		if (layout != null) {
-			folder.setLayout(layout);
-		}
-		Object data = createLayoutData(descriptor.getLayoutData());
-		if (data != null) {
-			folder.setLayoutData(data);
-		}
-		String tt = descriptor.getTooltip();
-		if (tt != null) {
-			folder.setToolTipText(tt);
-		}
-		List<TabItemType> items = descriptor.getItem();
-		int index = 0;
-		for (TabItemType i : items) {
-			addItem(folder, i, index++);
-		}
-		String attr = descriptor.getBackground();
-		if (attr != null) {
-			folder.setBackground(WidgetBuilderUtils.getColor(attr));
-		}
-		FontType fd = descriptor.getFont();
-		if (fd != null) {
-			folder.setFont(WidgetBuilderUtils.getFont(fd));
-		}
-		return folder;
-	}
-
-	/**
-	 * Adds an SWT TabItem to a TabFolder. Calls
-	 * {@link WidgetBuilderUtils#createTabItem(TabFolder, Integer, String, String, Integer)}
-	 * , {@link WidgetBuilderUtils#createComposite(Composite, Integer)},
-	 * {@link #addFolder(TabFolderType, Composite)},
-	 * {@link #addComposite(CompositeType, Composite)} or
-	 * {@link #addWidget(Composite, Widget)}.
-	 * 
-	 * @see org.eclipse.swt.widgets.TabFolder
-	 * @see org.eclipse.swt.widgets.TabItem
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.TabItemType
-	 * 
-	 * @param folder
-	 *            to which to add the item
-	 * @param descriptor
-	 *            JAXB data element describing content and layout of the item
-	 * @param index
-	 *            of the tab in the folder
-	 */
-	private void addItem(TabFolder folder, TabItemType descriptor, int index) {
-		int style = WidgetBuilderUtils.getStyle(descriptor.getStyle());
-		TabItem item = WidgetBuilderUtils.createTabItem(folder, style, descriptor.getTitle(), descriptor.getTooltip(), index);
-		Composite control = WidgetBuilderUtils.createComposite(folder, 1);
-		item.setControl(control);
-		String tt = descriptor.getTooltip();
-		if (tt != null) {
-			item.setToolTipText(tt);
-		}
-		String attr = descriptor.getBackground();
-		if (attr != null) {
-			control.setBackground(WidgetBuilderUtils.getColor(attr));
-		}
-		FontType fd = descriptor.getFont();
-		if (fd != null) {
-			control.setFont(WidgetBuilderUtils.getFont(fd));
-		}
-
-		List<Object> children = descriptor.getCompositeOrTabFolderOrWidget();
-		for (Object o : children) {
-			if (o instanceof TabFolderType) {
-				addFolder((TabFolderType) o, control);
-			} else if (o instanceof CompositeType) {
-				addComposite((CompositeType) o, control);
-			} else if (o instanceof WidgetType) {
-				addWidget(control, (WidgetType) o);
-			}
-		}
-	}
-
-	/**
-	 * Adds the row items to the table. The row item model is both a CellEditor
-	 * update model/listener, as well as the underlying data model for the
-	 * viewer provider. Calls
-	 * {@link UpdateModelFactory#createModel(Object, ColumnViewer, List, JAXBDynamicLaunchConfigurationTab)}
-	 * . Adds the cell editor-to-model mappings to the local widget map of the
-	 * LaunchTab being built.
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.IUpdateModel
-	 * @see org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.CellEditorUpdateModel
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.TableRowUpdateModel
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.ValueTreeNodeUpdateModel
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.InfoTreeNodeModel
-	 * 
-	 * @param viewer
-	 *            to which to add the rows
-	 * @param descriptor
-	 *            describing the content of the viewer's rows
-	 * @return list of models for the added items
-	 */
-	private Collection<ICellEditorUpdateModel> addRows(ColumnViewer viewer, AttributeViewerType descriptor) {
-		RMVariableMap rmMap = RMVariableMap.getActiveInstance();
-		ViewerItemsType items = descriptor.getItems();
-		List<ColumnDataType> columnData = descriptor.getColumnData();
-		ICellEditorUpdateModel model = null;
-		Map<String, ICellEditorUpdateModel> hash = new TreeMap<String, ICellEditorUpdateModel>();
-		Map<String, Object> vars = null;
-		if (items.isAllPredefined()) {
-			vars = rmMap.getVariables();
-			for (String key : vars.keySet()) {
-				Object o = vars.get(key);
-				if (!isVisible(o)) {
-					continue;
-				}
-				model = UpdateModelFactory.createModel(o, viewer, columnData, tab);
-				hash.put(key, model);
-			}
-		}
-		if (items.isAllDiscovered()) {
-			vars = rmMap.getDiscovered();
-			for (String key : vars.keySet()) {
-				Object o = vars.get(key);
-				if (!isVisible(o)) {
-					continue;
-				}
-				model = UpdateModelFactory.createModel(o, viewer, columnData, tab);
-				hash.put(key, model);
-			}
-		}
-		for (String key : items.getInclude()) {
-			if (hash.containsKey(key)) {
-				continue;
-			}
-			Object o = rmMap.getVariables().get(key);
-			if (!isVisible(o)) {
-				continue;
-			}
-			if (o == null) {
-				o = rmMap.getDiscovered().get(key);
-			}
-			if (o != null) {
-				model = UpdateModelFactory.createModel(o, viewer, columnData, tab);
-				hash.put(key, model);
-			}
-		}
-		for (String key : items.getExclude()) {
-			hash.remove(key);
-		}
-		for (ICellEditorUpdateModel m : hash.values()) {
-			localWidgets.put(m.getControl(), m);
-		}
-		return hash.values();
-	}
-
-	/**
-	 * Constructs the widget and creates its update model. Adds the
-	 * widget-to-model mapping to the local widget map of the LaunchTab being
-	 * built. Calls
-	 * {@link UpdateModelFactory#createModel(Composite, Widget, JAXBDynamicLaunchConfigurationTab)}
-	 * .
-	 * 
-	 * @param control
-	 *            to which to add the widget
-	 * @param widget
-	 *            JAXB data element describing type, style and layout data of
-	 *            widget
-	 */
-	private void addWidget(Composite control, WidgetType widget) {
-		IUpdateModel model = UpdateModelFactory.createModel(control, widget, tab);
-		/*
-		 * Label models are not returned, since they cannot be updated
-		 */
-		if (model != null) {
-			localWidgets.put(model.getControl(), model);
-		}
-	}
-
-	/**
-	 * Creates the SWT layout. Calls
-	 * {@link WidgetBuilderUtils#createFillLayout(String, Integer, Integer, Integer)}
-	 * ,
-	 * {@link WidgetBuilderUtils#createRowLayout(Boolean, Boolean, Boolean, Boolean, Integer, Integer, Integer, Integer, Integer, Integer, Integer)}
-	 * ,
-	 * {@link WidgetBuilderUtils#createGridLayout(Integer, Boolean, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer)}
-	 * or
-	 * {@link WidgetBuilderUtils#createFormLayout(Integer, Integer, Integer, Integer, Integer, Integer, Integer)}
-	 * .
-	 * 
-	 * @see org.eclipse.swt.widgets.Layout
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.LayoutType
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.FillLayoutType
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.RowLayoutType
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.GridLayoutType
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.FormLayoutType
-	 * 
-	 * @param layout
-	 *            JAXB data element describing the layout
-	 * @return the created SWT layout
-	 */
-	private Layout createLayout(LayoutType layout) {
-		if (layout != null) {
-			if (layout.getFillLayout() != null) {
-				FillLayoutType fillLayout = layout.getFillLayout();
-				return WidgetBuilderUtils.createFillLayout(fillLayout.getType(), fillLayout.getMarginHeight(),
-						fillLayout.getMarginWidth(), fillLayout.getSpacing());
-			} else if (layout.getRowLayout() != null) {
-				RowLayoutType rowLayout = layout.getRowLayout();
-				return WidgetBuilderUtils.createRowLayout(rowLayout.isCenter(), rowLayout.isFill(), rowLayout.isJustify(),
-						rowLayout.isPack(), rowLayout.getMarginHeight(), rowLayout.getMarginWidth(), rowLayout.getMarginTop(),
-						rowLayout.getMarginBottom(), rowLayout.getMarginLeft(), rowLayout.getMarginRight(), rowLayout.getSpacing());
-			} else if (layout.getGridLayout() != null) {
-				GridLayoutType gridLayout = layout.getGridLayout();
-				return WidgetBuilderUtils.createGridLayout(gridLayout.getNumColumns(), gridLayout.isMakeColumnsEqualWidth(),
-						gridLayout.getHorizontalSpacing(), gridLayout.getVerticalSpacing(), gridLayout.getMarginWidth(),
-						gridLayout.getMarginHeight(), gridLayout.getMarginLeft(), gridLayout.getMarginRight(),
-						gridLayout.getMarginTop(), gridLayout.getMarginBottom());
-			} else if (layout.getFormLayout() != null) {
-				FormLayoutType formLayout = layout.getFormLayout();
-				return WidgetBuilderUtils.createFormLayout(formLayout.getMarginHeight(), formLayout.getMarginWidth(),
-						formLayout.getMarginTop(), formLayout.getMarginBottom(), formLayout.getMarginLeft(),
-						formLayout.getMarginRight(), formLayout.getSpacing());
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Create the layout data object. Calls
-	 * {@link WidgetBuilderUtils#createRowData(Integer, Integer, Boolean)},
-	 * {@link WidgetBuilderUtils#createGridData(Integer, Boolean, Boolean, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer)}
-	 * , or
-	 * {@link WidgetBuilderUtils#createFormAttachment(String, Integer, Integer, Integer)}
-	 * and
-	 * {@link WidgetBuilderUtils#createFormData(Integer, Integer, FormAttachment, FormAttachment, FormAttachment, FormAttachment)}
-	 * .
-	 * 
-	 * @param layoutData
-	 *            JAXB data element describing the layout data object
-	 * @return the data object
-	 */
-	static Object createLayoutData(LayoutDataType layoutData) {
-		if (layoutData != null) {
-			if (layoutData.getRowData() != null) {
-				RowDataType rowData = layoutData.getRowData();
-				return WidgetBuilderUtils.createRowData(rowData.getHeight(), rowData.getWidth(), rowData.isExclude());
-			} else if (layoutData.getGridData() != null) {
-				GridDataType gridData = layoutData.getGridData();
-				int style = WidgetBuilderUtils.getStyle(gridData.getStyle());
-				int hAlign = WidgetBuilderUtils.getStyle(gridData.getHorizontalAlign());
-				int vAlign = WidgetBuilderUtils.getStyle(gridData.getVerticalAlign());
-				return WidgetBuilderUtils.createGridData(style, gridData.isGrabExcessHorizontal(), gridData.isGrabExcessVertical(),
-						gridData.getWidthHint(), gridData.getHeightHint(), gridData.getMinWidth(), gridData.getMinHeight(),
-						gridData.getHorizontalSpan(), gridData.getVerticalSpan(), hAlign, vAlign, gridData.getHorizontalIndent(),
-						gridData.getVerticalIndent());
-
-			} else if (layoutData.getFormData() != null) {
-				FormDataType formData = layoutData.getFormData();
-				FormAttachment top = null;
-				FormAttachment bottom = null;
-				FormAttachment left = null;
-				FormAttachment right = null;
-				FormAttachmentType fad = formData.getTop();
-				if (fad != null) {
-					top = WidgetBuilderUtils.createFormAttachment(fad.getAlignment(), fad.getDenominator(), fad.getNumerator(),
-							fad.getOffset());
-				}
-				fad = formData.getBottom();
-				if (fad != null) {
-					bottom = WidgetBuilderUtils.createFormAttachment(fad.getAlignment(), fad.getDenominator(), fad.getNumerator(),
-							fad.getOffset());
-				}
-				fad = formData.getLeft();
-				if (fad != null) {
-					left = WidgetBuilderUtils.createFormAttachment(fad.getAlignment(), fad.getDenominator(), fad.getNumerator(),
-							fad.getOffset());
-				}
-				fad = formData.getRight();
-				if (fad != null) {
-					right = WidgetBuilderUtils.createFormAttachment(fad.getAlignment(), fad.getDenominator(), fad.getNumerator(),
-							fad.getOffset());
-				}
-				return WidgetBuilderUtils.createFormData(formData.getHeight(), formData.getWidth(), top, bottom, left, right);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param data
-	 *            Attribute or Property
-	 * @return whether it is visible to the user (and thus used to generate a
-	 *         widget and update model)
-	 */
-	private static boolean isVisible(Object data) {
-		if (data instanceof AttributeType) {
-			return ((AttributeType) data).isVisible();
-		} else if (data instanceof PropertyType) {
-			return ((PropertyType) data).isVisible();
-		}
-		return false;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/RemoteUIServicesUtils.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/RemoteUIServicesUtils.java
deleted file mode 100644
index 2436373..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/RemoteUIServicesUtils.java
+++ /dev/null
@@ -1,127 +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.ui.util;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-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.remote.ui.widgets.RemoteConnectionWidget;
-import org.eclipse.ptp.rm.jaxb.core.utils.RemoteServicesDelegate;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Convenience methods for handling various actions involving IRemoteUIServices.
- * 
- * @see org.eclipse.ptp.remote.ui.IRemoteUIServices
- * @see org.eclipse.ptp.remote.ui.IRemoteUIFileManager
- * @see org.eclipse.ptp.remote.ui.IRemoteUIConnectionManager
- * @see org.eclipse.ptp.rm.jaxb.core.utils.RemoteServicesDelegate
- * 
- * @author arossi
- * 
- */
-public class RemoteUIServicesUtils implements IJAXBUINonNLSConstants {
-
-	/**
-	 * Opens a browse dialog using the indicated remote or local service and
-	 * connection.
-	 * 
-	 * @param shell
-	 *            for the dialog
-	 * @param current
-	 *            initial uri to display
-	 * @param delegate
-	 *            containing remote services data
-	 * @param remote
-	 *            whether to use the remote or the local connection and service
-	 *            provided by the delegate
-	 * @param readOnly
-	 *            whether to disallow the user to type in a path (default is
-	 *            <code>true</code>)
-	 * @return the selected file path as URI
-	 * @throws URISyntaxException
-	 */
-	public static URI browse(Shell shell, URI current, RemoteServicesDelegate delegate, boolean remote, boolean readOnly)
-			throws URISyntaxException {
-		IRemoteUIServices uIServices = null;
-		IRemoteUIFileManager uiFileManager = null;
-		IRemoteConnection conn = null;
-		URI home = null;
-		String path = null;
-		int type = readOnly ? IRemoteUIConstants.OPEN : IRemoteUIConstants.SAVE;
-
-		if (!remote) {
-			uIServices = PTPRemoteUIPlugin.getDefault().getRemoteUIServices(delegate.getLocalServices());
-			uiFileManager = uIServices.getUIFileManager();
-			conn = delegate.getLocalConnection();
-			home = delegate.getLocalHome();
-		} else {
-			uIServices = PTPRemoteUIPlugin.getDefault().getRemoteUIServices(delegate.getRemoteServices());
-			uiFileManager = uIServices.getUIFileManager();
-			conn = delegate.getRemoteConnection();
-			home = delegate.getRemoteHome();
-		}
-
-		path = current == null ? home.getPath() : current.getPath();
-
-		try {
-			uiFileManager.setConnection(conn);
-			uiFileManager.showConnections(remote);
-			path = uiFileManager.browseFile(shell, Messages.JAXBRMConfigurationSelectionWizardPage_0, path, type);
-		} catch (Throwable t) {
-			t.printStackTrace();
-		}
-
-		if (path == null) {
-			return current;
-		}
-
-		return new URI(home.getScheme(), home.getUserInfo(), home.getHost(), home.getPort(), path, home.getQuery(),
-				home.getFragment());
-	}
-
-	/**
-	 * Used to configure the default host and port in the wizard used for
-	 * choosing a resource manager connection.
-	 * 
-	 * @see org.eclipse.ptp.remote.ui.widgets.RemoteConnectionWidget
-	 * 
-	 * @param connectionWidget
-	 *            the widget allowing the user to choose the connection
-	 * @param connection
-	 *            name of the connection
-	 * @throws URISyntaxException
-	 */
-	public static void setConnectionHints(RemoteConnectionWidget connectionWidget, IRemoteConnection connection)
-			throws URISyntaxException {
-		Map<String, String> result = new HashMap<String, String>();
-		result.put(IRemoteUIConnectionManager.CONNECTION_ADDRESS_HINT, connection.getAddress());
-		result.put(IRemoteUIConnectionManager.LOGIN_USERNAME_HINT, connection.getUsername());
-		result.put(IRemoteUIConnectionManager.CONNECTION_PORT_HINT, String.valueOf(connection.getPort()));
-		String[] hints = new String[result.size()];
-		String[] defaults = new String[hints.length];
-		int i = 0;
-		for (String s : result.keySet()) {
-			hints[i] = s;
-			defaults[i++] = result.get(s);
-		}
-		connectionWidget.setHints(hints, defaults);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/UpdateModelFactory.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/UpdateModelFactory.java
deleted file mode 100644
index bfd68e0..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/UpdateModelFactory.java
+++ /dev/null
@@ -1,769 +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.ui.util;
-
-import java.io.File;
-import java.net.URI;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CheckboxCellEditor;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.ICheckable;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.ptp.rm.jaxb.core.data.ArgType;
-import org.eclipse.ptp.rm.jaxb.core.data.AttributeType;
-import org.eclipse.ptp.rm.jaxb.core.data.AttributeViewerType;
-import org.eclipse.ptp.rm.jaxb.core.data.ColumnDataType;
-import org.eclipse.ptp.rm.jaxb.core.data.FontType;
-import org.eclipse.ptp.rm.jaxb.core.data.LayoutDataType;
-import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;
-import org.eclipse.ptp.rm.jaxb.core.data.TemplateType;
-import org.eclipse.ptp.rm.jaxb.core.data.WidgetType;
-import org.eclipse.ptp.rm.jaxb.core.variables.RMVariableMap;
-import org.eclipse.ptp.rm.jaxb.ui.ICellEditorUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.ui.IUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.JAXBUIPlugin;
-import org.eclipse.ptp.rm.jaxb.ui.cell.SpinnerCellEditor;
-import org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler;
-import org.eclipse.ptp.rm.jaxb.ui.launch.JAXBDynamicLaunchConfigurationTab;
-import org.eclipse.ptp.rm.jaxb.ui.model.ButtonUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.model.ComboUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.model.SpinnerUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.model.TableRowUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.model.TextUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.model.ValueTreeNodeUpdateModel;
-import org.eclipse.ptp.rm.jaxb.ui.model.ViewerUpdateModel;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-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.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Spinner;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Utilities for creating update models for control widgets, cell editors and
- * viewers.
- * 
- * @author arossi
- * 
- */
-public class UpdateModelFactory implements IJAXBUINonNLSConstants {
-
-	/**
-	 * Internal data object for configuration convenience.
-	 * 
-	 * @author arossi
-	 * 
-	 */
-	private static class CellDescriptor {
-		private String name;
-		private String tooltip;
-		private String description;
-		private String choice;
-		private Integer min;
-		private Integer max;
-		private boolean readOnly;
-		private final CellEditorType type;
-		private String[] items;
-		protected Color[] foreground;
-		protected Color[] background;
-		protected Font[] font;
-
-		/**
-		 * @param data
-		 *            Property or Attribute
-		 * @param columnData
-		 *            list of JAXB data elements describing the viewer columns
-		 */
-		private CellDescriptor(Object data, List<ColumnDataType> columnData) {
-			type = CellEditorType.getType(data);
-			if (data instanceof AttributeType) {
-				AttributeType a = (AttributeType) data;
-				name = a.getName();
-				choice = a.getChoice();
-				min = a.getMin();
-				max = a.getMax();
-				readOnly = a.isReadOnly();
-				tooltip = a.getTooltip();
-				if (tooltip == null) {
-					tooltip = ZEROSTR;
-				} else {
-					tooltip = WidgetBuilderUtils.removeTabOrLineBreak(tooltip);
-				}
-				description = a.getDescription();
-			} else if (data instanceof PropertyType) {
-				PropertyType p = (PropertyType) data;
-				name = p.getName();
-				readOnly = p.isReadOnly();
-			}
-			if (description == null) {
-				description = ZEROSTR;
-			}
-			int cols = columnData.size();
-			foreground = new Color[cols];
-			background = new Color[cols];
-			font = new Font[cols];
-			for (int i = 0; i < columnData.size(); i++) {
-				String attr = columnData.get(i).getForeground();
-				if (attr != null) {
-					foreground[i] = WidgetBuilderUtils.getColor(attr);
-				} else {
-					foreground[i] = null;
-				}
-				attr = columnData.get(i).getBackground();
-				if (attr != null) {
-					background[i] = WidgetBuilderUtils.getColor(attr);
-				} else {
-					background[i] = null;
-				}
-				FontType fd = columnData.get(i).getFont();
-				if (fd != null) {
-					font[i] = WidgetBuilderUtils.getFont(fd);
-				} else {
-					font[i] = null;
-				}
-			}
-		}
-	}
-
-	/**
-	 * Mapping of Property or Attribute type to appropriate cell editor.
-	 * 
-	 * @author arossi
-	 * 
-	 */
-	private enum CellEditorType {
-		TEXT, COMBO, SPINNER, CHECK;
-
-		/**
-		 * Determine the CellEditor from the Property or Attribute type or
-		 * value.
-		 * 
-		 * @param object
-		 *            Property or Attribute
-		 * @return enum value for editor
-		 */
-		public static CellEditorType getType(Object object) {
-			if (object instanceof PropertyType) {
-				PropertyType p = (PropertyType) object;
-				Object value = p.getValue();
-				String clzz = p.getType();
-				if (clzz != null) {
-					return getTypeFromClass(clzz);
-				}
-				if (value != null) {
-					return getType(value);
-				}
-				return TEXT;
-			} else if (object instanceof AttributeType) {
-				AttributeType a = (AttributeType) object;
-				if (a.getChoice() != null) {
-					return COMBO;
-				}
-				String clzz = a.getType();
-				if (clzz != null) {
-					return getTypeFromClass(clzz);
-				}
-				Object value = a.getValue();
-				if (value != null) {
-					return getType(value);
-				}
-				return TEXT;
-			} else if (object instanceof Collection) {
-				return COMBO;
-			} else if (object instanceof Integer) {
-				return SPINNER;
-			} else if (object instanceof Boolean) {
-				return CHECK;
-			} else {
-				return TEXT;
-			}
-		}
-
-		/**
-		 * If the Property or Attribute carries an explicit type name, determine
-		 * CellEditor type from it.
-		 * 
-		 * @param clzz
-		 *            type name
-		 * @return enum value for editor
-		 */
-		private static CellEditorType getTypeFromClass(String clzz) {
-			if (clzz.indexOf(NT) > 0) {
-				return SPINNER;
-			}
-			if (clzz.indexOf(BOOL) >= 0) {
-				return CHECK;
-			}
-			if (clzz.indexOf(IST) > 0) {
-				return COMBO;
-			}
-			if (clzz.indexOf(ET) > 0) {
-				return COMBO;
-			}
-			if (clzz.indexOf(ECTOR) > 0) {
-				return COMBO;
-			}
-			return TEXT;
-		}
-	}
-
-	/**
-	 * Internal data object for configuration convenience.
-	 * 
-	 * @author arossi
-	 * 
-	 */
-	private static class ControlDescriptor {
-		private String title;
-		private Object layoutData;
-		private boolean readOnly;
-		private int style;
-		private String background;
-		private String foreground;
-		private FontType font;
-		private Integer min;
-		private Integer max;
-		private String tooltip;
-		private String choice;
-		private String fixedText;
-		private List<String> valueList;
-
-		/**
-		 * @param widget
-		 *            JAXB data element describing widget
-		 * @param rmMap
-		 *            used to retrieve data object info
-		 */
-		private ControlDescriptor(WidgetType widget, RMVariableMap rmMap) {
-			setControlData(widget);
-			setMapDependentData(widget, rmMap);
-		}
-
-		/**
-		 * Configure the fields which do not depend on the underlying data
-		 * object.
-		 * 
-		 * @param widget
-		 *            JAXB data element describing widget
-		 */
-		private void setControlData(WidgetType widget) {
-			title = widget.getTitle();
-			LayoutDataType layout = widget.getLayoutData();
-			layoutData = LaunchTabBuilder.createLayoutData(layout);
-			style = WidgetBuilderUtils.getStyle(widget.getStyle());
-			readOnly = widget.isReadOnly();
-			if (readOnly) {
-				style |= SWT.READ_ONLY;
-			}
-			background = widget.getBackground();
-			foreground = widget.getForeground();
-			font = widget.getFont();
-			tooltip = widget.getTooltip();
-			fixedText = widget.getFixedText();
-		}
-
-		/**
-		 * Get the choice (Combo), min and max (Spinner) settings.
-		 * 
-		 * @param data
-		 *            Attribute
-		 */
-		private void setData(Object data) {
-			if (data instanceof AttributeType) {
-				AttributeType a = (AttributeType) data;
-				choice = a.getChoice();
-				min = a.getMin();
-				max = a.getMax();
-			}
-		}
-
-		/**
-		 * Configure the fields which depend on the underlying data object.
-		 * 
-		 * @param widget
-		 *            JAXB data element describing widget
-		 * @param rmMap
-		 *            used to retrieve data object info
-		 */
-		private void setMapDependentData(WidgetType widget, RMVariableMap rmMap) {
-			if (tooltip == null) {
-				tooltip = ZEROSTR;
-			} else {
-				tooltip = WidgetBuilderUtils.removeTabOrLineBreak(rmMap.getString(tooltip));
-			}
-
-			if (fixedText != null) {
-				fixedText = rmMap.getString(fixedText);
-			}
-
-			Map<String, Object> vars = rmMap.getVariables();
-			String s = widget.getSaveValueTo();
-			if (s != null) {
-				Object data = vars.get(s);
-				if (data != null) {
-					setData(data);
-				}
-			}
-			s = widget.getItemsFrom();
-			if (s != null) {
-				Object data = vars.get(s);
-				if (data != null) {
-					setValueListData(data);
-				}
-			}
-		}
-
-		/**
-		 * Get Combo items from a reference to another Attribute or Property
-		 * with a List as its value.
-		 * 
-		 * @param data
-		 *            Property or Attribute
-		 */
-		@SuppressWarnings("unchecked")
-		private void setValueListData(Object data) {
-			if (data instanceof AttributeType) {
-				AttributeType a = (AttributeType) data;
-				Object value = a.getValue();
-				if (value instanceof List<?>) {
-					valueList = (List<String>) value;
-				}
-			} else {
-				PropertyType p = (PropertyType) data;
-				Object value = p.getValue();
-				if (value instanceof List<?>) {
-					valueList = (List<String>) value;
-				}
-			}
-		}
-	}
-
-	/**
-	 * Constructs the viewer update model.
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.ViewerUpdateModel
-	 * @see org.eclipse.ptp.rm.jaxb.ui.handlers.ValueUpdateHandler
-	 * 
-	 * @param viewer
-	 *            SWT object to which this model is bound
-	 * @param descriptor
-	 *            JAXB data element describing the viewer
-	 * @param tab
-	 *            launch tab being built (accessed for value handler)
-	 * @return
-	 */
-	public static ViewerUpdateModel createModel(ColumnViewer viewer, AttributeViewerType descriptor,
-			JAXBDynamicLaunchConfigurationTab tab) {
-		String name = descriptor.getName();
-		TemplateType template = descriptor.getValue();
-		ValueUpdateHandler handler = tab.getParent().getUpdateHandler();
-		ViewerUpdateModel model = new ViewerUpdateModel(name, handler, (ICheckable) viewer, template);
-		return model;
-	}
-
-	/**
-	 * Constructs the widget and its update model.
-	 * 
-	 * @param parent
-	 *            control to which the widget belongs
-	 * @param widget
-	 *            JAXB data object describing the widget to which this model is
-	 *            bound
-	 * @param tab
-	 *            launch tab being built
-	 * @return
-	 */
-	public static IUpdateModel createModel(Composite parent, WidgetType widget, JAXBDynamicLaunchConfigurationTab tab) {
-		Control control = createControl(parent, widget, tab);
-		if (control instanceof Label) {
-			return null;
-		}
-
-		String name = widget.getSaveValueTo();
-		List<ArgType> dynamic = null;
-
-		WidgetType.DynamicText dt = widget.getDynamicText();
-		if (dt != null) {
-			dynamic = dt.getArg();
-		}
-
-		ValueUpdateHandler handler = tab.getParent().getUpdateHandler();
-		IUpdateModel model = null;
-		if (control instanceof Text) {
-			if (name != null && !ZEROSTR.equals(name)) {
-				model = new TextUpdateModel(name, handler, (Text) control);
-			}
-			if (dynamic != null) {
-				model = new TextUpdateModel(dynamic, handler, (Text) control);
-			}
-		} else if (control instanceof Combo) {
-			model = new ComboUpdateModel(name, handler, (Combo) control);
-		} else if (control instanceof Spinner) {
-			model = new SpinnerUpdateModel(name, handler, (Spinner) control);
-		} else if (control instanceof Button) {
-			model = new ButtonUpdateModel(name, handler, (Button) control);
-		}
-		return model;
-	}
-
-	/**
-	 * Constructs the cell editor and its update model. Calls
-	 * {@link #createModel(Object, TableViewer, List, JAXBDynamicLaunchConfigurationTab)}
-	 * or
-	 * {@link #createModel(Object, TreeViewer, List, JAXBDynamicLaunchConfigurationTab)}
-	 * .
-	 * 
-	 * @param data
-	 *            Property or Attribute for this viewer row.
-	 * @param viewer
-	 *            CheckboxTableViewer or CheckboxTreeViewer
-	 * @param columnData
-	 *            list of JAXB data elements describing the viewer columns
-	 * @param tab
-	 *            launch tab being built
-	 * @return
-	 */
-	public static ICellEditorUpdateModel createModel(Object data, ColumnViewer viewer, List<ColumnDataType> columnData,
-			JAXBDynamicLaunchConfigurationTab tab) {
-		ICellEditorUpdateModel model = null;
-		if (viewer instanceof TableViewer) {
-			model = createModel(data, (TableViewer) viewer, columnData, tab);
-		} else {
-			model = createModel(data, (TreeViewer) viewer, columnData, tab);
-		}
-		return model;
-	}
-
-	/**
-	 * Creates a read-only Text area and adjacent browse button using local
-	 * connection information. The update model will be attached to the returned
-	 * text widget, as its text value will trigger updates.
-	 * 
-	 * @see org.eclipse.swt.widgets.Text
-	 * @see org.eclipse.swt.widgets.Button
-	 * 
-	 * @param parent
-	 *            to which the control belongs
-	 * @param cd
-	 *            internal data object carrying model description info
-	 * @param tab
-	 *            launch tab being built
-	 * @return the text widget carrying the browse selection
-	 */
-	private static Text createBrowseLocal(final Composite parent, final ControlDescriptor cd) {
-		final Text t = WidgetBuilderUtils.createText(parent, SWT.BORDER, cd.layoutData, true, ZEROSTR);
-		WidgetBuilderUtils.createButton(parent, cd.layoutData, cd.title, cd.style, new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				widgetSelected(e);
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				try {
-					URI uri = new URI(t.getText());
-					int type = cd.readOnly ? SWT.OPEN : SWT.SAVE;
-					FileDialog d = new FileDialog(parent.getShell(), type);
-					d.setFileName(uri.getPath());
-					String f = d.open();
-					if (f != null) {
-						t.setText(new File(f).toURI().toString());
-					} else {
-						t.setText(ZEROSTR);
-					}
-				} catch (Throwable t) {
-					JAXBUIPlugin.log(t);
-				}
-			}
-		});
-		return t;
-	}
-
-	/**
-	 * Creates a read-only Text area and adjacent browse button using remote
-	 * connection information. The update model will be attached to the returned
-	 * text widget, as its text value will trigger updates.
-	 * 
-	 * @see org.eclipse.swt.widgets.Text
-	 * @see org.eclipse.swt.widgets.Button
-	 * 
-	 * @param parent
-	 *            to which the control belongs
-	 * @param cd
-	 *            internal data object carrying model description info
-	 * @param tab
-	 *            launch tab being built
-	 * @return the text widget carrying the browse selection
-	 */
-	private static Text createBrowseRemote(final Composite parent, final ControlDescriptor cd,
-			final JAXBDynamicLaunchConfigurationTab tab) {
-		final Text t = WidgetBuilderUtils.createText(parent, SWT.BORDER, cd.layoutData, true, ZEROSTR);
-		WidgetBuilderUtils.createButton(parent, cd.layoutData, cd.title, cd.style, new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				widgetSelected(e);
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				try {
-					URI uri = new URI(t.getText());
-					uri = RemoteUIServicesUtils.browse(parent.getShell(), uri, tab.getParent().getDelegate(), true, cd.readOnly);
-					if (uri != null) {
-						t.setText(uri.toString());
-					} else {
-						t.setText(ZEROSTR);
-					}
-				} catch (Throwable t) {
-					JAXBUIPlugin.log(t);
-				}
-			}
-		});
-		return t;
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Combo
-	 * 
-	 * @param parent
-	 *            to which the control belongs
-	 * @param cd
-	 *            internal data object carrying model description info
-	 * @return the Combo widget
-	 */
-	private static Combo createCombo(Composite parent, final ControlDescriptor cd) {
-		String[] items = null;
-		if (cd.valueList != null) {
-			items = cd.valueList.toArray(new String[0]);
-		} else if (cd.choice != null) {
-			items = cd.choice.split(CM);
-		}
-		if (items == null) {
-			items = new String[0];
-		} else {
-			if (items.length > 0) {
-				items = WidgetBuilderUtils.normalizeComboItems(items);
-			}
-		}
-		return WidgetBuilderUtils.createCombo(parent, cd.style, cd.layoutData, items, ZEROSTR, cd.title, cd.tooltip, null);
-	}
-
-	/**
-	 * Calls: {@link #createCombo(Composite, ControlDescriptor)},
-	 * {@link #createBrowseLocal(Composite, ControlDescriptor)},
-	 * {@link #createBrowseRemote(Composite, ControlDescriptor, JAXBDynamicLaunchConfigurationTab)}
-	 * ,
-	 * {@link WidgetBuilderUtils#createLabel(Composite, String, Integer, Object)}
-	 * ,
-	 * {@link WidgetBuilderUtils#createRadioButton(Composite, String, String, SelectionListener)}
-	 * , {@link WidgetBuilderUtils#createButton(Composite, String, Integer)},
-	 * {@link WidgetBuilderUtils#createSpinner(Composite, Object, String, Integer, Integer, Integer, org.eclipse.swt.events.ModifyListener)}
-	 * .
-	 * 
-	 * @param parent
-	 *            to which the control belongs
-	 * @param widget
-	 *            JAXB data element describing the widget
-	 * @param tab
-	 *            launch tab being built
-	 * @return the resulting control (<code>null</code> if the widget is a
-	 *         Label).
-	 */
-	private static Control createControl(final Composite parent, WidgetType widget, JAXBDynamicLaunchConfigurationTab tab) {
-		ControlDescriptor cd = new ControlDescriptor(widget, RMVariableMap.getActiveInstance());
-		String type = widget.getType();
-
-		Control c = null;
-		if (LABEL.equals(type)) {
-			c = WidgetBuilderUtils.createLabel(parent, cd.fixedText, cd.style, cd.layoutData);
-		} else if (TEXT.equals(type)) {
-			c = createText(parent, cd);
-		} else if (RADIOBUTTON.equals(type)) {
-			c = WidgetBuilderUtils.createRadioButton(parent, cd.title, null, null);
-		} else if (CHECKBOX.equals(type)) {
-			c = WidgetBuilderUtils.createCheckButton(parent, cd.title, null);
-		} else if (SPINNER.equals(type)) {
-			c = WidgetBuilderUtils.createSpinner(parent, cd.layoutData, cd.title, cd.min, cd.max, cd.min, null);
-		} else if (COMBO.equals(type)) {
-			c = createCombo(parent, cd);
-		} else if (BROWSELOCAL.equals(type)) {
-			c = createBrowseLocal(parent, cd);
-		} else if (BROWSEREMOTE.equals(type)) {
-			c = createBrowseRemote(parent, cd, tab);
-		}
-
-		if (c != null) {
-			if (!ZEROSTR.equals(cd.tooltip)) {
-				c.setToolTipText(cd.tooltip);
-			}
-			if (cd.foreground != null) {
-				c.setForeground(WidgetBuilderUtils.getColor(cd.foreground));
-			}
-			if (cd.background != null) {
-				c.setBackground(WidgetBuilderUtils.getColor(cd.background));
-			}
-			if (cd.font != null) {
-				c.setFont(WidgetBuilderUtils.getFont(cd.font));
-			}
-		}
-		return c;
-	}
-
-	/**
-	 * Constructs the editor of appropriate type.
-	 * 
-	 * @see org.eclipse.jface.viewers.TextCellEditor
-	 * @see org.eclipse.jface.viewers.CheckboxCellEditor
-	 * @see org.eclipse.jface.viewers.ComboBoxCellEditor
-	 * @see org.eclipse.ptp.rm.jaxb.ui.cell.SpinnerCellEditor
-	 * 
-	 * @param cd
-	 *            internal object holding model description
-	 * @param data
-	 *            Property or Attribute
-	 * @param parent
-	 *            Table or Tree to which the editor belongs
-	 * @return the editor of appropriate type
-	 */
-	@SuppressWarnings({ "unchecked", "rawtypes" })
-	private static CellEditor createEditor(CellDescriptor cd, Object data, Composite parent) {
-		CellEditor editor = null;
-		if (cd.type == CellEditorType.TEXT) {
-			editor = new TextCellEditor(parent);
-		} else if (cd.type == CellEditorType.CHECK) {
-			editor = new CheckboxCellEditor(parent);
-		} else if (cd.type == CellEditorType.SPINNER) {
-			editor = new SpinnerCellEditor(parent, cd.min, cd.max);
-		} else if (cd.type == CellEditorType.COMBO) {
-			Object o = null;
-			if (data instanceof AttributeType) {
-				if (cd.choice != null) {
-					cd.choice = cd.choice.trim();
-					cd.items = cd.choice.split(CM);
-				} else {
-					o = ((AttributeType) data).getValue();
-				}
-			} else {
-				o = ((PropertyType) data).getValue();
-			}
-			if (cd.items == null) {
-				if (o instanceof Collection) {
-					cd.items = (String[]) ((Collection) o).toArray(new String[0]);
-				} else {
-					cd.items = new String[0];
-				}
-			}
-			editor = new ComboBoxCellEditor(parent, cd.items, SWT.READ_ONLY);
-		}
-		return editor;
-	}
-
-	/**
-	 * Constructs CellEditor and model for table row. Calls
-	 * {@link #createEditor(CellDescriptor, Object, Composite)}.
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.TableRowUpdateModel
-	 * 
-	 * @param data
-	 *            Property or Attribute
-	 * @param viewer
-	 *            to which this row belongs
-	 * @param columnData
-	 *            list of JAXB data elements describing table columns
-	 * @param tab
-	 *            launch tab being built
-	 * @return the cell editor update model, which contains a reference to the
-	 *         CellEditor
-	 */
-	private static ICellEditorUpdateModel createModel(Object data, TableViewer viewer, List<ColumnDataType> columnData,
-			JAXBDynamicLaunchConfigurationTab tab) {
-		CellDescriptor cd = new CellDescriptor(data, columnData);
-		CellEditor editor = createEditor(cd, data, viewer.getTable());
-		ValueUpdateHandler handler = tab.getParent().getUpdateHandler();
-		ICellEditorUpdateModel model = null;
-		if (data instanceof AttributeType) {
-			model = new TableRowUpdateModel(cd.name, handler, editor, cd.items, cd.readOnly, (AttributeType) data);
-		} else if (data instanceof PropertyType) {
-			model = new TableRowUpdateModel(cd.name, handler, editor, cd.items, cd.readOnly);
-		}
-		if (model != null) {
-			model.setBackground(cd.background);
-			model.setFont(cd.font);
-			model.setForeground(cd.foreground);
-		}
-		return model;
-	}
-
-	/**
-	 * Constructs CellEditor and model for tree node. Calls
-	 * {@link #createEditor(CellDescriptor, Object, Composite)}.
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor
-	 * @see org.eclipse.ptp.rm.jaxb.ui.model.ValueTreeNodeUpdateModel
-	 * 
-	 * @param data
-	 *            Property or Attribute
-	 * @param viewer
-	 *            to which this row belongs
-	 * @param columnData
-	 *            list of JAXB data elements describing table columns
-	 * @param tab
-	 *            launch tab being built
-	 * @return the cell editor update model, which contains a reference to the
-	 *         CellEditor
-	 */
-	private static ICellEditorUpdateModel createModel(Object data, TreeViewer viewer, List<ColumnDataType> columnData,
-			JAXBDynamicLaunchConfigurationTab tab) {
-		CellDescriptor cd = new CellDescriptor(data, columnData);
-		CellEditor editor = createEditor(cd, data, viewer.getTree());
-		ValueUpdateHandler handler = tab.getParent().getUpdateHandler();
-		ICellEditorUpdateModel model = null;
-		Object[] properties = viewer.getColumnProperties();
-		boolean inValueCol = properties.length == 2;
-		if (data instanceof AttributeType) {
-			model = new ValueTreeNodeUpdateModel(cd.name, handler, editor, cd.items, cd.readOnly, inValueCol, (AttributeType) data);
-		} else if (data instanceof PropertyType) {
-			model = new ValueTreeNodeUpdateModel(cd.name, handler, editor, cd.items, cd.readOnly, inValueCol);
-		}
-		if (model != null) {
-			model.setBackground(cd.background);
-			model.setFont(cd.font);
-			model.setForeground(cd.foreground);
-		}
-		return model;
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Text
-	 * 
-	 * @param parent
-	 *            control to which widget belongs
-	 * @param cd
-	 *            internal data object describing the widget model
-	 * @return SWT text widget
-	 */
-	private static Text createText(final Composite parent, final ControlDescriptor cd) {
-		return WidgetBuilderUtils.createText(parent, cd.style, cd.layoutData, cd.readOnly, ZEROSTR);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/WidgetActionUtils.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/WidgetActionUtils.java
deleted file mode 100644
index 3f66e7a..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/WidgetActionUtils.java
+++ /dev/null
@@ -1,342 +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.ui.util;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ptp.remote.core.IRemoteFileManager;
-import org.eclipse.ptp.rm.jaxb.core.data.FileMatchType;
-import org.eclipse.ptp.rm.jaxb.core.data.RegexType;
-import org.eclipse.ptp.rm.jaxb.core.data.ValidatorType;
-import org.eclipse.ptp.rm.jaxb.core.data.impl.RegexImpl;
-import org.eclipse.ptp.rm.jaxb.core.exceptions.UnsatisfiedMatchException;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Convenience methods for certain types of actions involving widgets.
- * 
- * @author arossi
- * 
- */
-public class WidgetActionUtils implements IJAXBUINonNLSConstants {
-
-	private WidgetActionUtils() {
-	}
-
-	/**
-	 * Create a dialog that allows the user to select a file in the workspace.
-	 * 
-	 * @param shell
-	 * @return the selected file
-	 */
-	public static String browseWorkspace(Shell shell) {
-		IPath path = ResourcesPlugin.getWorkspace().getRoot().getLocation();
-		FileDialog dialog = new FileDialog(shell);
-		dialog.setFilterPath(path.toFile().getAbsolutePath());
-		return dialog.open();
-	}
-
-	/**
-	 * Open error message dialog.
-	 * 
-	 * @param shell
-	 * @param throwable
-	 * @param message
-	 * @param title
-	 * @param causeTrace
-	 */
-	public static void errorMessage(Shell shell, Throwable throwable, String message, String title, boolean causeTrace) {
-		String append = throwable == null ? ZEROSTR : throwable.getMessage();
-		Throwable t = throwable == null ? null : throwable.getCause();
-		String lineSep = LINE_SEP;
-		if (causeTrace) {
-			StringWriter sw = new StringWriter();
-			PrintWriter pw = new PrintWriter(sw);
-			if (t != null) {
-				t.printStackTrace(pw);
-				append = sw.toString();
-			}
-		} else if (t != null) {
-			append = t.getMessage();
-		}
-		MessageDialog.openError(shell, title, message + lineSep + lineSep + append);
-	}
-
-	/**
-	 * Get the selected item from the combo.
-	 * 
-	 * @param combo
-	 * @return if there are no items or the selection index is not set, return
-	 *         the text field; else the indexed item
-	 */
-	public static String getSelected(Combo combo) {
-		if (combo.isDisposed()) {
-			return ZEROSTR;
-		}
-		if (combo.getItemCount() == 0) {
-			return combo.getText();
-		}
-		int i = combo.getSelectionIndex();
-		if (i < 0) {
-			return combo.getText();
-		}
-		return combo.getItem(i);
-	}
-
-	/**
-	 * Get input from input dialog.
-	 * 
-	 * @param shell
-	 * @param message
-	 * @param title
-	 * @param initial
-	 *            value of text to display
-	 * @return the entered text
-	 */
-	public static String openInputDialog(Shell shell, String message, String title, String initial) {
-		InputDialog nameDialog = new InputDialog(shell, message, title, initial, null);
-		if (nameDialog.open() != Window.CANCEL) {
-			return nameDialog.getValue();
-		}
-		return null;
-	}
-
-	/**
-	 * Searches for the text among the choices; if not found, and the Combo is
-	 * editable, it adds the new text to the choices and selects it; if
-	 * read-only, the empty string is returned. Otherwise the corresponding item
-	 * is selected in the Combo.
-	 * 
-	 * @param combo
-	 * @param text
-	 * @return
-	 */
-	public static String select(Combo combo, String text) {
-		if (combo.isDisposed()) {
-			return ZEROSTR;
-		}
-		int style = combo.getStyle();
-		boolean readOnly = style == (style | SWT.READ_ONLY);
-		String[] items = combo.getItems();
-		if (items.length == 0) {
-			return ZEROSTR;
-		}
-		int i = 0;
-		if (text == null) {
-			text = ZEROSTR;
-		}
-		for (; i < items.length; i++) {
-			if (items[i].equals(text)) {
-				combo.select(i);
-				break;
-			}
-		}
-
-		if (i == items.length) {
-			if (readOnly) {
-				return ZEROSTR;
-			} else {
-				List<String> newItems = new ArrayList<String>();
-				for (String item : items) {
-					newItems.add(item.trim());
-				}
-				newItems.add(text.trim());
-				combo.setItems(newItems.toArray(new String[0]));
-				i = newItems.size() - 1;
-			}
-		}
-		combo.select(i);
-		return combo.getItem(i);
-	}
-
-	/**
-	 * Runs a validator (either regex or file info) on a value entered by user.
-	 * 
-	 * @param value
-	 *            to be validated
-	 * @param validator
-	 *            JAXB data element describing the validator (either a regex or
-	 *            EFS file validator).
-	 * @param fileManager
-	 *            local or remote manager from the remote services delegate of
-	 *            resource manager
-	 * @throws Exception
-	 *             if validation fails
-	 */
-	public static void validate(String value, ValidatorType validator, IRemoteFileManager fileManager) throws Exception {
-		RegexType reg = validator.getRegex();
-		String error = validator.getErrorMessage();
-
-		if (error == null) {
-			error = ZEROSTR;
-		}
-
-		if (reg != null && new RegexImpl(reg).getMatched(value) == null) {
-			throw new UnsatisfiedMatchException(error + CO + SP + reg.getExpression() + CM + SP + value);
-		} else {
-			FileMatchType match = validator.getFileInfo();
-			try {
-				if (match != null && !validate(match, value, fileManager)) {
-					throw new UnsatisfiedMatchException(error + CO + SP + value);
-				}
-			} catch (CoreException ce) {
-				throw new UnsatisfiedMatchException(ce);
-			}
-		}
-	}
-
-	/**
-	 * Converts string representation of OR'd EFS attributes into the Java int
-	 * value.
-	 * 
-	 * @param efsAttrStr
-	 *            string representation of OR'd values.
-	 * @return EFS code
-	 */
-	private static int getEfsAttributeValue(String efsAttrStr) {
-		int attributes = 0;
-		String[] split = efsAttrStr.split(PIP);
-		for (String s : split) {
-			s = s.trim();
-			if (ATTRIBUTE_READ_ONLY.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_READ_ONLY;
-			} else if (ATTRIBUTE_IMMUTABLE.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_IMMUTABLE;
-			} else if (ATTRIBUTE_OWNER_READ.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_OWNER_READ;
-			} else if (ATTRIBUTE_OWNER_WRITE.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_OWNER_WRITE;
-			} else if (ATTRIBUTE_OWNER_EXECUTE.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_OWNER_EXECUTE;
-			} else if (ATTRIBUTE_GROUP_READ.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_GROUP_READ;
-			} else if (ATTRIBUTE_GROUP_WRITE.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_GROUP_WRITE;
-			} else if (ATTRIBUTE_GROUP_EXECUTE.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_GROUP_EXECUTE;
-			} else if (ATTRIBUTE_OTHER_READ.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_OTHER_READ;
-			} else if (ATTRIBUTE_OTHER_WRITE.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_OTHER_WRITE;
-			} else if (ATTRIBUTE_OTHER_EXECUTE.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_OTHER_EXECUTE;
-			} else if (ATTRIBUTE_EXECUTABLE.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_EXECUTABLE;
-			} else if (ATTRIBUTE_ARCHIVE.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_ARCHIVE;
-			} else if (ATTRIBUTE_HIDDEN.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_HIDDEN;
-			} else if (ATTRIBUTE_SYMLINK.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_SYMLINK;
-			} else if (ATTRIBUTE_LINK_TARGET.equals(s)) {
-				attributes |= EFS.ATTRIBUTE_LINK_TARGET;
-			}
-		}
-		return attributes;
-	}
-
-	/**
-	 * Convert formatted string to long time in milliseconds.
-	 * 
-	 * @param dateTime
-	 *            format is: "yyyy/MM/dd HH:mm:ss"
-	 * @return milliseconds
-	 */
-	private static Long getTimeInMillis(String dateTime) {
-		DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
-		try {
-			Date d = formatter.parse(dateTime);
-			return new Long(d.getTime());
-		} catch (ParseException pe) {
-			return null;
-		}
-	}
-
-	/**
-	 * Checks EFS attributes of returned file info. Calls
-	 * {@link #getEfsAttributeValue(String)}.
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.FileMatch
-	 * @see org.eclipse.core.filesystem.IFileStore
-	 * @see org.eclipse.core.filesystem.IFileInfo
-	 * 
-	 * @param match
-	 *            JAXB data element describing what attributes to match
-	 * @param value
-	 *            the file path
-	 * @param fileManager
-	 *            local or remote manager from the remote services delegate of
-	 *            resource manager
-	 * @return whether validation succeeded
-	 * @throws CoreException
-	 */
-	private static boolean validate(FileMatchType match, String value, IRemoteFileManager fileManager) throws CoreException {
-		if (fileManager == null) {
-			return false;
-		}
-		IFileStore rres = fileManager.getResource(value);
-		IFileInfo info = rres.fetchInfo(EFS.NONE, new NullProgressMonitor());
-		if (!info.exists()) {
-			return false;
-		}
-		if (match.isIsDirectory() != info.isDirectory()) {
-			return false;
-		}
-		Long len = match.getLength();
-		if (len != null && len != info.getLength()) {
-			return false;
-		}
-		String date = match.getLastModifiedAfter();
-		if (date != null) {
-			Long t = getTimeInMillis(date);
-			if (t != null && t > info.getLastModified()) {
-				return false;
-			}
-		}
-
-		date = match.getLastModifiedBefore();
-		if (date != null) {
-			Long t = getTimeInMillis(date);
-			if (t != null && t < info.getLastModified()) {
-				return false;
-			}
-		}
-
-		String attributes = match.getEfsAttributes();
-		int a = getEfsAttributeValue(attributes);
-		if (!info.getAttribute(a)) {
-			return false;
-		}
-
-		return true;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/WidgetBuilderUtils.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/WidgetBuilderUtils.java
deleted file mode 100644
index c3ecaba..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/util/WidgetBuilderUtils.java
+++ /dev/null
@@ -1,1477 +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
- *  M Venkataramana - set up editing: http://eclipse.dzone.com/users/venkat_r_m
- ******************************************************************************/
-package org.eclipse.ptp.rm.jaxb.ui.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.ptp.rm.jaxb.core.data.ColumnDataType;
-import org.eclipse.ptp.rm.jaxb.core.data.FontType;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.ui.cell.AttributeViewerEditingSupport;
-import org.eclipse.ptp.rm.jaxb.ui.providers.TableDataContentProvider;
-import org.eclipse.ptp.rm.jaxb.ui.providers.TreeDataContentProvider;
-import org.eclipse.ptp.rm.jaxb.ui.providers.ViewerDataCellLabelProvider;
-import org.eclipse.ptp.rm.jaxb.ui.sorters.AttributeViewerSorter;
-import org.eclipse.ptp.utils.ui.swt.SWTUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.layout.RowData;
-import org.eclipse.swt.layout.RowLayout;
-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.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Spinner;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-
-/**
- * Convenience methods for constructing and configuring widgets.
- * 
- * @author arossi
- * 
- */
-public class WidgetBuilderUtils implements IJAXBUINonNLSConstants {
-
-	private static final FontRegistry fonts = new FontRegistry();
-
-	private WidgetBuilderUtils() {
-	}
-
-	/**
-	 * Tries to set monospace text on text area.
-	 * 
-	 * @param text
-	 *            of dialog or tab
-	 */
-	public static void applyMonospace(Text text) {
-		// Courier exists on Mac, Linux, Windows ...
-		FontType fd = new FontType();
-		fd.setName(COURIER);
-		fd.setSize(14);
-		fd.setStyle(NORMAL);
-		Font font = getFont(fd);
-		if (font != null) {
-			text.setFont(font);
-			Dialog.applyDialogFont(text);
-		}
-	}
-
-	/**
-	 * @param parent
-	 * @param layoutData
-	 * @param label
-	 * @param style
-	 * @param listener
-	 * @return button
-	 */
-	public static Button createButton(Composite parent, Object layoutData, String label, Integer style, SelectionListener listener) {
-		Button button = new Button(parent, style);
-		button.setText(label);
-		if (layoutData == null) {
-			layoutData = createGridData(DEFAULT, 1);
-		}
-		button.setLayoutData(layoutData);
-		if (null != listener) {
-			button.addSelectionListener(listener);
-		}
-		return button;
-	}
-
-	/**
-	 * @param parent
-	 * @param label
-	 * @param style
-	 * @return button
-	 */
-	public static Button createButton(Composite parent, String label, Integer style) {
-		return createButton(parent, null, label, style, null);
-	}
-
-	/**
-	 * @param parent
-	 * @param label
-	 * @param style
-	 * @param listener
-	 * @return button
-	 */
-	public static Button createButton(Composite parent, String label, Integer style, SelectionListener listener) {
-		return createButton(parent, null, label, style, listener);
-	}
-
-	/**
-	 * s * @param parent
-	 * 
-	 * @param label
-	 * @param listener
-	 * @return check button
-	 */
-	public static Button createCheckButton(Composite parent, String label, SelectionListener listener) {
-		return createButton(parent, label, SWT.CHECK | SWT.LEFT, listener);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 * @param data
-	 * @param items
-	 * @param initialValue
-	 * @param label
-	 * @param tooltip
-	 * @param listener
-	 * @return combo
-	 */
-	public static Combo createCombo(Composite parent, Integer style, Object data, String[] items, String initialValue,
-			String label, String tooltip, Object listener) {
-		if (label != null) {
-			Label comboLabel = createLabel(parent, label, SWT.RIGHT, 1);
-			if (tooltip != null) {
-				comboLabel.setToolTipText(tooltip);
-			}
-		}
-		Combo combo = new Combo(parent, style);
-		if (items != null) {
-			combo.setItems(items);
-		}
-		if (data == null) {
-			data = createGridData(DEFAULT, 1);
-		}
-		combo.setLayoutData(data);
-		if (initialValue != null) {
-			combo.setText(initialValue);
-		}
-		if (listener != null) {
-			if (listener instanceof ModifyListener) {
-				combo.addModifyListener((ModifyListener) listener);
-			} else if (listener instanceof SelectionListener) {
-				combo.addSelectionListener((SelectionListener) listener);
-			}
-		}
-		return combo;
-	}
-
-	/**
-	 * @param parent
-	 * @param columns
-	 * @return composite
-	 */
-	public static Composite createComposite(Composite parent, Integer columns) {
-		GridLayout layout = createGridLayout(columns, false, DEFAULT, 1, DEFAULT, DEFAULT);
-		return createComposite(parent, SWT.NONE, layout, null);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 * @param layout
-	 * @param layoutData
-	 * @return composite
-	 */
-	public static Composite createComposite(Composite parent, Integer style, Layout layout, Object layoutData) {
-		Composite composite = new Composite(parent, style);
-		if (layout != null) {
-			composite.setLayout(layout);
-		}
-		if (layoutData == null) {
-			layoutData = createGridData(DEFAULT, 1);
-		}
-		composite.setData(layoutData);
-		return composite;
-	}
-
-	/**
-	 * @param type
-	 * @param height
-	 * @param width
-	 * @param spacing
-	 * @return fill layout
-	 */
-	public static FillLayout createFillLayout(String type, Integer height, Integer width, Integer spacing) {
-		FillLayout layout = new FillLayout();
-		if (type != null) {
-			layout.type = getStyle(type);
-		}
-		if (height != null) {
-			layout.marginHeight = height;
-		}
-		if (width != null) {
-			layout.marginWidth = width;
-		}
-		if (spacing != null) {
-			layout.spacing = spacing;
-		}
-		return layout;
-	}
-
-	/**
-	 * @param align
-	 * @param denominator
-	 * @param numerator
-	 * @param offset
-	 * @return font attachment
-	 */
-	public static FormAttachment createFormAttachment(String align, Integer denominator, Integer numerator, Integer offset) {
-		FormAttachment fa = new FormAttachment();
-		if (align != null) {
-			fa.alignment = getStyle(align);
-		}
-		if (denominator != null) {
-			fa.denominator = denominator;
-		}
-		if (numerator != null) {
-			fa.numerator = numerator;
-		}
-		if (offset != null) {
-			fa.offset = offset;
-		}
-		return fa;
-	}
-
-	/**
-	 * @param height
-	 * @param width
-	 * @param top
-	 * @param bottom
-	 * @param left
-	 * @param right
-	 * @return form data
-	 */
-	public static FormData createFormData(Integer height, Integer width, FormAttachment top, FormAttachment bottom,
-			FormAttachment left, FormAttachment right) {
-		FormData data = new FormData();
-		if (height != null) {
-			data.height = height;
-		}
-		if (width != null) {
-			data.width = width;
-		}
-		if (top != null) {
-			data.top = top;
-		}
-		if (bottom != null) {
-			data.bottom = bottom;
-		}
-		if (left != null) {
-			data.left = left;
-		}
-		if (right != null) {
-			data.right = right;
-		}
-		return data;
-	}
-
-	/**
-	 * @param height
-	 * @param width
-	 * @param top
-	 * @param bottom
-	 * @param left
-	 * @param right
-	 * @param spacing
-	 * @return form layout
-	 */
-	public static FormLayout createFormLayout(Integer height, Integer width, Integer top, Integer bottom, Integer left,
-			Integer right, Integer spacing) {
-		FormLayout layout = new FormLayout();
-		if (height != null) {
-			layout.marginHeight = height;
-		}
-		if (width != null) {
-			layout.marginWidth = width;
-		}
-		if (top != null) {
-			layout.marginTop = top;
-		}
-		if (bottom != null) {
-			layout.marginBottom = bottom;
-		}
-		if (left != null) {
-			layout.marginLeft = left;
-		}
-		if (right != null) {
-			layout.marginRight = right;
-		}
-		if (spacing != null) {
-			layout.spacing = spacing;
-		}
-		return layout;
-	}
-
-	/**
-	 * @param style
-	 * @param grabExcessHorizontal
-	 * @param grabExcessVertical
-	 * @param widthHint
-	 * @param heightHint
-	 * @param horizontalSpan
-	 * @param verticalSpan
-	 * @return grid data
-	 */
-	public static GridData createGridData(Integer style, Boolean grabExcessHorizontal, Boolean grabExcessVertical,
-			Integer widthHint, Integer heightHint, Integer horizontalSpan, Integer verticalSpan) {
-		return createGridData(style, grabExcessHorizontal, grabExcessVertical, widthHint, heightHint, DEFAULT, DEFAULT,
-				horizontalSpan, verticalSpan, DEFAULT, DEFAULT, DEFAULT, DEFAULT);
-	}
-
-	/**
-	 * @param style
-	 * @param grabExcessHorizontal
-	 * @param grabExcessVertical
-	 * @param widthHint
-	 * @param heightHint
-	 * @param minimumWidth
-	 * @param minimumHeight
-	 * @param horizontalSpan
-	 * @param verticalSpan
-	 * @param horizonalAlign
-	 * @param verticalAlign
-	 * @param horizontalIndent
-	 * @param verticalIndent
-	 * @return grid data
-	 */
-	public static GridData createGridData(Integer style, Boolean grabExcessHorizontal, Boolean grabExcessVertical,
-			Integer widthHint, Integer heightHint, Integer minimumWidth, Integer minimumHeight, Integer horizontalSpan,
-			Integer verticalSpan, Integer horizonalAlign, Integer verticalAlign, Integer horizontalIndent, Integer verticalIndent) {
-		GridData data = null;
-		if (null != style) {
-			if (style == DEFAULT) {
-				data = new GridData();
-			} else {
-				data = new GridData(style);
-			}
-		} else {
-			data = new GridData();
-		}
-
-		if (grabExcessHorizontal != null) {
-			data.grabExcessHorizontalSpace = grabExcessHorizontal;
-		}
-		if (grabExcessVertical != null) {
-			data.grabExcessVerticalSpace = grabExcessVertical;
-		}
-		if (null != widthHint && widthHint != DEFAULT) {
-			data.widthHint = widthHint;
-		}
-		if (null != heightHint && heightHint != DEFAULT) {
-			data.heightHint = heightHint;
-		}
-		if (null != minimumWidth && minimumWidth != DEFAULT) {
-			data.minimumWidth = minimumWidth;
-		}
-		if (null != minimumHeight && minimumHeight != DEFAULT) {
-			data.minimumHeight = minimumHeight;
-		}
-		if (null != horizontalSpan && horizontalSpan != DEFAULT) {
-			data.horizontalSpan = horizontalSpan;
-		}
-		if (null != verticalSpan && verticalSpan != DEFAULT) {
-			data.verticalSpan = verticalSpan;
-		}
-		if (null != horizonalAlign && horizonalAlign != DEFAULT) {
-			data.horizontalAlignment = horizonalAlign;
-		}
-		if (null != verticalAlign && verticalAlign != DEFAULT) {
-			data.verticalAlignment = verticalAlign;
-		}
-		if (null != horizontalIndent && horizontalIndent != DEFAULT) {
-			data.horizontalIndent = horizontalIndent;
-		}
-		if (null != verticalIndent && verticalIndent != DEFAULT) {
-			data.verticalIndent = verticalIndent;
-		}
-		return data;
-	}
-
-	/**
-	 * @param style
-	 * @param cols
-	 * @return grid data
-	 */
-	public static GridData createGridData(Integer style, Integer cols) {
-		return createGridData(style, false, false, DEFAULT, DEFAULT, cols, DEFAULT);
-	}
-
-	/**
-	 * Sets style to GridData.FILL_BOTH, grabExcessHorizontal and
-	 * grabExcessVertical both to true.
-	 * 
-	 * @param widthHint
-	 * @param heightHint
-	 * @param cols
-	 * @return grid data
-	 */
-	public static GridData createGridDataFill(Integer widthHint, Integer heightHint, Integer cols) {
-		return createGridData(GridData.FILL_BOTH, true, true, widthHint, heightHint, cols, DEFAULT);
-	}
-
-	/**
-	 * Sets style to GridData.FILL_BOTH, grabExcessHorizontal to true.
-	 * 
-	 * @param cols
-	 * @return grid data
-	 */
-	public static GridData createGridDataFillH(Integer cols) {
-		return createGridData(GridData.FILL_HORIZONTAL, true, false, DEFAULT, DEFAULT, cols, DEFAULT);
-	}
-
-	/**
-	 * @param columns
-	 * @param makeColumnsEqualWidth
-	 * @return grid layout
-	 */
-	public static GridLayout createGridLayout(Integer columns, Boolean makeColumnsEqualWidth) {
-		return createGridLayout(columns, makeColumnsEqualWidth, DEFAULT, DEFAULT, DEFAULT, DEFAULT);
-	}
-
-	/**
-	 * @param columns
-	 * @param makeColumnsEqualWidth
-	 * @param horizontalSpacing
-	 * @param verticalSpacing
-	 * @param marginWidth
-	 * @param marginHeight
-	 * @return
-	 */
-	public static GridLayout createGridLayout(Integer columns, Boolean makeColumnsEqualWidth, Integer horizontalSpacing,
-			Integer verticalSpacing, Integer marginWidth, Integer marginHeight) {
-		return createGridLayout(columns, makeColumnsEqualWidth, horizontalSpacing, verticalSpacing, marginWidth, marginHeight,
-				DEFAULT, DEFAULT, DEFAULT, DEFAULT);
-	}
-
-	/**
-	 * @param columns
-	 * @param makeColumnsEqualWidth
-	 * @param horizontalSpacing
-	 * @param verticalSpacing
-	 * @param marginWidth
-	 * @param marginHeight
-	 * @param marginLeft
-	 * @param marginRight
-	 * @param marginTop
-	 * @param marginBottom
-	 * @return grid layout
-	 */
-	public static GridLayout createGridLayout(Integer columns, Boolean makeColumnsEqualWidth, Integer horizontalSpacing,
-			Integer verticalSpacing, Integer marginWidth, Integer marginHeight, Integer marginLeft, Integer marginRight,
-			Integer marginTop, Integer marginBottom) {
-		GridLayout gridLayout = new GridLayout();
-		if (columns != null) {
-			gridLayout.numColumns = columns;
-		}
-		if (makeColumnsEqualWidth != null) {
-			gridLayout.makeColumnsEqualWidth = makeColumnsEqualWidth;
-		}
-		if (null != horizontalSpacing && horizontalSpacing != DEFAULT) {
-			gridLayout.horizontalSpacing = horizontalSpacing;
-		}
-		if (null != verticalSpacing && verticalSpacing != DEFAULT) {
-			gridLayout.verticalSpacing = verticalSpacing;
-		}
-		if (null != marginWidth && marginWidth != DEFAULT) {
-			gridLayout.marginWidth = marginWidth;
-		}
-		if (null != marginHeight && marginHeight != DEFAULT) {
-			gridLayout.marginHeight = marginHeight;
-		}
-		if (null != marginLeft && marginLeft != DEFAULT) {
-			gridLayout.marginLeft = marginLeft;
-		}
-		if (null != marginRight && marginRight != DEFAULT) {
-			gridLayout.marginRight = marginRight;
-		}
-		if (null != marginTop && marginTop != DEFAULT) {
-			gridLayout.marginTop = marginTop;
-		}
-		if (null != marginBottom && marginBottom != DEFAULT) {
-			gridLayout.marginBottom = marginBottom;
-		}
-		return gridLayout;
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 * @param layout
-	 * @param layoutData
-	 * @return group
-	 */
-	public static Group createGroup(Composite parent, Integer style, Layout layout, Object layoutData) {
-		return createGroup(parent, style, layout, layoutData, null);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 * @param layout
-	 * @param layoutData
-	 * @param text
-	 *            title label, if any
-	 * @return group
-	 */
-	public static Group createGroup(Composite parent, Integer style, Layout layout, Object layoutData, String text) {
-		Group group = new Group(parent, style);
-		if (layout != null) {
-			group.setLayout(layout);
-		}
-		if (layoutData == null) {
-			layoutData = createGridData(DEFAULT, 1);
-		}
-		group.setLayoutData(layoutData);
-		if (text != null) {
-			group.setText(text);
-		}
-		return group;
-	}
-
-	/**
-	 * @param container
-	 * @param text
-	 * @param style
-	 * @param columnSpan
-	 * @return label
-	 */
-	public static Label createLabel(Composite container, String text, Integer style, Integer columnSpan) {
-		GridData data = createGridData(DEFAULT, columnSpan);
-		return createLabel(container, text, style, data);
-	}
-
-	/**
-	 * @param container
-	 * @param text
-	 * @param style
-	 * @param layoutData
-	 * @return label
-	 */
-	public static Label createLabel(Composite container, String text, Integer style, Object layoutData) {
-		Label label = new Label(container, style);
-		if (text == null) {
-			text = ZEROSTR;
-		}
-		label.setText(text.trim());
-		if (layoutData == null) {
-			layoutData = createGridData(DEFAULT, 1);
-		}
-		if (layoutData != null) {
-			label.setLayoutData(layoutData);
-		}
-
-		return label;
-	}
-
-	/**
-	 * Sets the layout data to grid with style GridData.FILL_HORIZONTAL.
-	 * 
-	 * @param parent
-	 * @param label
-	 * @param listener
-	 * @return push button
-	 */
-	public static Button createPushButton(Composite parent, String label, SelectionListener listener) {
-		Button button = SWTUtil.createPushButton(parent, label, null);
-		GridData data = createGridData(GridData.FILL_HORIZONTAL, 1);
-		button.setLayoutData(data);
-		if (null != listener) {
-			button.addSelectionListener(listener);
-		}
-		return button;
-	}
-
-	/**
-	 * @param parent
-	 * @param label
-	 * @param initialValue
-	 * @param listener
-	 * @return radio button
-	 */
-	public static Button createRadioButton(Composite parent, String label, String initialValue, SelectionListener listener) {
-		Button button = createButton(parent, label, SWT.RADIO | SWT.LEFT, listener);
-		button.setData((null == initialValue) ? label : initialValue);
-		return button;
-	}
-
-	/**
-	 * @param height
-	 * @param width
-	 * @param exclude
-	 * @return row data
-	 */
-	public static RowData createRowData(Integer height, Integer width, Boolean exclude) {
-		RowData data = new RowData();
-		if (height != null) {
-			data.height = height;
-		}
-		if (width != null) {
-			data.width = width;
-		}
-		if (exclude != null) {
-			data.exclude = exclude;
-		}
-		return data;
-	}
-
-	/**
-	 * @param center
-	 * @param fill
-	 * @param justify
-	 * @param pack
-	 * @param marginHeight
-	 * @param marginWidth
-	 * @param marginTop
-	 * @param marginBottom
-	 * @param marginLeft
-	 * @param marginRight
-	 * @param spacing
-	 * @return row layout
-	 */
-	public static RowLayout createRowLayout(Boolean center, Boolean fill, Boolean justify, Boolean pack, Integer marginHeight,
-			Integer marginWidth, Integer marginTop, Integer marginBottom, Integer marginLeft, Integer marginRight, Integer spacing) {
-		RowLayout layout = new RowLayout();
-		if (center != null) {
-			layout.center = center;
-		}
-		if (fill != null) {
-			layout.fill = fill;
-		}
-		if (justify != null) {
-			layout.justify = justify;
-		}
-		if (pack != null) {
-			layout.pack = pack;
-		}
-		if (marginHeight != null) {
-			layout.marginHeight = marginHeight;
-		}
-		if (marginWidth != null) {
-			layout.marginWidth = marginWidth;
-		}
-		if (marginTop != null) {
-			layout.marginTop = marginTop;
-		}
-		if (marginBottom != null) {
-			layout.marginBottom = marginBottom;
-		}
-		if (marginLeft != null) {
-			layout.marginLeft = marginLeft;
-		}
-		if (marginRight != null) {
-			layout.marginRight = marginRight;
-		}
-		if (spacing != null) {
-			layout.spacing = spacing;
-		}
-		return layout;
-	}
-
-	/**
-	 * @param parent
-	 * @param layoutData
-	 * @param label
-	 * @param minimum
-	 * @param maximum
-	 * @param initialValue
-	 * @param listener
-	 * @return spinner
-	 */
-	public static Spinner createSpinner(Composite parent, Object layoutData, String label, Integer minimum, Integer maximum,
-			Integer initialValue, ModifyListener listener) {
-		if (label != null) {
-			createLabel(parent, label, SWT.RIGHT, 1);
-		}
-
-		Spinner s = new Spinner(parent, SWT.NONE);
-		if (maximum != null) {
-			s.setMaximum(maximum);
-		}
-		if (minimum != null) {
-			s.setMinimum(minimum);
-		}
-		if (initialValue != null) {
-			s.setSelection(initialValue);
-		}
-		if (layoutData == null) {
-			layoutData = createGridData(DEFAULT, 1);
-		}
-		s.setLayoutData(layoutData);
-		if (listener != null) {
-			s.addModifyListener(listener);
-		}
-		return s;
-	}
-
-	/**
-	 * @param folder
-	 * @param style
-	 * @param text
-	 * @param tooltip
-	 * @param index
-	 * @return tab item
-	 */
-	public static TabItem createTabItem(TabFolder folder, Integer style, String text, String tooltip, Integer index) {
-		TabItem item = new TabItem(folder, style, index);
-		item.setText(text);
-		item.setToolTipText(tooltip);
-		return item;
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 * @param layoutData
-	 * @return table
-	 */
-	public static Table createTable(Composite parent, Integer style, Object layoutData) {
-		Integer cols = null;
-		if (layoutData != null) {
-			if (layoutData instanceof GridData) {
-				GridData gd = (GridData) layoutData;
-				cols = gd.horizontalSpan;
-			}
-		} else {
-			layoutData = createGridData(DEFAULT, cols);
-		}
-		if (style == null) {
-			style = SWT.None;
-		}
-		if (cols == null) {
-			cols = 1;
-		}
-		Table t = new Table(parent, style);
-		t.setLayoutData(layoutData);
-		t.setHeaderVisible(true);
-		t.setLinesVisible(true);
-		return t;
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 * @param layoutData
-	 * @param readOnly
-	 * @param initialValue
-	 * @return text
-	 */
-	public static Text createText(Composite parent, Integer style, Object layoutData, Boolean readOnly, String initialValue) {
-		return createText(parent, style, layoutData, readOnly, initialValue, null, null);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 * @param layoutData
-	 * @param readOnly
-	 * @param initialValue
-	 * @param listener
-	 * @param color
-	 * @return
-	 */
-	public static Text createText(Composite parent, Integer style, Object layoutData, Boolean readOnly, String initialValue,
-			ModifyListener listener, Color color) {
-		Text text = new Text(parent, style);
-		if (layoutData == null) {
-			layoutData = createGridData(DEFAULT, 1);
-		}
-		text.setLayoutData(layoutData);
-		if (readOnly != null) {
-			text.setEditable(!readOnly);
-		}
-		if (color != null) {
-			text.setBackground(color);
-		}
-		if (initialValue != null) {
-			text.setText(initialValue);
-		}
-		if (listener != null) {
-			text.addModifyListener(listener);
-		}
-		return text;
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 * @param layoutData
-	 * @return tree
-	 */
-	public static Tree createTree(Composite parent, Integer style, Object layoutData) {
-		Integer cols = null;
-		if (layoutData != null) {
-			if (layoutData instanceof GridData) {
-				GridData gd = (GridData) layoutData;
-				cols = gd.horizontalSpan;
-			}
-		} else {
-			layoutData = createGridData(DEFAULT, cols);
-		}
-		if (style == null) {
-			style = SWT.None;
-		}
-		if (cols == null) {
-			cols = 1;
-		}
-		Tree t = new Tree(parent, style);
-		t.setLayoutData(layoutData);
-		t.setHeaderVisible(true);
-		t.setLinesVisible(true);
-		return t;
-	}
-
-	/**
-	 * Translates string representation of SWT color into int code.
-	 * 
-	 * @param color
-	 *            string representation
-	 * @return SWT code
-	 */
-	public static Color getColor(String color) {
-		int swtColor = SWT.COLOR_BLACK;
-		if (COLOR_BLACK.equals(color)) {
-			swtColor = SWT.COLOR_BLACK;
-		} else if (COLOR_WHITE.equals(color)) {
-			swtColor = SWT.COLOR_WHITE;
-		} else if (COLOR_RED.equals(color)) {
-			swtColor = SWT.COLOR_RED;
-		} else if (COLOR_DARK_RED.equals(color)) {
-			swtColor = SWT.COLOR_DARK_RED;
-		} else if (COLOR_GREEN.equals(color)) {
-			swtColor = SWT.COLOR_GREEN;
-		} else if (COLOR_DARK_GREEN.equals(color)) {
-			swtColor = SWT.COLOR_DARK_GREEN;
-		} else if (COLOR_YELLOW.equals(color)) {
-			swtColor = SWT.COLOR_YELLOW;
-		} else if (COLOR_DARK_YELLOW.equals(color)) {
-			swtColor = SWT.COLOR_DARK_YELLOW;
-		} else if (COLOR_BLUE.equals(color)) {
-			swtColor = SWT.COLOR_BLUE;
-		} else if (COLOR_DARK_BLUE.equals(color)) {
-			swtColor = SWT.COLOR_DARK_BLUE;
-		} else if (COLOR_MAGENTA.equals(color)) {
-			swtColor = SWT.COLOR_MAGENTA;
-		} else if (COLOR_DARK_MAGENTA.equals(color)) {
-			swtColor = SWT.COLOR_DARK_MAGENTA;
-		} else if (COLOR_CYAN.equals(color)) {
-			swtColor = SWT.COLOR_CYAN;
-		} else if (COLOR_DARK_CYAN.equals(color)) {
-			swtColor = SWT.COLOR_DARK_CYAN;
-		} else if (COLOR_GRAY.equals(color)) {
-			swtColor = SWT.COLOR_GRAY;
-		} else if (COLOR_DARK_GRAY.equals(color)) {
-			swtColor = SWT.COLOR_DARK_GRAY;
-		} else if (COLOR_INFO_BACKGROUND.equals(color)) {
-			swtColor = SWT.COLOR_INFO_BACKGROUND;
-		} else if (COLOR_INFO_FOREGROUND.equals(color)) {
-			swtColor = SWT.COLOR_INFO_FOREGROUND;
-		} else if (COLOR_LIST_BACKGROUND.equals(color)) {
-			swtColor = SWT.COLOR_LIST_BACKGROUND;
-		} else if (COLOR_LIST_FOREGROUND.equals(color)) {
-			swtColor = SWT.COLOR_LIST_FOREGROUND;
-		} else if (COLOR_LIST_SELECTION.equals(color)) {
-			swtColor = SWT.COLOR_LIST_SELECTION;
-		} else if (COLOR_LIST_SELECTION_TEXT.equals(color)) {
-			swtColor = SWT.COLOR_LIST_SELECTION_TEXT;
-		} else if (COLOR_TITLE_BACKGROUND.equals(color)) {
-			swtColor = SWT.COLOR_TITLE_BACKGROUND;
-		} else if (COLOR_TITLE_BACKGROUND_GRADIENT.equals(color)) {
-			swtColor = SWT.COLOR_TITLE_BACKGROUND_GRADIENT;
-		} else if (COLOR_TITLE_FOREGROUND.equals(color)) {
-			swtColor = SWT.COLOR_TITLE_FOREGROUND;
-		} else if (COLOR_TITLE_INACTIVE_BACKGROUND.equals(color)) {
-			swtColor = SWT.COLOR_TITLE_INACTIVE_BACKGROUND;
-		} else if (COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT.equals(color)) {
-			swtColor = SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT;
-		} else if (COLOR_TITLE_INACTIVE_FOREGROUND.equals(color)) {
-			swtColor = SWT.COLOR_TITLE_INACTIVE_FOREGROUND;
-		} else if (COLOR_WIDGET_BACKGROUND.equals(color)) {
-			swtColor = SWT.COLOR_WIDGET_BACKGROUND;
-		} else if (COLOR_WIDGET_BORDER.equals(color)) {
-			swtColor = SWT.COLOR_WIDGET_BORDER;
-		} else if (COLOR_WIDGET_DARK_SHADOW.equals(color)) {
-			swtColor = SWT.COLOR_WIDGET_DARK_SHADOW;
-		} else if (COLOR_WIDGET_FOREGROUND.equals(color)) {
-			swtColor = SWT.COLOR_WIDGET_FOREGROUND;
-		} else if (COLOR_WIDGET_HIGHLIGHT_SHADOW.equals(color)) {
-			swtColor = SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW;
-		} else if (COLOR_WIDGET_LIGHT_SHADOW.equals(color)) {
-			swtColor = SWT.COLOR_WIDGET_LIGHT_SHADOW;
-		} else if (COLOR_WIDGET_NORMAL_SHADOW.equals(color)) {
-			swtColor = SWT.COLOR_WIDGET_NORMAL_SHADOW;
-		}
-		/*
-		 * don't have to deallocate, as these are system colors
-		 */
-		return Display.getDefault().getSystemColor(swtColor);
-	}
-
-	/**
-	 * Uses font registry.
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.core.data.FontDescriptor
-	 * @see org.eclipse.jface.resource.FontRegistry
-	 * @see org.eclipse.swt.graphics.FontData
-	 * 
-	 * @param fontDescriptor
-	 *            JAXB data element for font
-	 * @return font
-	 */
-	public static Font getFont(FontType fontDescriptor) {
-		String key = fontDescriptor.getName() + fontDescriptor.getSize() + fontDescriptor.getStyle();
-		FontData[] data = fonts.getFontData(key);
-		if (data == null) {
-			data = new FontData[] { new FontData(fontDescriptor.getName(), fontDescriptor.getSize(),
-					getStyle(fontDescriptor.getStyle())) };
-			fonts.put(key, data);
-		}
-		return fonts.get(key);
-	}
-
-	/**
-	 * Translates the string representation of OR'd style values into SWT int
-	 * code.
-	 * 
-	 * Calls {@link #getStyle(String[])}.
-	 * 
-	 * @param style
-	 *            string representation
-	 * @return SWT code
-	 */
-	public static int getStyle(String style) {
-		if (style == null || ZEROSTR.equals(style)) {
-			return SWT.NONE;
-		}
-		return getStyle(style.split(OPENSQ + PIP + CLOSSQ));
-	}
-
-	/**
-	 * For consistency in treating <code>null</code> or undefined defaults on
-	 * loading, this method ensures the first element of the combo is a ZEROSTR.
-	 * It also removes blank items.
-	 * 
-	 * @param items
-	 * @return adjusted array of combo items
-	 */
-	@SuppressWarnings({ "unchecked", "rawtypes" })
-	public static String[] normalizeComboItems(String[] items) {
-		List<String> list = new ArrayList(Arrays.asList(items));
-		for (Iterator<String> s = list.iterator(); s.hasNext();) {
-			String item = s.next().trim();
-			if (ZEROSTR.equals(item) || LINE_SEP.equals(item)) {
-				s.remove();
-			}
-		}
-		list.add(0, ZEROSTR);
-		return list.toArray(new String[0]);
-	}
-
-	/**
-	 * For preprocessing tooltip text from messed up XML text elements.
-	 * 
-	 * @param text
-	 *            to be adjusted
-	 * @return text without internal tabs or line breaks.
-	 */
-	public static String removeTabOrLineBreak(String text) {
-		if (text == null) {
-			return null;
-		}
-		if (ZEROSTR.equals(text)) {
-			return ZEROSTR;
-		}
-		StringBuffer newLine = new StringBuffer();
-		int strln = text.length();
-		char lastChar = 0;
-		for (int i = 0; i < strln; i++) {
-			char c = text.charAt(i);
-			switch (c) {
-			case '\t':
-			case '\n':
-			case '\r':
-				if (lastChar != SP.charAt(0)) {
-					newLine.append(SP);
-					lastChar = SP.charAt(0);
-				}
-				break;
-			default:
-				newLine.append(c);
-				lastChar = c;
-			}
-		}
-		return newLine.toString();
-	}
-
-	/**
-	 * Configures the CheckboxTableViewer. Calls
-	 * {@link #setupCommon(ColumnViewer, List, ISelectionChangedListener, boolean)}
-	 * and
-	 * {@link #setupSpecific(CheckboxTableViewer, List, Boolean, boolean, boolean)}
-	 * .
-	 * 
-	 * @param viewer
-	 * @param columnData
-	 *            JAXB data element describing viewer columns
-	 * @param listener
-	 * @param sortByName
-	 * @param tooltip
-	 * @param headerVisible
-	 * @param linesVisible
-	 */
-	public static void setupAttributeTable(final CheckboxTableViewer viewer, List<ColumnDataType> columnData,
-			ISelectionChangedListener listener, boolean sortByName, boolean tooltip, boolean headerVisible, boolean linesVisible) {
-		setupSpecific(viewer, columnData, sortByName, headerVisible, linesVisible);
-		setupCommon(viewer, columnData, listener, tooltip);
-	}
-
-	/**
-	 * Configures the CheckboxTreeViewer. Calls
-	 * {@link #setupCommon(ColumnViewer, List, ISelectionChangedListener, boolean)}
-	 * and
-	 * {@link #setupSpecific(CheckboxTreeViewer, List, Boolean, boolean, boolean)}
-	 * .
-	 * 
-	 * @param viewer
-	 * @param columnData
-	 *            JAXB data element describing viewer columns
-	 * @param listener
-	 * @param sortByName
-	 * @param tooltip
-	 * @param headerVisible
-	 * @param linesVisible
-	 */
-	public static void setupAttributeTree(final CheckboxTreeViewer viewer, List<ColumnDataType> columnData,
-			ISelectionChangedListener listener, boolean sortByName, boolean tooltip, boolean headerVisible, boolean linesVisible) {
-		setupSpecific(viewer, columnData, sortByName, headerVisible, linesVisible);
-		setupCommon(viewer, columnData, listener, tooltip);
-	}
-
-	/**
-	 * Creates adapter with sorter for viewer.
-	 * 
-	 * @see org.eclipse.ptp.rm.jaxb.ui.sorters.AttributeViewerSorter
-	 * 
-	 * @param viewer
-	 * @return adapter for the name column
-	 */
-	private static SelectionAdapter getAttributeViewerSelectionAdapter(final ColumnViewer viewer) {
-		return new SelectionAdapter() {
-			private boolean toggle = false;
-
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-
-				AttributeViewerSorter sorter = new AttributeViewerSorter();
-				if (toggle) {
-					sorter.toggle();
-				}
-				viewer.setSorter(sorter);
-				toggle = !toggle;
-			}
-		};
-	}
-
-	/**
-	 * Translates each array item into the integer code, using a cumulative
-	 * logical OR.
-	 * 
-	 * @param style
-	 *            array of string from split on '|'
-	 * @return SWT style code
-	 */
-	private static int getStyle(String[] style) {
-		int swt = 0;
-
-		for (String s : style) {
-			s = s.trim();
-			if (ARROW.equals(s)) {
-				swt |= SWT.ARROW;
-			}
-			if (BACKGROUND.equals(s)) {
-				swt |= SWT.BACKGROUND;
-			}
-			if (BALLOON.equals(s)) {
-				swt |= SWT.BALLOON;
-			}
-			if (BAR.equals(s)) {
-				swt |= SWT.BAR;
-			}
-			if (BEGINNING.equals(s)) {
-				swt |= SWT.BEGINNING;
-			}
-			if (BORDER.equals(s)) {
-				swt |= SWT.BORDER;
-			}
-			if (BORDER_DASH.equals(s)) {
-				swt |= SWT.BORDER_DASH;
-			}
-			if (BORDER_DOT.equals(s)) {
-				swt |= SWT.BORDER_DOT;
-			}
-			if (BORDER_SOLID.equals(s)) {
-				swt |= SWT.BORDER_SOLID;
-			}
-			if (BOTTOM.equals(s)) {
-				swt |= SWT.BOTTOM;
-			}
-			if (CASCADE.equals(s)) {
-				swt |= SWT.CASCADE;
-			}
-			if (CENTER.equals(s)) {
-				swt |= SWT.CENTER;
-			}
-			if (CHECK.equals(s)) {
-				swt |= SWT.CHECK;
-			}
-			if (DIALOG_TRIM.equals(s)) {
-				swt |= SWT.DIALOG_TRIM;
-			}
-			if (DOWN.equals(s)) {
-				swt |= SWT.DOWN;
-			}
-			if (DROP_DOWN.equals(s)) {
-				swt |= SWT.DROP_DOWN;
-			}
-			if (FILL.equals(s)) {
-				swt |= SWT.FILL;
-			}
-			if (FILL_BOTH.equals(s)) {
-				swt |= GridData.FILL_BOTH;
-			}
-			if (FILL_EVEN_ODD.equals(s)) {
-				swt |= SWT.FILL_EVEN_ODD;
-			}
-			if (FILL_HORIZONTAL.equals(s)) {
-				swt |= GridData.FILL_HORIZONTAL;
-			}
-			if (FILL_VERTICAL.equals(s)) {
-				swt |= GridData.FILL_VERTICAL;
-			}
-			if (FILL_WINDING.equals(s)) {
-				swt |= SWT.FILL_WINDING;
-			}
-			if (FOREGROUND.equals(s)) {
-				swt |= SWT.FOREGROUND;
-			}
-			if (FULL_SELECTION.equals(s)) {
-				swt |= SWT.FULL_SELECTION;
-			}
-			if (H_SCROLL.equals(s)) {
-				swt |= SWT.H_SCROLL;
-			}
-			if (HORIZONTAL.equals(s)) {
-				swt |= SWT.HORIZONTAL;
-			}
-			if (LEAD.equals(s)) {
-				swt |= SWT.LEAD;
-			}
-			if (LEFT.equals(s)) {
-				swt |= SWT.LEFT;
-			}
-			if (LEFT_TO_RIGHT.equals(s)) {
-				swt |= SWT.LEFT_TO_RIGHT;
-			}
-			if (LINE_CUSTOM.equals(s)) {
-				swt |= SWT.LINE_CUSTOM;
-			}
-			if (LINE_DASH.equals(s)) {
-				swt |= SWT.LINE_DASH;
-			}
-			if (LINE_DASHDOT.equals(s)) {
-				swt |= SWT.LINE_DASHDOT;
-			}
-			if (LINE_DASHDOTDOT.equals(s)) {
-				swt |= SWT.LINE_DASHDOTDOT;
-			}
-			if (LINE_DOT.equals(s)) {
-				swt |= SWT.LINE_DOT;
-			}
-			if (LINE_SOLID.equals(s)) {
-				swt |= SWT.LINE_SOLID;
-			}
-			if (MODELESS.equals(s)) {
-				swt |= SWT.MODELESS;
-			}
-			if (MULTI.equals(s)) {
-				swt |= SWT.MULTI;
-			}
-			if (NO.equals(s)) {
-				swt |= SWT.NO;
-			}
-			if (NO_BACKGROUND.equals(s)) {
-				swt |= SWT.NO_BACKGROUND;
-			}
-			if (NO_FOCUS.equals(s)) {
-				swt |= SWT.NO_FOCUS;
-			}
-			if (NO_MERGE_PAINTS.equals(s)) {
-				swt |= SWT.NO_MERGE_PAINTS;
-			}
-			if (NO_RADIO_GROUP.equals(s)) {
-				swt |= SWT.NO_RADIO_GROUP;
-			}
-			if (NO_REDRAW_RESIZE.equals(s)) {
-				swt |= SWT.NO_REDRAW_RESIZE;
-			}
-			if (NO_SCROLL.equals(s)) {
-				swt |= SWT.NO_SCROLL;
-			}
-			if (NO_TRIM.equals(s)) {
-				swt |= SWT.NO_TRIM;
-			}
-			if (NONE.equals(s)) {
-				swt |= SWT.NONE;
-			}
-			if (NORMAL.equals(s)) {
-				swt |= SWT.NORMAL;
-			}
-			if (ON_TOP.equals(s)) {
-				swt |= SWT.ON_TOP;
-			}
-			if (OPEN.equals(s)) {
-				swt |= SWT.OPEN;
-			}
-			if (POP_UP.equals(s)) {
-				swt |= SWT.POP_UP;
-			}
-			if (PRIMARY_MODAL.equals(s)) {
-				swt |= SWT.PRIMARY_MODAL;
-			}
-			if (PUSH.equals(s)) {
-				swt |= SWT.PUSH;
-			}
-			if (RADIO.equals(s)) {
-				swt |= SWT.RADIO;
-			}
-			if (READ_ONLY.equals(s)) {
-				swt |= SWT.READ_ONLY;
-			}
-			if (RESIZE.equals(s)) {
-				swt |= SWT.RESIZE;
-			}
-			if (RIGHT.equals(s)) {
-				swt |= SWT.RIGHT;
-			}
-			if (RIGHT_TO_LEFT.equals(s)) {
-				swt |= SWT.RIGHT_TO_LEFT;
-			}
-			if (SCROLL_LINE.equals(s)) {
-				swt |= SWT.SCROLL_LINE;
-			}
-			if (SCROLL_LOCK.equals(s)) {
-				swt |= SWT.SCROLL_LOCK;
-			}
-			if (SCROLL_PAGE.equals(s)) {
-				swt |= SWT.SCROLL_PAGE;
-			}
-			if (SHADOW_ETCHED_IN.equals(s)) {
-				swt |= SWT.SHADOW_ETCHED_IN;
-			}
-			if (SHADOW_ETCHED_OUT.equals(s)) {
-				swt |= SWT.SHADOW_ETCHED_OUT;
-			}
-			if (SHADOW_IN.equals(s)) {
-				swt |= SWT.SHADOW_IN;
-			}
-			if (SHADOW_NONE.equals(s)) {
-				swt |= SWT.SHADOW_NONE;
-			}
-			if (SHADOW_OUT.equals(s)) {
-				swt |= SWT.SHADOW_OUT;
-			}
-			if (SHELL_TRIM.equals(s)) {
-				swt |= SWT.SHELL_TRIM;
-			}
-			if (SHORT.equals(s)) {
-				swt |= SWT.SHORT;
-			}
-			if (SIMPLE.equals(s)) {
-				swt |= SWT.SIMPLE;
-			}
-			if (SINGLE.equals(s)) {
-				swt |= SWT.SINGLE;
-			}
-			if (SMOOTH.equals(s)) {
-				swt |= SWT.SMOOTH;
-			}
-			if (TITLE.equals(s)) {
-				swt |= SWT.TITLE;
-			}
-			if (TOGGLE.equals(s)) {
-				swt |= SWT.TOGGLE;
-			}
-			if (TOP.equals(s)) {
-				swt |= SWT.TOP;
-			}
-			if (UP.equals(s)) {
-				swt |= SWT.UP;
-			}
-			if (V_SCROLL.equals(s)) {
-				swt |= SWT.V_SCROLL;
-			}
-			if (VERTICAL.equals(s)) {
-				swt |= SWT.VERTICAL;
-			}
-			if (WRAP.equals(s)) {
-				swt |= SWT.WRAP;
-			}
-			if (YES.equals(s)) {
-				swt |= SWT.YES;
-			}
-		}
-		return swt;
-	}
-
-	/**
-	 * Configure parts of viewer common to Table and Tree types.
-	 * 
-	 * @param viewer
-	 * @param columnData
-	 *            JAXB data element describing viewer columns
-	 * @param listener
-	 * @param tooltip
-	 */
-	private static void setupCommon(final ColumnViewer viewer, List<ColumnDataType> columnData, ISelectionChangedListener listener,
-			boolean tooltip) {
-		String[] columnProperties = new String[columnData.size()];
-		for (int i = 0; i < columnData.size(); i++) {
-			ColumnDataType columnDescriptor = columnData.get(i);
-			columnProperties[i] = columnDescriptor.getName();
-		}
-		viewer.setColumnProperties(columnProperties);
-		if (tooltip) {
-			ColumnViewerToolTipSupport.enableFor(viewer);
-		}
-		if (listener != null) {
-			viewer.addSelectionChangedListener(listener);
-		}
-		viewer.setLabelProvider(new ViewerDataCellLabelProvider(columnData));
-	}
-
-	/**
-	 * Configure parts of viewer specific to Table type.
-	 * 
-	 * @param viewer
-	 * @param columnData
-	 *            JAXB data element describing viewer columns
-	 * @param sortOnName
-	 * @param headerVisible
-	 * @param linesVisible
-	 */
-	private static void setupSpecific(final CheckboxTableViewer viewer, List<ColumnDataType> columnData, Boolean sortOnName,
-			boolean headerVisible, boolean linesVisible) {
-		for (int i = 0; i < columnData.size(); i++) {
-			ColumnDataType columnDescriptor = columnData.get(i);
-			TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
-			TableColumn column = viewerColumn.getColumn();
-			String name = columnDescriptor.getName();
-			column.setText(name);
-			column.setMoveable(columnDescriptor.isMoveable());
-			column.setResizable(columnDescriptor.isResizable());
-			String tt = columnDescriptor.getTooltip();
-			if (tt != null) {
-				column.setToolTipText(tt);
-			}
-			if (UNDEFINED != columnDescriptor.getWidth()) {
-				column.setWidth(columnDescriptor.getWidth());
-			}
-			if (null != columnDescriptor.getAlignment()) {
-				column.setAlignment(getStyle(columnDescriptor.getAlignment()));
-			}
-			if (COLUMN_NAME.equals(name)) {
-				if (sortOnName != null) {
-					if (sortOnName) {
-						column.addSelectionListener(getAttributeViewerSelectionAdapter(viewer));
-					}
-				}
-			}
-			if (COLUMN_VALUE.equals(columnDescriptor.getName())) {
-				viewerColumn.setEditingSupport(new AttributeViewerEditingSupport(viewer));
-			}
-		}
-		viewer.setContentProvider(new TableDataContentProvider());
-		viewer.getTable().setHeaderVisible(headerVisible);
-		viewer.getTable().setLinesVisible(linesVisible);
-	}
-
-	/**
-	 * Configure parts of viewer specific to Tree type.
-	 * 
-	 * @param viewer
-	 * @param columnData
-	 *            JAXB data element describing viewer columns
-	 * @param sortOnName
-	 * @param headerVisible
-	 * @param linesVisible
-	 */
-	private static void setupSpecific(final CheckboxTreeViewer viewer, List<ColumnDataType> columnData, Boolean sortOnName,
-			boolean headerVisible, boolean linesVisible) {
-		for (int i = 0; i < columnData.size(); i++) {
-			ColumnDataType columnDescriptor = columnData.get(i);
-			TreeViewerColumn viewerColumn = new TreeViewerColumn(viewer, SWT.NONE);
-			TreeColumn column = viewerColumn.getColumn();
-			String name = columnDescriptor.getName();
-			column.setText(name);
-			column.setMoveable(columnDescriptor.isMoveable());
-			column.setResizable(columnDescriptor.isResizable());
-			String tt = columnDescriptor.getTooltip();
-			if (tt != null) {
-				column.setToolTipText(tt);
-			}
-			if (UNDEFINED != columnDescriptor.getWidth()) {
-				column.setWidth(columnDescriptor.getWidth());
-			}
-			if (null != columnDescriptor.getAlignment()) {
-				column.setAlignment(getStyle(columnDescriptor.getAlignment()));
-			}
-			if (COLUMN_NAME.equals(name)) {
-				if (sortOnName != null) {
-					if (sortOnName) {
-						column.addSelectionListener(getAttributeViewerSelectionAdapter(viewer));
-					}
-				}
-			}
-			if (COLUMN_VALUE.equals(columnDescriptor.getName())) {
-				viewerColumn.setEditingSupport(new AttributeViewerEditingSupport(viewer));
-			}
-		}
-		viewer.setContentProvider(new TreeDataContentProvider());
-		viewer.getTree().setHeaderVisible(headerVisible);
-		viewer.getTree().setLinesVisible(linesVisible);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMConfigurationImportWizard.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMConfigurationImportWizard.java
deleted file mode 100644
index 13aacae..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMConfigurationImportWizard.java
+++ /dev/null
@@ -1,146 +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.ui.wizards;
-
-import java.io.IOException;
-import java.net.URL;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-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.core.runtime.SubMonitor;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.ui.JAXBUIPlugin;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * For importing XML configurations from the installed plugins to the workspace
- * for possible editing and export.
- * 
- * @author arossi
- * 
- */
-public class JAXBRMConfigurationImportWizard extends Wizard implements IImportWizard, IJAXBUINonNLSConstants {
-
-	private JAXBRMConfigurationImportWizardPage mainPage;
-
-	public JAXBRMConfigurationImportWizard() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#addPages()
-	 */
-	@Override
-	public void addPages() {
-		super.addPages();
-		addPage(mainPage);
-	}
-
-	/*
-	 * Loads available configurations.
-	 * 
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
-	 * org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		setWindowTitle(Messages.ConfigurationImportWizardTitle);
-		setNeedsProgressMonitor(true);
-		mainPage = new JAXBRMConfigurationImportWizardPage(Messages.ConfigurationImportWizardPageTitle);
-		mainPage.loadConfigurations();
-	}
-
-	/*
-	 * Copies file to resourceManagers project and refreshes it. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	@Override
-	public boolean performFinish() {
-		new UIJob(RESOURCE_MANAGERS) {
-			@Override
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-				SubMonitor subMon = SubMonitor.convert(monitor);
-				try {
-					URL selection = mainPage.getSelectedConfiguration();
-					if (selection != null) {
-						try {
-							String name = mainPage.getSelectedName();
-							IProject project = checkResourceManagersProject(subMon.newChild(10));
-							if (project == null) {
-								return Status.OK_STATUS;
-							}
-
-							IFile newConfig = project.getFile(name + DOT_XML);
-							int createTry = 1;
-							while (newConfig.exists()) {
-								newConfig = project.getFile(name + SP + OPENP + createTry++ + CLOSP + DOT_XML);
-							}
-							newConfig.create(selection.openStream(), IResource.NONE, subMon.newChild(10));
-						} catch (CoreException io) {
-							JAXBUIPlugin.log(io);
-						} catch (IOException io) {
-							JAXBUIPlugin.log(io);
-						}
-					}
-					return Status.OK_STATUS;
-				} finally {
-					if (monitor != null) {
-						monitor.done();
-					}
-				}
-			}
-		}.schedule();
-		return true;
-	}
-
-	/*
-	 * By convention, "resourceManagers" project in the user's workspace.
-	 */
-	private static IProject checkResourceManagersProject(IProgressMonitor monitor) throws CoreException {
-		SubMonitor subMon = SubMonitor.convert(monitor);
-		try {
-			IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(RESOURCE_MANAGERS);
-			if (!project.exists()) {
-				boolean create = MessageDialog.openQuestion(Display.getDefault().getActiveShell(),
-						Messages.ResourceManagersNotExist_title,
-						Messages.JAXBRMConfigurationImportWizard_createResourceManagersProject);
-				if (!create) {
-					return null;
-				}
-				project.create(subMon.newChild(10));
-				if (!project.isOpen()) {
-					project.open(subMon.newChild(10));
-				}
-			}
-			return project;
-		} finally {
-			if (monitor != null) {
-				monitor.done();
-			}
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMConfigurationImportWizardPage.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMConfigurationImportWizardPage.java
deleted file mode 100644
index 5207cc7..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMConfigurationImportWizardPage.java
+++ /dev/null
@@ -1,136 +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.ui.wizards;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.ui.util.WidgetBuilderUtils;
-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.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * Loads all extensions to the JAXB Resource Manager extension point and
- * displays names for user to select from.
- * 
- * @author arossi
- * 
- */
-public class JAXBRMConfigurationImportWizardPage extends WizardPage implements IJAXBUINonNLSConstants, SelectionListener {
-	private Combo configurations;
-	private String[] items;
-	private URL[] urls;
-	private int index;
-
-	private final Map<String, Map<String, URL>> fRMJAXBResourceManagers;
-
-	/**
-	 * @param pageName
-	 */
-	public JAXBRMConfigurationImportWizardPage(String pageName) {
-		super(pageName);
-		setDescription(Messages.ConfigurationImportWizardPageDescription);
-		fRMJAXBResourceManagers = new TreeMap<String, Map<String, URL>>();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
-	 * .Composite)
-	 */
-	public void createControl(Composite parent) {
-		GridData gridData = WidgetBuilderUtils.createGridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL, 3);
-		GridLayout layout = WidgetBuilderUtils.createGridLayout(3, false);
-		Group group = WidgetBuilderUtils.createGroup(parent, SWT.NONE, layout, gridData);
-		new Label(group, SWT.NONE).setLayoutData(gridData);
-		WidgetBuilderUtils.createLabel(group, Messages.ConfigurationImportWizardPageLabel, SWT.LEFT, 1).setToolTipText(
-				Messages.ConfigurationImportWizardPageTooltip);
-		gridData = WidgetBuilderUtils.createGridDataFillH(2);
-		configurations = WidgetBuilderUtils.createCombo(group, SWT.BORDER | SWT.READ_ONLY, gridData, items, ZEROSTR, null, null,
-				this);
-		setControl(group);
-	}
-
-	/**
-	 * @return location of the selected configuration.
-	 */
-	public URL getSelectedConfiguration() {
-		if (index < 0 || index >= urls.length) {
-			return null;
-		}
-		return urls[index];
-	}
-
-	/**
-	 * @return name of the selection
-	 */
-	public String getSelectedName() {
-		if (index < 0 || index >= items.length) {
-			return null;
-		}
-		return items[index];
-	}
-
-	/**
-	 * Populate the combo box and URL data with the available extensions.
-	 */
-	public void loadConfigurations() {
-		JAXBRMConfigurationSelectionFactory.loadExtensions(fRMJAXBResourceManagers);
-		List<String> names = new ArrayList<String>();
-		names.add(ZEROSTR);
-		List<URL> locations = new ArrayList<URL>();
-		locations.add(null);
-		for (Map<String, URL> map : fRMJAXBResourceManagers.values()) {
-			for (Map.Entry<String, URL> e : map.entrySet()) {
-				names.add(e.getKey());
-				locations.add(e.getValue());
-			}
-		}
-		items = names.toArray(new String[0]);
-		urls = locations.toArray(new URL[0]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse
-	 * .swt.events.SelectionEvent)
-	 */
-	public void widgetDefaultSelected(SelectionEvent e) {
-		widgetSelected(e);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
-	 * .events.SelectionEvent)
-	 */
-	public void widgetSelected(SelectionEvent e) {
-		index = configurations.getSelectionIndex();
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMConfigurationSelectionFactory.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMConfigurationSelectionFactory.java
deleted file mode 100644
index 611c801..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMConfigurationSelectionFactory.java
+++ /dev/null
@@ -1,228 +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 Implementation
- *     Albert L. Rossi - modifications to support loading external XML; 
- *                       also included the unmarshaling call here so the 
- *                       data is available to the other wizard pages.
- */
-package org.eclipse.ptp.rm.jaxb.ui.wizards;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerConfiguration;
-import org.eclipse.ptp.rm.jaxb.core.utils.JAXBInitializationUtils;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.ui.JAXBUIPlugin;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.ui.util.WidgetActionUtils;
-import org.eclipse.ptp.rmsystem.IResourceManagerConfiguration;
-import org.eclipse.ptp.ui.wizards.RMConfigurationSelectionFactory;
-import org.eclipse.swt.widgets.Display;
-import org.osgi.framework.Bundle;
-
-/**
- * For retrieving and loading configurations for the JAXB class of resource
- * managers. Looks for configurations in two ways: by accessing extension
- * providers, and by searching in the workspace for a project called
- * "resourceManagers". The latter allows the user to import custom XML
- * configurations.
- * 
- */
-public class JAXBRMConfigurationSelectionFactory extends RMConfigurationSelectionFactory implements IJAXBUINonNLSConstants {
-
-	/**
-	 * For searching the "resourceManagers" project for .xml files.
-	 */
-	private static final FilenameFilter xmlFilter = new FilenameFilter() {
-		public boolean accept(File dir, String name) {
-			File f = new File(dir, name);
-			return name.endsWith(DOT_XML) && f.isFile();
-		}
-	};
-
-	private static Map<String, Map<String, URL>> fRMJAXBResourceManagers = null;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.ui.wizards.RMConfigurationSelectionFactory#
-	 * getConfigurationTypes()
-	 */
-	@Override
-	public String[] getConfigurationNames() {
-		return getJAXBResourceManagerNames();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.ui.wizards.RMConfigurationSelectionFactory#
-	 * setConfigurationType(java.lang.String,
-	 * org.eclipse.ptp.rmsystem.IResourceManagerConfiguration)
-	 */
-	@Override
-	public void setConfigurationName(String name, IResourceManagerConfiguration configuration) {
-		if (configuration instanceof IJAXBResourceManagerConfiguration) {
-			IJAXBResourceManagerConfiguration jaxbConfiguration = (IJAXBResourceManagerConfiguration) configuration;
-			jaxbConfiguration.setRMConfigurationURL(getJAXBResourceManagerConfiguration(name));
-		}
-		configuration.setName(name);
-	}
-
-	/**
-	 * Looks up the configuration; called when the user selects a name from the
-	 * wizard list.
-	 * 
-	 * @param name
-	 * @return location of the configuration
-	 */
-	private URL getJAXBResourceManagerConfiguration(String name) {
-		loadJAXBResourceManagers(false);
-		Map<String, URL> info = fRMJAXBResourceManagers.get(getId());
-		if (info != null) {
-			return info.get(name);
-		}
-		return null;
-	}
-
-	/**
-	 * Gathers together the names of all the available JAXB resource manager
-	 * configurations from both plugins providing extensions to the extension
-	 * point as well as from the user's workspace.
-	 * 
-	 * @return array of names to display in wizard table
-	 */
-	private String[] getJAXBResourceManagerNames() {
-		loadJAXBResourceManagers(true);
-		Map<String, URL> info = fRMJAXBResourceManagers.get(getId());
-		if (info != null) {
-			return info.keySet().toArray(new String[0]);
-		}
-		return new String[0];
-	}
-
-	/**
-	 * Gets all extensions to the
-	 * org.eclipse.ptp.rm.jaxb.core.JAXBResourceManagerConfigurations extension
-	 * point and loads their names and locations.
-	 * 
-	 * @param resourceManagers
-	 *            map of extId to map(name, URL)
-	 */
-	static void loadExtensions(Map<String, Map<String, URL>> resourceManagers) {
-		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = registry.getExtensionPoint(RM_CONFIG_EXTENSION_POINT);
-
-		if (extensionPoint != null) {
-			for (IExtension ext : extensionPoint.getExtensions()) {
-				for (IConfigurationElement ce : ext.getConfigurationElements()) {
-					String id = ce.getAttribute(ID);
-					Map<String, URL> info = resourceManagers.get(id);
-					if (info == null) {
-						info = new HashMap<String, URL>();
-						resourceManagers.put(id, info);
-					}
-					String name = ce.getAttribute(NAME);
-					String configurationFile = ce.getAttribute(CONFIGURATION_FILE_ATTRIBUTE);
-					String bundleId = ce.getDeclaringExtension().getContributor().getName();
-					Bundle bundle = Platform.getBundle(bundleId);
-					if (bundle != null) {
-						URL url = bundle.getEntry(configurationFile);
-						if (url != null) {
-							info.put(name, url);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Searches for .xml files contained in the user's workspace under the
-	 * project named "resourceManagers". Validates each one found and on failed
-	 * validation displays an error message (if so indicated).
-	 * 
-	 * @param showError
-	 *            display an error message if any configuration is invalid
-	 *            (against the internal XSD). Only true when loading the widget
-	 *            the first time.
-	 */
-	private static void loadExternal(boolean showError) {
-		Map<String, URL> info = fRMJAXBResourceManagers.get(JAXB_SERVICE_PROVIDER_EXTPT);
-		if (info == null) {
-			info = new HashMap<String, URL>();
-			fRMJAXBResourceManagers.put(JAXB_SERVICE_PROVIDER_EXTPT, info);
-		}
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(RESOURCE_MANAGERS);
-		StringBuffer invalid = new StringBuffer();
-		if (project != null) {
-			IPath path = project.getLocation();
-			if (path != null) {
-				File dir = path.toFile();
-				File[] custom = dir.listFiles(xmlFilter);
-				for (File rm : custom) {
-					try {
-						String name = rm.getName();
-						name = name.substring(0, name.length() - 4);
-						URI uri = rm.toURI();
-						URL url = uri.toURL();
-						try {
-							JAXBInitializationUtils.validate(url);
-						} catch (Throwable t) {
-							invalid.append(LINE_SEP).append(name);
-							JAXBUIPlugin.log(t.getMessage());
-							continue;
-						}
-						info.put(name, url);
-					} catch (MalformedURLException t) {
-						JAXBUIPlugin.log(t);
-					}
-				}
-			}
-		}
-		if (showError && invalid.length() > 0) {
-			WidgetActionUtils.errorMessage(Display.getCurrent().getActiveShell(), null,
-					Messages.InvalidConfiguration + invalid.toString(), Messages.InvalidConfiguration_title, false);
-		}
-	}
-
-	/**
-	 * Wrapper method. Calls {@link #loadExtensions()} and
-	 * {@link #loadExternal(boolean)}.
-	 */
-	private static void loadJAXBResourceManagers(boolean showError) {
-		if (fRMJAXBResourceManagers == null) {
-			fRMJAXBResourceManagers = new HashMap<String, Map<String, URL>>();
-		} else {
-			fRMJAXBResourceManagers.clear();
-		}
-
-		loadExtensions(fRMJAXBResourceManagers);
-
-		/*
-		 * Also search the workspace for managers. By convention these should
-		 * all go in a directory called "resourceManagers". Loads only valid XML
-		 */
-		loadExternal(showError);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMControlConfigurationWizardPage.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMControlConfigurationWizardPage.java
deleted file mode 100644
index 203be3d..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMControlConfigurationWizardPage.java
+++ /dev/null
@@ -1,118 +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.ui.wizards;
-
-import java.net.URI;
-
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.ui.PTPRemoteUIPlugin;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerConfiguration;
-import org.eclipse.ptp.rm.jaxb.core.data.SiteType;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.ui.JAXBUIPlugin;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.ui.util.RemoteUIServicesUtils;
-import org.eclipse.ptp.rm.ui.wizards.AbstractRemoteResourceManagerConfigurationWizardPage;
-import org.eclipse.ptp.ui.wizards.IRMConfigurationWizard;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Generic Wizard for the JAXB Resource Manager Control. Provides connection
- * configuration.
- * 
- * @author arossi
- * 
- */
-public final class JAXBRMControlConfigurationWizardPage extends AbstractRemoteResourceManagerConfigurationWizardPage implements
-		IJAXBUINonNLSConstants {
-
-	/**
-	 * @param wizard
-	 */
-	public JAXBRMControlConfigurationWizardPage(IRMConfigurationWizard wizard) {
-		super(wizard, Messages.JAXBRMControlConfigurationWizardPage_Title);
-		setPageComplete(false);
-		setTitle(Messages.JAXBRMControlConfigurationWizardPage_Title);
-		setDescription(Messages.JAXBConnectionWizardPage_Description);
-	}
-
-	/*
-	 * Exports as default remote connection information whatever is set in the
-	 * Site subtree of the JAXB data tree. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.ui.wizards.
-	 * AbstractRemoteResourceManagerConfigurationWizardPage
-	 * #doCreateContents(org.eclipse.swt.widgets.Composite)
-	 */
-	@Override
-	protected Composite doCreateContents(Composite parent) {
-		Composite comp = super.doCreateContents(parent);
-		try {
-			SiteType site = getBaseConfiguration().getResourceManagerData().getSiteData();
-			if (site != null && site.getControlConnection() != null && getConfiguration().getRemoteServicesId() == null) {
-				/*
-				 * Configuration has not be initialized, so initialize now with
-				 * values from XML
-				 */
-				URI uri = new URI(site.getControlConnection());
-				IRemoteServices services = PTPRemoteUIPlugin.getDefault().getRemoteServices(uri, getWizard().getContainer());
-				if (services != null) {
-					getConfiguration().setRemoteServicesId(services.getId());
-
-					String auth = uri.getAuthority();
-					String host = uri.getHost();
-					String user = uri.getUserInfo();
-					int port = uri.getPort();
-
-					if (auth != null && host != null) {
-						IRemoteConnection conn = services.getConnectionManager().getConnection(host);
-						if (conn == null && services.canCreateConnections()) {
-							conn = services.getConnectionManager().newConnection(host);
-							conn.setAddress(host);
-
-							if (!auth.equals(host)) {
-								if (user != null) {
-									conn.setUsername(user);
-								}
-								if (port != -1) {
-									conn.setPort(port);
-								}
-							}
-						}
-						if (conn != null) {
-							getConfiguration().setConnectionName(conn.getName());
-							RemoteUIServicesUtils.setConnectionHints(connectionWidget, conn);
-						}
-					}
-				}
-			}
-		} catch (Throwable t) {
-			JAXBUIPlugin.log(t);
-		}
-		return comp;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.ui.wizards.RMConfigurationWizardPage#getConfiguration()
-	 */
-	@Override
-	protected IJAXBResourceManagerConfiguration getConfiguration() {
-		return (IJAXBResourceManagerConfiguration) super.getConfiguration();
-	}
-
-	private IJAXBResourceManagerConfiguration getBaseConfiguration() {
-		return (IJAXBResourceManagerConfiguration) ((IRMConfigurationWizard) getWizard()).getBaseConfiguration();
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMControlConfigurationWizardPageFactory.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMControlConfigurationWizardPageFactory.java
deleted file mode 100644
index fff2074..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMControlConfigurationWizardPageFactory.java
+++ /dev/null
@@ -1,38 +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.jaxb.ui.wizards;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ptp.ui.wizards.IRMConfigurationWizard;
-import org.eclipse.ptp.ui.wizards.RMConfigurationWizardPage;
-import org.eclipse.ptp.ui.wizards.RMConfigurationWizardPageFactory;
-
-/**
- * Adds control configuration page.
- */
-public class JAXBRMControlConfigurationWizardPageFactory extends RMConfigurationWizardPageFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.ui.wizards.RMConfigurationWizardPageFactory#getPages(
-	 * org.eclipse.ptp.ui.wizards.IRMConfigurationWizard)
-	 */
-	@Override
-	public RMConfigurationWizardPage[] getPages(IRMConfigurationWizard wizard) {
-		List<RMConfigurationWizardPage> pages = new ArrayList<RMConfigurationWizardPage>();
-		pages.add(new JAXBRMControlConfigurationWizardPage(wizard));
-		return pages.toArray(new RMConfigurationWizardPage[0]);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMMonitorConfigurationWizardPageFactory.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMMonitorConfigurationWizardPageFactory.java
deleted file mode 100644
index 22e8f8f..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMMonitorConfigurationWizardPageFactory.java
+++ /dev/null
@@ -1,38 +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.jaxb.ui.wizards;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ptp.ui.wizards.IRMConfigurationWizard;
-import org.eclipse.ptp.ui.wizards.RMConfigurationWizardPage;
-import org.eclipse.ptp.ui.wizards.RMConfigurationWizardPageFactory;
-
-/**
- * Adds monitor configuration page.
- */
-public class JAXBRMMonitorConfigurationWizardPageFactory extends RMConfigurationWizardPageFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.ui.wizards.RMConfigurationWizardPageFactory#getPages(
-	 * org.eclipse.ptp.ui.wizards.IRMConfigurationWizard)
-	 */
-	@Override
-	public RMConfigurationWizardPage[] getPages(IRMConfigurationWizard wizard) {
-		List<RMConfigurationWizardPage> pages = new ArrayList<RMConfigurationWizardPage>();
-		pages.add(new JAXBRMMonitoringConfigurationWizardPage(wizard));
-		return pages.toArray(new RMConfigurationWizardPage[0]);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMMonitoringConfigurationWizardPage.java b/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMMonitoringConfigurationWizardPage.java
deleted file mode 100644
index 3fa8ea1..0000000
--- a/rms/org.eclipse.ptp.rm.jaxb.ui/src/org/eclipse/ptp/rm/jaxb/ui/wizards/JAXBRMMonitoringConfigurationWizardPage.java
+++ /dev/null
@@ -1,123 +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.ui.wizards;
-
-import java.net.URI;
-
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.ui.PTPRemoteUIPlugin;
-import org.eclipse.ptp.rm.jaxb.core.IJAXBResourceManagerConfiguration;
-import org.eclipse.ptp.rm.jaxb.core.data.SiteType;
-import org.eclipse.ptp.rm.jaxb.ui.IJAXBUINonNLSConstants;
-import org.eclipse.ptp.rm.jaxb.ui.JAXBUIPlugin;
-import org.eclipse.ptp.rm.jaxb.ui.messages.Messages;
-import org.eclipse.ptp.rm.jaxb.ui.util.RemoteUIServicesUtils;
-import org.eclipse.ptp.rm.ui.wizards.AbstractRemoteResourceManagerConfigurationWizardPage;
-import org.eclipse.ptp.ui.wizards.IRMConfigurationWizard;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Generic Wizard for the JAXB Resource Manager Monitoring. Provides connection
- * configuration.
- * 
- * @author arossi
- * 
- */
-public final class JAXBRMMonitoringConfigurationWizardPage extends AbstractRemoteResourceManagerConfigurationWizardPage implements
-		IJAXBUINonNLSConstants {
-
-	public JAXBRMMonitoringConfigurationWizardPage(IRMConfigurationWizard wizard) {
-		this(wizard, Messages.JAXBRMMonitoringConfigurationWizardPage_Title);
-	}
-
-	/**
-	 * @param wizard
-	 * @param pageName
-	 */
-	public JAXBRMMonitoringConfigurationWizardPage(IRMConfigurationWizard wizard, String pageName) {
-		super(wizard, pageName);
-		setPageComplete(false);
-		setTitle(Messages.JAXBRMMonitoringConfigurationWizardPage_Title);
-		setDescription(Messages.JAXBConnectionWizardPage_Description);
-		setEnableUseDefault(Messages.AbstractRemoteProxyResourceManagerConfigurationWizardPage_3b);
-	}
-
-	/*
-	 * Exports as default remote connection information whatever is set in the
-	 * Site subtree of the JAXB data tree. (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rm.ui.wizards.
-	 * AbstractRemoteResourceManagerConfigurationWizardPage
-	 * #doCreateContents(org.eclipse.swt.widgets.Composite)
-	 */
-	@Override
-	protected Composite doCreateContents(Composite parent) {
-		Composite comp = super.doCreateContents(parent);
-		try {
-			SiteType site = getBaseConfiguration().getResourceManagerData().getSiteData();
-			if (site != null && site.getMonitorConnection() != null && getConfiguration().getRemoteServicesId() == null) {
-				/*
-				 * Configuration has not be initialized, so initialize now with
-				 * values from XML
-				 */
-				URI uri = new URI(site.getMonitorConnection());
-				IRemoteServices services = PTPRemoteUIPlugin.getDefault().getRemoteServices(uri, getWizard().getContainer());
-				if (services != null) {
-					getConfiguration().setRemoteServicesId(services.getId());
-
-					String auth = uri.getAuthority();
-					String host = uri.getHost();
-					String user = uri.getUserInfo();
-					int port = uri.getPort();
-
-					if (auth != null && host != null) {
-						IRemoteConnection conn = services.getConnectionManager().getConnection(host);
-						if (conn == null && services.canCreateConnections()) {
-							conn = services.getConnectionManager().newConnection(host);
-							conn.setAddress(host);
-
-							if (!auth.equals(host)) {
-								if (user != null) {
-									conn.setUsername(user);
-								}
-								if (port != -1) {
-									conn.setPort(port);
-								}
-							}
-						}
-						if (conn != null) {
-							getConfiguration().setConnectionName(conn.getName());
-							RemoteUIServicesUtils.setConnectionHints(connectionWidget, conn);
-						}
-					}
-				}
-			}
-		} catch (Throwable t) {
-			JAXBUIPlugin.log(t);
-		}
-		return comp;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.ui.wizards.RMConfigurationWizardPage#getConfiguration()
-	 */
-	@Override
-	protected IJAXBResourceManagerConfiguration getConfiguration() {
-		return (IJAXBResourceManagerConfiguration) super.getConfiguration();
-	}
-
-	private IJAXBResourceManagerConfiguration getBaseConfiguration() {
-		return (IJAXBResourceManagerConfiguration) ((IRMConfigurationWizard) getWizard()).getBaseConfiguration();
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/.classpath b/rms/org.eclipse.ptp.rm.lml.core/.classpath
deleted file mode 100644
index ad32c83..0000000
--- a/rms/org.eclipse.ptp.rm.lml.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/JavaSE-1.6"/>
-	<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.lml.core/.project b/rms/org.eclipse.ptp.rm.lml.core/.project
deleted file mode 100644
index 6df4c27..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rm.lml.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/rms/org.eclipse.ptp.rm.lml.core/.settings/org.eclipse.core.resources.prefs b/rms/org.eclipse.ptp.rm.lml.core/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 3abc675..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 14 12:52:19 CET 2011
-eclipse.preferences.version=1
-encoding//src/org/eclipse/ptp/rm/lml/core/ILMLManager.java=UTF-8
diff --git a/rms/org.eclipse.ptp.rm.lml.core/.settings/org.eclipse.jdt.core.prefs b/rms/org.eclipse.ptp.rm.lml.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index d01716c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Wed Jan 26 13:46:37 CET 2011
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/rms/org.eclipse.ptp.rm.lml.core/META-INF/MANIFEST.MF b/rms/org.eclipse.ptp.rm.lml.core/META-INF/MANIFEST.MF
deleted file mode 100644
index 0552652..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,23 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Core
-Bundle-SymbolicName: org.eclipse.ptp.rm.lml.core;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Import-Package: org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.core.runtime.preferences,
- org.eclipse.osgi.util,
- org.osgi.framework,
- org.osgi.service.prefs
-Export-Package: org.eclipse.ptp.rm.lml.core,
- org.eclipse.ptp.rm.lml.core.events,
- org.eclipse.ptp.rm.lml.core.listeners,
- org.eclipse.ptp.rm.lml.core.model,
- org.eclipse.ptp.rm.lml.core.util,
- org.eclipse.ptp.rm.lml.internal.core,
- org.eclipse.ptp.rm.lml.internal.core.elements,
- org.eclipse.ptp.rm.lml.internal.core.model,
- org.eclipse.ptp.rm.lml.internal.core.nodedisplay
-Bundle-Activator: org.eclipse.ptp.rm.lml.core.LMLCorePlugin
-Bundle-ActivationPolicy: lazy
diff --git a/rms/org.eclipse.ptp.rm.lml.core/build.properties b/rms/org.eclipse.ptp.rm.lml.core/build.properties
deleted file mode 100644
index e8192d6..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               schema/
diff --git a/rms/org.eclipse.ptp.rm.lml.core/schema/chart.xsd b/rms/org.eclipse.ptp.rm.lml.core/schema/chart.xsd
deleted file mode 100644
index 5a0f24d..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/schema/chart.xsd
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-          LML - LLView markup language 
-
-   Copyright (c) 2011 Forschungszentrum Juelich GmbH
-   All rights reserved. This program and the accompanying materials
-   are made available under the terms of the Eclipse Public License v1.0
-   which accompanies this distribution and is available at
-   http://www.eclipse.org/legal/epl-v10.html
- -->
-<schema targetNamespace="http://www.llview.de" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:lml="http://www.llview.de">
-
-	<include schemaLocation="lgui.xsd"></include>
-	
-    <complexType name="chart_type">
-    	<annotation>
-    		<documentation>
-    			Collects data of a chart describing a histogram or other
-    			diagrams.
-    		</documentation>
-    	</annotation>
-    	<complexContent>
-    		<extension base="lml:gobject_type">
-		    	<sequence>
-		    		<element name="axes" type="lml:axes_type" minOccurs="0"
-		    			maxOccurs="1">
-		    		</element>
-		    		<element name="data" type="lml:datacollection_type" minOccurs="0" maxOccurs="unbounded"></element>
-		    	</sequence>
-    		</extension>    	
-    	</complexContent>
-    </complexType>
-    
-    <complexType name="axis_type">
-        <annotation>
-        	<documentation>Type for either x- or y-axis. Contains important data of these objects.</documentation>
-        </annotation>
-        <sequence>
-    		<element name="ticlabels" type="lml:ticlabels_type" minOccurs="0" maxOccurs="1"></element>
-    	</sequence>
-    	<attribute name="type" type="lml:axis_type_constants" default="linear"></attribute>
-    	<attribute name="unit" type="string">
-    		<annotation>
-    			<documentation>
-    				Examples: hour, days, volt
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="label" type="string">
-    		<annotation>
-    			<documentation>
-    				Description of what this axis is showing.
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="shortlabel" type="string"></attribute>
-    	<attribute name="min" type="double" use="required"></attribute>
-    	<attribute name="max" type="double" use="required"></attribute>
-    	<attribute name="ticcount" type="nonNegativeInteger" default="10"></attribute>
-    </complexType>
-
-    <simpleType name="axis_type_constants">
-        <annotation>
-        	<documentation>Defines possible axis-types. Defines how numbers are arranged in this axis.</documentation>
-        </annotation>
-        <restriction base="string">
-    		<enumeration value="linear"></enumeration>
-    		<enumeration value="log"></enumeration>
-    	</restriction>
-    </simpleType>
-
-    <complexType name="ticlabel_type">
-        <annotation>
-        	<documentation>One ticlabel is one name or string, that is shown on an axis instead of a numerical value. The tic-labels will be shown in addition to normal tic-labels given by inserting ticcount-times a numerical value into the axis.</documentation>
-        </annotation>
-        <attribute name="pos" type="double" use="required"></attribute>
-    	<attribute name="text" type="string">
-    		<annotation>
-    			<documentation>not required. If not set pos will be printed</documentation>
-    		</annotation></attribute>
-    </complexType>
-
-    <complexType name="ticlabels_type">
-        <annotation>
-        	<documentation>Collects a list of ticlabels.</documentation>
-        </annotation>
-        <sequence>
-    		<element name="label" type="lml:ticlabel_type" minOccurs="1" maxOccurs="unbounded"></element>
-    	</sequence>
-    </complexType>
-
-    <complexType name="axes_type">
-        <annotation>
-        	<documentation>Combines one x-axis-element and one y-axis-element.</documentation>
-        </annotation>
-        <sequence>
-    		<element name="x" type="lml:axis_type" minOccurs="1"
-    			maxOccurs="1">
-    		</element>
-    		<element name="y" type="lml:axis_type" minOccurs="1" maxOccurs="1"></element>
-    	</sequence>
-    </complexType>
-
-    <complexType name="datapoint_type">
-    	<annotation>
-    		<documentation>
-    			One point in a diagram. Could define one bar in a bar
-    			chart.
-    		</documentation>
-    	</annotation>
-    	<attribute name="x" type="double" use="required"></attribute>
-    	<attribute name="y" type="double" use="required"></attribute>
-    	<attribute name="oid" type="NCName"></attribute>
-    </complexType>
-
-    <complexType name="datarect_type">
-    	<annotation>
-    		<documentation>
-    			One rect in a diagram. Used in timeline-diagram for
-    			usage-prediction in llview. (x,y) is upper left corner of the rect.
-    		</documentation>
-    	</annotation>
-    	<complexContent>
-    		<extension base="lml:datapoint_type">
-    			<attribute name="w" type="double" use="required">
-    				<annotation>
-    					<documentation>width</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="h" type="double" use="required">
-    				<annotation>
-    					<documentation>height</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="text" type="string">
-    				<annotation>
-    					<documentation>This text should be shown within the rect if possible</documentation>
-    				</annotation></attribute>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="datacollection_type">
-        <annotation>
-        	<documentation>Defines a set of datapoints and datarects.
-Saves real data of a diagram.</documentation>
-        </annotation>
-        <sequence minOccurs="0" maxOccurs="unbounded">
-    		<element name="p" type="lml:datapoint_type" minOccurs="0"
-    			maxOccurs="unbounded">
-    		</element>
-    		<element name="r" type="lml:datarect_type" minOccurs="0"
-    			maxOccurs="unbounded">
-    		</element>
-    	</sequence>
-    	<attribute name="name" type="string"></attribute>
-    	<attribute name="description" type="string"></attribute>
-    </complexType>
-
-    <complexType name="chartgroup_type">
-        <annotation>
-        	<documentation>A group of charts. Could be displayed as overlay-diagrams.</documentation>
-        </annotation>
-        <complexContent>
-    		<extension base="lml:gobject_type">
-    			<sequence>
-    				<element name="chart" type="lml:chart_type" minOccurs="1" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-</schema>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/schema/colors.xsd b/rms/org.eclipse.ptp.rm.lml.core/schema/colors.xsd
deleted file mode 100644
index 02c299e..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/schema/colors.xsd
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-          LML - LLView markup language 
-
-   Copyright (c) 2011 Forschungszentrum Juelich GmbH
-   All rights reserved. This program and the accompanying materials
-   are made available under the terms of the Eclipse Public License v1.0
-   which accompanies this distribution and is available at
-   http://www.eclipse.org/legal/epl-v10.html
- -->
-<schema targetNamespace="http://www.llview.de" elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:lml="http://www.llview.de">
-
-    <simpleType name="hexcolor_type">
-        <annotation>
-        	<documentation>Defines possible color-values. Allowed values: #Ff0 #FF0000 #FA9</documentation>
-        </annotation>
-        <restriction base="string">
-    		<pattern value="#((([0-9]|[a-f]|[A-F]){3})|(([0-9]|[a-f]|[A-F]){6}))"></pattern>
-    	</restriction>
-    </simpleType>
-
-    <complexType name="colorconstant_type">
-        <annotation>
-        	<documentation>Definition of a color name. Connects a name like "red" width a html-like color like "#F00"</documentation>
-        </annotation>
-        <attribute name="name" type="NCName" use="required"></attribute>
-    	<attribute name="color" type="lml:hexcolor_type" use="required"></attribute>
-    </complexType>
-
-
-    <complexType name="colordefinition_type">
-        <annotation>
-        	<documentation>Collects a list of colorconstants.</documentation>
-        </annotation>
-        <sequence>
-    		<element name="colorname" type="lml:colorconstant_type" minOccurs="0" maxOccurs="unbounded"></element>
-    	</sequence>
-    </complexType>
-
-</schema>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/schema/entities.xsd b/rms/org.eclipse.ptp.rm.lml.core/schema/entities.xsd
deleted file mode 100644
index 496fb53..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/schema/entities.xsd
+++ /dev/null
@@ -1,110 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-          LML - LLView markup language 
-
-   Copyright (c) 2011 Forschungszentrum Juelich GmbH
-   All rights reserved. This program and the accompanying materials
-   are made available under the terms of the Eclipse Public License v1.0
-   which accompanies this distribution and is available at
-   http://www.eclipse.org/legal/epl-v10.html
- -->
-<schema targetNamespace="http://www.llview.de" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:lml="http://www.llview.de">
-
-
-    <include schemaLocation="colors.xsd"></include>
-    
-    <complexType name="entities_type">
-        <annotation>
-        	<documentation>Dummy-root-object. Contains key and keyref definitions to define foreign keys and primary keys.
-Primary key is here objects/object.id . Foreign key is information/info.id</documentation>
-        </annotation>
-        <sequence>
-    		<element name="objects" type="lml:objects_type" minOccurs="0" maxOccurs="1"></element>
-    		<element name="information" type="lml:information_type" minOccurs="0" maxOccurs="1"></element>
-    	</sequence>
-    </complexType>
-    
-    
-    <complexType name="objects_type">
-        <annotation>
-        	<documentation>Collects a list of objects. Can only exist once in whole lml-file.</documentation>
-        </annotation>
-        <sequence>
-    		<element name="object" type="lml:object_type" minOccurs="0" maxOccurs="unbounded"></element>
-    	</sequence>    	
-    </complexType>
-
-    <complexType name="object_type">
-        <annotation>
-        	<documentation>Defines one instance within the batch-system. 
-For example one object could represent one job on the batch-system or one node.
-Even the system is one object.
-The color defines with which color this object is identified and painted.</documentation>
-        </annotation>
-        <attribute name="type" type="lml:object_name" use="required"></attribute>
-    	<attribute name="id" type="NCName" use="required"></attribute>
-    	<attribute name="color" type="lml:hexcolor_type" default="#FFF"></attribute>
-    	<attribute name="name" type="string"></attribute>
-    </complexType>
-
-    <simpleType name="object_name">
-    	<annotation>
-    		<documentation>
-    			Contains a list of possible types of objects in a batch
-    			system.
-    		</documentation>
-    	</annotation>
-    	<restriction base="string">
-    		<enumeration value="job"></enumeration>
-    		<enumeration value="node"></enumeration>
-    		<enumeration value="system"></enumeration>
-    		<enumeration value="queue"></enumeration>
-    		<enumeration value="scheduler"></enumeration>
-    		<enumeration value="class"></enumeration>
-    		<enumeration value="partition"></enumeration>
-    		<enumeration value="partmap"></enumeration>
-    		<enumeration value="smallpartition"></enumeration>
-    	</restriction>
-    </simpleType>
-
-    <complexType name="information_type">
-        <annotation>
-        	<documentation>Collects a list of infos. Exists a most once.</documentation>
-        </annotation>
-        <sequence>
-    		<element name="info" type="lml:info_type" minOccurs="0" maxOccurs="unbounded"></element>
-    	</sequence>
-    </complexType>
-
-    <complexType name="info_type">
-    	<annotation>
-    		<documentation>
-    			Is referenced to an existing object-instance by id.
-    			description gives a brief idea of what this info
-    			contains. Collects a list of key-value-pairs. For
-    			example key="cpucount" value="290.000".
-    		</documentation>
-    	</annotation>
-    	<sequence>
-    		<element name="data" type="lml:infodata_type" minOccurs="0"
-    			maxOccurs="unbounded">
-    		</element>
-    	</sequence>
-    	<attribute name="oid" type="NCName" use="required"></attribute>
-    	<attribute name="description" type="string"></attribute>
-    	<attribute name="type" type="NCName" default="notype">
-    		<annotation>
-    			<documentation>This attribute is used to distinguish between types of information. Type could be "short", "long", "unnecessary" ...
-Then you can categorize the given information.</documentation>
-    		</annotation></attribute>
-    </complexType>
-
-    <complexType name="infodata_type">
-        <annotation>
-        	<documentation>Key value pair for information.</documentation>
-        </annotation>
-        <attribute name="key" type="string" use="required"></attribute>
-    	<attribute name="value" type="string"></attribute>
-    </complexType>  
-
-</schema>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/schema/layout.xsd b/rms/org.eclipse.ptp.rm.lml.core/schema/layout.xsd
deleted file mode 100644
index 53b26bf..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/schema/layout.xsd
+++ /dev/null
@@ -1,719 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-          LML - LLView markup language 
-
-   Copyright (c) 2011 Forschungszentrum Juelich GmbH
-   All rights reserved. This program and the accompanying materials
-   are made available under the terms of the Eclipse Public License v1.0
-   which accompanies this distribution and is available at
-   http://www.eclipse.org/legal/epl-v10.html
- -->
-<schema targetNamespace="http://www.llview.de" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:lml="http://www.llview.de">
-
-    <include schemaLocation="nodedisplay.xsd"></include>
-    <complexType name="splitlayout_type">
-    	<complexContent>
-    		<extension base="lml:layout_type">
-    			<choice>
-    				<sequence>
-    					<element name="left" type="lml:pane_type"></element>
-    					<element name="right" type="lml:pane_type"></element>
-    				</sequence>
-    				<sequence>
-    					<element name="top" type="lml:pane_type"></element>
-    					<element name="bottom" type="lml:pane_type"></element>
-    				</sequence>
-    			</choice>
-    			<attribute name="divpos" type="lml:divpos_type" default="0.5"></attribute>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-
-    <complexType name="pane_type">
-    	<annotation>
-    		<documentation>
-    			Describes one side of a splitpane. This tag is later
-    			transformed into a panel. You can split one panel with
-    			left and right-components or top and bottom-components.
-    			First split will cause a horizontal split, second will
-    			cause a vertical split. The gid-attribute is for
-    			referencing graphical object-id-attributes. If there are
-    			child-elements for a pane, gid must not be specified.
-    			Through the divpos-element you are able to set the
-    			percentage of where to put the divider.
-    		</documentation>
-    	</annotation>
-   		<sequence>
-	   		<sequence minOccurs="0" maxOccurs="1">
-	    			<element name="left" type="lml:pane_type"></element>
-	    			<element name="right" type="lml:pane_type"></element>
-	   		</sequence>
-	   		<sequence minOccurs="0" maxOccurs="1">
-	    			<element name="top" type="lml:pane_type"></element>
-	    			<element name="bottom" type="lml:pane_type"></element>
-	   		</sequence>
-   		</sequence>
-    	<attribute name="gid" type="string"></attribute>
-    	<attribute name="divpos" type="lml:divpos_type" default="0.5"></attribute>
-    </complexType>
-
-    <simpleType name="divpos_type">
-    	<restriction base="double">
-    		<minInclusive value="0"></minInclusive>
-    		<maxInclusive value="1"></maxInclusive>
-    	</restriction>
-    </simpleType>
-
-    <complexType name="layout_type">
-        <annotation>
-        	<documentation>All layout-types should extend this type</documentation>
-        </annotation>
-        <attribute name="id" type="string" use="required"></attribute>
-    </complexType>
-
-    <complexType name="abslayout_type">
-    	<annotation>
-    		<documentation>
-    			Describes a layout with absolute coordinates. Every
-    			component must be added by a comp-tag.
-    		</documentation>
-    	</annotation>
-    	<complexContent>
-    		<extension base="lml:layout_type">
-    			<sequence>
-    				<element name="comp" type="lml:component_type" minOccurs="1" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-    
-    <complexType name="component_type">
-        <annotation>
-        	<documentation>Describes the absolute position of one graphical object</documentation>
-        </annotation>
-        <attribute name="gid" type="string" use="required">
-        	<annotation>
-        		<documentation>connection to a graphical object</documentation>
-        	</annotation></attribute>
-    	<attribute name="x" type="integer" use="required">
-    		<annotation>
-    			<documentation>left coordinate</documentation>
-    		</annotation></attribute>
-    	<attribute name="y" type="integer" use="required">
-    		<annotation>
-    			<documentation>upper coordinate</documentation>
-    		</annotation></attribute>
-    	<attribute name="w" type="nonNegativeInteger" default="100">
-    		<annotation>
-    			<documentation>width</documentation>
-    		</annotation></attribute>
-    	<attribute name="h" type="nonNegativeInteger" default="100">
-    		<annotation>
-    			<documentation>height</documentation>
-    		</annotation></attribute>
-    </complexType>
-
-    <complexType name="nodedisplaylayout_type">
-        <annotation>
-        	<documentation>Settings will not be inherited through hierarchy, but default layout will be set for all scheme-elements, which are not defined</documentation>
-        </annotation>
-        <complexContent>
-    		<extension base="lml:componentlayout_type">
-    			<sequence>
-    				<element name="el0" type="lml:nodedisplayelement0"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="componentlayout_type">
-    	<attribute name="id" type="string">
-    		<annotation>
-    			<documentation>
-    				identification for this component
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="gid" type="string" use="required">
-    		<annotation>
-    			<documentation>
-    				reference to the graphical object. Layout for the
-    				graphical object is defined within this tag
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="active" type="boolean" default="true">
-    		<annotation>
-    			<documentation>Defines if this component is active. If active is false, then no data for this graphical component has to be passed. This can be used for requesting information from server. Not active-components do not have to be filled with data from the server.</documentation>
-    		</annotation></attribute>
-    </complexType>
-
-    <complexType name="nodedisplayelement">
-    	<annotation>
-    		<documentation>
-    			Contains all attributes that are equal at all levels
-    		</documentation>
-    	</annotation>
-    	<complexContent>
-    		<extension base="lml:element_type">
-    			<sequence>
-    				<element name="img" type="lml:picture_type"
-    					minOccurs="0" maxOccurs="unbounded">
-    				</element>
-    			</sequence>
-    			<attribute name="rows" type="nonNegativeInteger"
-    				default="0">
-    				<annotation>
-    					<documentation>
-    						Amount of rows of lower elements
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="cols" type="nonNegativeInteger"
-    				default="8">
-    				<annotation>
-    					<documentation>
-    						Amount of columns of lower elements
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="hgap" type="nonNegativeInteger"
-    				default="1">
-    				<annotation>
-    					<documentation>
-    						horizontal space between two lower element
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="vgap" type="nonNegativeInteger"
-    				default="1">
-    				<annotation>
-    					<documentation>
-    						vertical space between two lower elements
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="fontsize" type="nonNegativeInteger"
-    				default="10">
-    				<annotation>
-    					<documentation>
-    						size of fonts printed in this element (for
-    						example a title)
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="border" type="nonNegativeInteger"
-    				default="1">
-    				<annotation>
-    					<documentation>
-    						pixels printed for a border around
-    						rectangles
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="fontfamily" type="string"
-    				default="Monospaced">
-    				<annotation>
-    					<documentation>
-    						Font used for title
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="showtitle" type="boolean"
-    				default="false">
-    				<annotation>
-    					<documentation>
-    						if true => title for elements of this level
-    						are shown, otherwise title is hidden
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="titlebackground"
-    				type="lml:hexcolor_type" default="#EFEFEF">
-    				<annotation>
-    					<documentation>
-    						background-color for title-label
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="background" type="lml:hexcolor_type"
-    				default="#FFF">
-    				<annotation>
-    					<documentation>
-    						background-color for this element
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="maxlevel" type="nonNegativeInteger">
-    				<annotation>
-    					<documentation>
-    						maximum of levels which are printed in
-    						output, absolute value (maxlevel=3 means all
-    						elements till level 3 included are printed)
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="mouseborder" type="nonNegativeInteger"
-    				default="2">
-    				<annotation>
-    					<documentation>
-    						border printed when mouse-over this
-    						component
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="transparent" type="boolean"
-    				default="true">
-    				<annotation>
-    					<documentation>
-    						Defines if this panel is drawn
-    						transparently. Upper-level paintings can
-    						then be seen. If transparent == false => the
-    						whole rectangle is painted by the specific
-    						panel on its own.
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="bordercolor" type="lml:hexcolor_type"
-    				default="#000">
-    				<annotation>
-    					<documentation>
-    						Color of the border around inner panels.
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="showfulltitle" type="boolean"
-    				default="true">
-    				<annotation>
-    					<documentation>
-    						If true full implicit name over all levels
-    						of tree is shown, otherwise implicit name is
-    						only generated over current level
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="highestrowfirst" type="boolean" default="false">
-    				<annotation>
-    					<documentation>Defines the input order of rows within nodedisplaypanel. if true, the row with the highest id is inserted first</documentation>
-    				</annotation></attribute>
-    			<attribute name="highestcolfirst" type="boolean" default="false">
-    				<annotation>
-    					<documentation>Defines the input order of columns within nodedisplaypanel. if true, the column with the highest id is inserted first. Then the first cell within a panel has the highest id of the whole row.</documentation>
-    				</annotation></attribute>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="picture_type">
-    	<annotation>
-    		<documentation>
-    			describes a picture, which can be aligned
-    		</documentation>
-    	</annotation>
-    	<attribute name="src" type="anyURI" use="required">
-    		<annotation>
-    			<documentation>
-    				location where to find the picture, only pictures on
-    				the same webserver where the applet lies are allowed
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="align" default="CENTER"
-    		type="lml:align_type">
-    		<annotation>
-    			<documentation>Position of the picture</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="width" type="lml:percent_type" default="0.1">
-    		<annotation>
-    			<documentation>
-    				width of the picture in percent corresponding to
-    				surrounding panel
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="height" type="lml:percent_type"
-    		default="0.1">
-    		<annotation>
-    			<documentation>
-    				height of the picture in percent corresponding to
-    				surrounding panel
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="inneralign" type="lml:align_type" default="CENTER">
-    		<annotation>
-    			<documentation>align is for positioning the image around the display-panel of one physical element. inner-align is for positioning the picture within its rectangle</documentation>
-    		</annotation></attribute>
-    </complexType>
-
-    <complexType name="nodedisplayelement0">
-    	<complexContent>
-    		<extension base="lml:nodedisplayelement">
-    			<sequence>
-    				<element name="el1" type="lml:nodedisplayelement1" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="nodedisplayelement1">
-    	<complexContent>
-    		<extension base="lml:nodedisplayelement">
-    			<sequence>
-    				<element name="el2" type="lml:nodedisplayelement2" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-    
-    <complexType name="nodedisplayelement2">
-    	<complexContent>
-    		<extension base="lml:nodedisplayelement">
-    			<sequence>
-    				<element name="el3" type="lml:nodedisplayelement3" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-    
-    <complexType name="nodedisplayelement3">
-    	<complexContent>
-    		<extension base="lml:nodedisplayelement">
-    			<sequence>
-    				<element name="el4" type="lml:nodedisplayelement4" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-    
-    <complexType name="nodedisplayelement4">
-    	<complexContent>
-    		<extension base="lml:nodedisplayelement">
-    			<sequence>
-    				<element name="el5" type="lml:nodedisplayelement5" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-    
-    <complexType name="nodedisplayelement5">
-    	<complexContent>
-    		<extension base="lml:nodedisplayelement">
-    			<sequence>
-    				<element name="el6" type="lml:nodedisplayelement6" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-    
-    <complexType name="nodedisplayelement6">
-    	<complexContent>
-    		<extension base="lml:nodedisplayelement">
-    			<sequence>
-    				<element name="el7" type="lml:nodedisplayelement7" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-    
-    <complexType name="nodedisplayelement7">
-    	<complexContent>
-    		<extension base="lml:nodedisplayelement">
-    			<sequence>
-    				<element name="el8" type="lml:nodedisplayelement8" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-    
-    <complexType name="nodedisplayelement8">
-    	<complexContent>
-    		<extension base="lml:nodedisplayelement">
-    			<sequence>
-    				<element name="el9" type="lml:nodedisplayelement9" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-    
-    <complexType name="nodedisplayelement9">
-    	<complexContent>
-    		<extension base="lml:nodedisplayelement">
-    			<sequence>
-    				<element name="el10" type="lml:nodedisplayelement" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-
-    <simpleType name="align_type">
-    	<restriction base="string">
-    		<enumeration value="WEST"></enumeration>
-    		<enumeration value="EAST"></enumeration>
-    		<enumeration value="NORTH"></enumeration>
-    		<enumeration value="SOUTH"></enumeration>
-    		<enumeration value="CENTER"></enumeration>
-    	</restriction>
-    </simpleType>
-
-    <simpleType name="percent_type">
-    	<restriction base="double">
-    		<minInclusive value="0"></minInclusive>
-    		<maxInclusive value="1"></maxInclusive>
-    	</restriction>
-    </simpleType>
-
-
-    <complexType name="usagebarlayout_type">
-    	<annotation>
-    		<documentation>
-    			Define special layout-options for a usagebar
-    		</documentation>
-    	</annotation>
-    	<complexContent>
-    		<extension base="lml:componentlayout_type">
-    			<attribute name="scale" default="nodes">
-    				<annotation>
-    					<documentation>
-    						defines which scale should be used. "nodes"
-    						means the scale will be displayed in the
-    						unit nodes, "cpus" means the scale will show
-    						cpus as unit
-    					</documentation>
-    				</annotation>
-    				<simpleType>
-    					<restriction base="string">
-    						<enumeration value="nodes"></enumeration>
-    						<enumeration value="cpus"></enumeration>
-    					</restriction>
-    				</simpleType>
-    			</attribute>
-    			<attribute name="interval" type="positiveInteger" default="4">
-    				<annotation>
-    					<documentation>defines the distance between two scale-lines, in other words two tics on the axis</documentation>
-    				</annotation></attribute>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="chartlayout_type">
-    	<annotation>
-    		<documentation>
-    			Definition of layout-tag for charts
-    		</documentation>
-    	</annotation>
-    	<complexContent>
-    		<extension base="lml:componentlayout_type">
-    			<attribute name="border" type="nonNegativeInteger"
-    				default="0">
-    				<annotation>
-    					<documentation>
-    						border in pixels, which is painted around
-    						every bar of a chart
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="showlegend" type="boolean"
-    				default="true">
-    				<annotation>
-    					<documentation>
-    						if true, legend is shown, otherwise no
-    						legend is painted
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="backgroundcolor"
-    				type="lml:hexcolor_type" default="#FFF">
-    				<annotation>
-    					<documentation>
-    						Background-color of the chart, usually white
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="innerbackgroundcolor"
-    				type="lml:hexcolor_type" default="#AAA">
-    				<annotation>
-    					<documentation>
-    						background-color of rectangle, in which the
-    						main diagram is painted
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="axescolor" type="lml:hexcolor_type"
-    				default="#555">
-    				<annotation>
-    					<documentation>Color of axes</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="bordercolor" type="lml:hexcolor_type"
-    				default="#000">
-    				<annotation>
-    					<documentation>
-    						color of borders around rectangles painted
-    						inside the diagram
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="gridcolor" type="lml:hexcolor_type"
-    				default="#555">
-    				<annotation>
-    					<documentation>
-    						Color of gridlines, which are painted at
-    						every tic if wanted
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="cutpaint" type="boolean" default="true">
-    				<annotation>
-    					<documentation>If true, rects and bars outside the diagrams view are not displayed, otherwise rects are painted outside the diagram area if needed</documentation>
-    				</annotation></attribute>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="tablelayout_type">
-        <annotation>
-        	<documentation>Layout for a table</documentation>
-        </annotation>
-        <complexContent>
-    		<extension base="lml:componentlayout_type">
-    			<sequence>
-    				<element name="column" type="lml:columnlayout_type" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="columnlayout_type">
-    	<annotation>
-    		<documentation>
-    			Layout-definitions for exactly one column of a table.
-    			Defines where to position the column, width and if this
-    			column is sorted
-    		</documentation>
-    	</annotation>
-    	<attribute name="cid" type="positiveInteger" use="required">
-    		<annotation>
-    			<documentation>
-    				Reference to the data-column of the table, for which
-    				this component defines the layout
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="pos" type="nonNegativeInteger">
-    		<annotation>
-    			<documentation>
-    				Position of this column among all other columns.
-    				This attribute begins with 0. If position is not
-    				defined, the applet can decide where to put the
-    				column. Usually it will keep the order defined by
-    				the data-part of this table.
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="width">
-    		<annotation>
-    			<documentation>
-    				Width of this column in percent corresponding to the
-    				width of the panel, which shows this table.
-    			</documentation>
-    		</annotation>
-    		<simpleType>
-    			<restriction base="double">
-    				<minInclusive value="0"></minInclusive>
-    				<maxInclusive value="1"></maxInclusive>
-    			</restriction>
-    		</simpleType>
-    	</attribute>
-    	<attribute name="sorted" type="lml:columnsortedtype"
-    		default="false">
-    		<annotation>
-    			<documentation>
-    				Defines if the table-content is sorted by this
-    				column.
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="active" type="boolean" default="true">
-    		<annotation>
-    			<documentation>
-    				This attribute defines if this column should be
-    				shown. If not data for this column must not be
-    				transmitted for data-transmission reduction.
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="key" type="string">
-    		<annotation>
-    			<documentation>Defines the name of an attribute, which is shown in the table in this column. This is comparable with the name-attribute within the table-tag. The values do not have to be equal. The key-attribute is needed</documentation>
-    		</annotation></attribute>
-    </complexType>
-
-
-    <simpleType name="columnsortedtype">
-    	<restriction base="string">
-    		<enumeration value="asc"></enumeration>
-    		<enumeration value="desc"></enumeration>
-    		<enumeration value="false"></enumeration>
-    	</restriction>
-    </simpleType>
-
-    <complexType name="infoboxlayout_type">
-    	<complexContent>
-    		<extension base="lml:componentlayout_type">
-    			<sequence>
-    				<element name="typecol"
-    					type="lml:infoboxlayout_coltype" minOccurs="0" maxOccurs="1">
-                        <annotation>
-                        	<documentation>this element defines properties for the column containing the keys of information</documentation>
-                        </annotation>
-    				</element>
-    				<element name="infocol" type="lml:infoboxlayout_coltype" minOccurs="0" maxOccurs="1">
-    					<annotation>
-    						<documentation>this element defines properties for the column containing the values of information</documentation>
-    					</annotation></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="infoboxlayout_coltype">
-    	<attribute name="pos" type="lml:integer01type">
-    		<annotation>
-    			<documentation>
-    				position of column in view
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="width" default="0.5">
-    		<annotation>
-    			<documentation>
-    				width of column in percent
-    			</documentation>
-    		</annotation>
-    		<simpleType>
-    			<restriction base="double">
-    				<minInclusive value="0"></minInclusive>
-    				<maxInclusive value="1"></maxInclusive>
-    			</restriction>
-    		</simpleType>
-    	</attribute>
-    	<attribute name="sorted" type="lml:columnsortedtype" default="false">
-    		<annotation>
-    			<documentation>defines if infos are sorted by this column</documentation>
-    		</annotation></attribute>
-    </complexType>
-
-    <simpleType name="integer01type">
-        <annotation>
-        	<documentation>integer values, where only e aus [0,1] is allowed ={0,1}, is used for infoboxlayout_coltype</documentation>
-        </annotation>
-        <restriction base="nonNegativeInteger">
-    		<minInclusive value="0"></minInclusive>
-    		<maxInclusive value="1"></maxInclusive>
-    	</restriction>
-    </simpleType>
-</schema>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/schema/lgui.xsd b/rms/org.eclipse.ptp.rm.lml.core/schema/lgui.xsd
deleted file mode 100644
index 49e23c2..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/schema/lgui.xsd
+++ /dev/null
@@ -1,501 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-          LML - LLView markup language 
-
-   Copyright (c) 2011 Forschungszentrum Juelich GmbH
-   All rights reserved. This program and the accompanying materials
-   are made available under the terms of the Eclipse Public License v1.0
-   which accompanies this distribution and is available at
-   http://www.eclipse.org/legal/epl-v10.html
- -->
-<schema targetNamespace="http://www.llview.de" xmlns="http://www.w3.org/2001/XMLSchema"
-	xmlns:lml="http://www.llview.de">
-	<include schemaLocation="layout.xsd"></include>
-	<include schemaLocation="nodedisplay.xsd"></include>
-	<include schemaLocation="relation.xsd"></include>
-	<include schemaLocation="chart.xsd"></include>
-	<include schemaLocation="textboxes.xsd"></include>
-	<include schemaLocation="usagebar.xsd"></include>
-	<include schemaLocation="table.xsd"></include>
-	<include schemaLocation="entities.xsd"></include>
-	<include schemaLocation="layout.xsd"></include>
-	<include schemaLocation="request.xsd"></include>
-	<annotation>
-		<documentation>Defines root-object of lml.
-			Other objects like table,
-			information or charts are child-tags of this
-			object.
-			Defines global
-			constraints, keys and keyrefs.</documentation>
-	</annotation>
-
-	<complexType name="lgui_type">
-		<annotation>
-			<documentation>
-				Defines which main tags are allowed in LML.
-			</documentation>
-		</annotation>
-
-		<!-- table of content elements -->
-		<sequence minOccurs="0" maxOccurs="1">
-
-			<element name="request" type="lml:RequestType" minOccurs="0"
-				maxOccurs="1" />
-
-
-			<sequence minOccurs="0" maxOccurs="unbounded">
-
-				<!--  graphical objects -->
-				<sequence minOccurs="0" maxOccurs="1">
-
-					<element name="objects" type="lml:objects_type" minOccurs="0"
-						maxOccurs="1">
-					</element>
-					<element name="relations" type="lml:relations_type"
-						minOccurs="0" maxOccurs="1">
-					</element>
-					<element name="information" type="lml:information_type"
-						minOccurs="0" maxOccurs="1">
-					</element>
-
-					<element name="table" type="lml:table_type" minOccurs="0"
-						maxOccurs="1">
-
-						<!-- cid-attributes must refer to an existing columnID -->
-						<key name="columnID">
-							<selector xpath="column" />
-							<field xpath="@id" />
-						</key>
-
-						<keyref name="cellRef" refer="lml:columnID">
-							<selector xpath="row/cell" />
-							<field xpath="@cid" />
-						</keyref>
-
-					</element>
-					<element name="usagebar" type="lml:usagebar_type"
-						minOccurs="0" maxOccurs="1">
-					</element>
-					<element name="text" type="lml:textbox_type" minOccurs="0"
-						maxOccurs="1">
-					</element>
-					<element name="infobox" type="lml:infobox_type" minOccurs="0"
-						maxOccurs="1">
-					</element>
-					<element name="nodedisplay" type="lml:nodedisplay"
-						minOccurs="0" maxOccurs="1">
-
-						<!--
-							tagnames within scheme-tag are keys <key name="tagnameKey">
-							<selector xpath="scheme/el1 | scheme/el1/el2 | scheme/el1/el2/el3
-							| scheme/el1/el2/el3/el4| scheme/el1/el2/el3/el4/el5|
-							scheme/el1/el2/el3/el4/el5/el6|
-							scheme/el1/el2/el3/el4/el5/el6/el7|
-							scheme/el1/el2/el3/el4/el5/el6/el7/el8|
-							scheme/el1/el2/el3/el4/el5/el6/el7/el8/el9|
-							scheme/el1/el2/el3/el4/el5/el6/el7/el8/el9/el10" /> <field
-							xpath="@tagname" /> </key> does not work correctly
-						-->
-
-						<!--
-							tagname-references in data-tag <keyref name="tagnameKeyRef"
-							refer="lml:tagnameKey"> <selector xpath="data/el1 | data/el1/el2
-							| data/el1/el2/el3 | data/el1/el2/el3/el4|
-							data/el1/el2/el3/el4/el5| data/el1/el2/el3/el4/el5/el6|
-							data/el1/el2/el3/el4/el5/el6/el7|
-							data/el1/el2/el3/el4/el5/el6/el7/el8|
-							data/el1/el2/el3/el4/el5/el6/el7/el8/el9|
-							data/el1/el2/el3/el4/el5/el6/el7/el8/el9/el10" /> <field
-							xpath="@tagname" /> </keyref>
-						-->
-
-					</element>
-					<element name="chart" type="lml:chart_type" minOccurs="0"
-						maxOccurs="1">
-					</element>
-					<element name="chartgroup" type="lml:chartgroup_type"
-						minOccurs="0" maxOccurs="1">
-					</element>
-				</sequence>
-
-				<!-- layouts -->
-
-				<sequence minOccurs="0" maxOccurs="1">
-					<element name="splitlayout" type="lml:splitlayout_type"
-						minOccurs="0" maxOccurs="1">
-
-						<!--  every gobj can only be shown once -->
-						<unique name="gidOnlyOnceInSplitLayout">
-							<selector xpath=".//*" />
-							<field xpath="@gid" />
-						</unique>
-
-					</element>
-					<element name="abslayout" type="lml:abslayout_type"
-						minOccurs="0" maxOccurs="1">
-						<!--  every gobj can only be shown once -->
-						<unique name="gidOnlyOnceInabsLayout">
-							<selector xpath="comp" />
-							<field xpath="@gid" />
-						</unique>
-
-					</element>
-					<element name="nodedisplaylayout" type="lml:nodedisplaylayout_type"
-						minOccurs="0" maxOccurs="1">
-					</element>
-					<element name="usagebarlayout" type="lml:usagebarlayout_type"
-						minOccurs="0" maxOccurs="1">
-					</element>
-					<element name="chartlayout" type="lml:chartlayout_type"
-						minOccurs="0" maxOccurs="1">
-					</element>
-					<element name="tablelayout" type="lml:tablelayout_type"
-						minOccurs="0" maxOccurs="1">
-						<!--
-							pos-attributes must be unique in every tablelayout. no position
-							can be occupied by two columns
-						-->
-						<unique name="PosUnique">
-							<selector xpath="column" />
-							<field xpath="@pos" />
-						</unique>
-
-						<!--
-							cid-attributes must be unique in every tablelayout. multiple
-							definitions for columns are not allowed
-						-->
-						<unique name="CidUnique">
-							<selector xpath="column" />
-							<field xpath="@cid" />
-						</unique>
-
-					</element>
-					<element name="infoboxlayout" type="lml:infoboxlayout_type"
-						minOccurs="0" maxOccurs="1">
-					</element>
-					<element name="textlayout" type="lml:infoboxlayout_type"
-						minOccurs="0" maxOccurs="1">
-					</element>
-				</sequence>
-
-			</sequence>
-
-		</sequence>
-		<attribute name="version" type="string"></attribute>
-		<attribute name="layout" use="optional" default="false"
-			type="boolean">
-			<annotation>
-				<documentation>This attribute defines, if this lml-file mainly
-					contains layout-information.
-					If layout-value is true, then only
-					layout-tags are checked. Therefore
-					graphical objects
-					do not have to
-					be valid against XSL-checks in a layout-lml-file.
-				</documentation>
-			</annotation>
-		</attribute>
-	</complexType>
-
-	<element name="lgui" type="lml:lgui_type">
-
-		<annotation>
-			<documentation>Root-tag of LML-scheme.</documentation>
-		</annotation>
-
-		<!-- referential integrity covered with key, keyref and unique-tags -->
-
-		<!-- All graphical-objects have to have unique ids-->
-		<key name="graphObjKey">
-			<selector
-				xpath="table|usagebar|text|infobox|nodedisplay|.//chart|chartgroup" />
-			<field xpath="@id" />
-		</key>
-
-		<!-- nodedisplayref-tags refer to a nodedisplay -->
-		<key name="nodedisplayKey">
-			<selector xpath="nodedisplay" />
-			<field xpath="@id" />
-		</key>
-
-		<key name="usagebarKey">
-			<selector xpath="usagebar" />
-			<field xpath="@id" />
-		</key>
-
-		<key name="chartKey">
-			<selector xpath=".//chart" />
-			<field xpath="@id" />
-		</key>
-
-		<key name="tableKey">
-			<selector xpath="table" />
-			<field xpath="@id" />
-		</key>
-
-		<key name="infoboxKey">
-			<selector xpath="infobox" />
-			<field xpath="@id" />
-		</key>
-
-		<key name="textKey">
-			<selector xpath="text" />
-			<field xpath="@id" />
-		</key>
-
-		<key name="layoutIDs">
-			<selector xpath="splitlayout|abslayout" />
-			<field xpath="@id" />
-		</key>
-
-		<!--
-			following two definitions are needed for every component-layout-type
-		-->
-		<!--
-			id of nodedisplaylayout must identify layout among other
-			nodedisplaylayouts
-		-->
-		<key name="nodedisplaylayoutkey">
-			<selector xpath="nodedisplaylayout" />
-			<field xpath="@id" />
-		</key>
-		<!-- nodedisplaylayouts only refer to nodedisplays through gid -->
-		<keyref name="nodedisplaylayoutgid" refer="lml:nodedisplayKey">
-			<selector xpath="nodedisplaylayout" />
-			<field xpath="@gid" />
-		</keyref>
-
-		<!--
-			id of usagebarlayout must identify layout among other usagebarlayout
-		-->
-		<key name="usagebarlayoutkey">
-			<selector xpath="usagebarlayout" />
-			<field xpath="@id" />
-		</key>
-		<!-- usagebarlayouts only refer to usagebars through gid -->
-		<keyref name="usagebarlayoutgid" refer="lml:usagebarKey">
-			<selector xpath="usagebarlayout" />
-			<field xpath="@gid" />
-		</keyref>
-
-		<!-- id of chartlayout must identify layout among other chartlayout -->
-		<key name="chartlayoutkey">
-			<selector xpath="chartlayout" />
-			<field xpath="@id" />
-		</key>
-		<!-- chartlayouts only refer to charts through gid -->
-		<keyref name="chartlayoutgid" refer="lml:chartKey">
-			<selector xpath="chartlayout" />
-			<field xpath="@gid" />
-		</keyref>
-
-		<!-- id of tablelayout must identify layout among other tablelayouts -->
-		<key name="tablelayoutkey">
-			<selector xpath="tablelayout" />
-			<field xpath="@id" />
-		</key>
-		<!-- tablelayouts only refer to tables through gid -->
-		<keyref name="tablelayoutgid" refer="lml:tableKey">
-			<selector xpath="tablelayout" />
-			<field xpath="@gid" />
-		</keyref>
-
-		<!--
-			id of infoboxlayout must identify layout among other infoboxlayouts
-		-->
-		<key name="infoboxlayoutkey">
-			<selector xpath="infoboxlayout" />
-			<field xpath="@id" />
-		</key>
-		<!-- infoboxlayouts only refer to infoboxes through gid -->
-		<keyref name="infoboxlayoutgid" refer="lml:infoboxKey">
-			<selector xpath="infoboxlayout" />
-			<field xpath="@gid" />
-		</keyref>
-
-		<!-- id of textlayout must identify layout among other textlayouts -->
-		<key name="textlayoutkey">
-			<selector xpath="textlayout" />
-			<field xpath="@id" />
-		</key>
-		<!-- textlayouts only refer to text-objects through gid -->
-		<keyref name="textlayoutgid" refer="lml:textKey">
-			<selector xpath="textlayout" />
-			<field xpath="@gid" />
-		</keyref>
-
-
-
-		<!-- layout references -->
-		<keyref name="gidAttributesReference" refer="lml:graphObjKey">
-			<selector xpath=".//left|.//right|.//top|.//bottom|.//comp" />
-			<field xpath="@gid" />
-		</keyref>
-
-		<keyref name="nodedisplayRef" refer="lml:nodedisplayKey">
-			<selector xpath="nodedisplay" />
-			<field xpath="@refto" />
-		</keyref>
-
-		<keyref name="nodeNameRef1" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1" />
-			<field xpath="@name" />
-		</keyref>
-
-		<keyref name="nodeNameRef2" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2" />
-			<field xpath="@name" />
-		</keyref>
-
-		<keyref name="nodeNameRef3" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3" />
-			<field xpath="@name" />
-		</keyref>
-
-		<keyref name="nodeNameRef4" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4" />
-			<field xpath="@name" />
-		</keyref>
-
-		<keyref name="nodeNameRef5" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4/el5" />
-			<field xpath="@name" />
-		</keyref>
-
-		<keyref name="nodeNameRef6" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4/el5/el6" />
-			<field xpath="@name" />
-		</keyref>
-
-		<keyref name="nodeNameRef7" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4/el5/el6/el7" />
-			<field xpath="@name" />
-		</keyref>
-
-		<keyref name="nodeNameRef8" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4/el5/el6/el7/el8" />
-			<field xpath="@name" />
-		</keyref>
-
-		<keyref name="nodeNameRef9" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4/el5/el6/el7/el8/el9" />
-			<field xpath="@name" />
-		</keyref>
-
-		<keyref name="nodeNameRef10" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4/el5/el6/el7/el8/el9/el10" />
-			<field xpath="@name" />
-		</keyref>
-
-
-		<!-- IDs of objects in object-tag -->
-		<key name="objectId">
-			<selector xpath="objects/object" />
-			<field xpath="@id" />
-		</key>
-
-		<!-- IDs for relations must be unique -->
-		<unique name="relidsUnique">
-			<selector xpath="relations/rel" />
-			<field xpath="@id" />
-		</unique>
-
-		<keyref name="relationkeyids" refer="lml:objectId">
-			<selector xpath="relations/rel" />
-			<field xpath="@keyid" />
-		</keyref>
-
-		<keyref name="relationElementids" refer="lml:objectId">
-			<selector xpath="relations/rel/el" />
-			<field xpath="@refid" />
-		</keyref>
-
-		<keyref name="infoRef" refer="lml:objectId">
-			<selector xpath="information/info" />
-			<field xpath="@oid" />
-		</keyref>
-
-		<keyref name="rowRef" refer="lml:objectId">
-			<selector xpath="table/row" />
-			<field xpath="@id" />
-		</keyref>
-
-		<keyref name="usageJobRef" refer="lml:objectId">
-			<selector xpath="usagebar/job" />
-			<field xpath="@oid" />
-		</keyref>
-
-		<keyref name="chartJobRef" refer="lml:objectId">
-			<selector
-				xpath="chart/data/r | chart/data/p | chartgroup/chart/data/r | chartgroup/chart/data/p" />
-			<field xpath="@oid" />
-		</keyref>
-
-		<keyref name="nodeDisplayJobRef1" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1" />
-			<field xpath="@oid" />
-		</keyref>
-
-		<keyref name="nodeDisplayJobRef2" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2" />
-			<field xpath="@oid" />
-		</keyref>
-
-		<keyref name="nodeDisplayJobRef3" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3" />
-			<field xpath="@oid" />
-		</keyref>
-
-		<keyref name="nodeDisplayJobRef4" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4" />
-			<field xpath="@oid" />
-		</keyref>
-
-		<keyref name="nodeDisplayJobRef5" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4/el5" />
-			<field xpath="@oid" />
-		</keyref>
-
-		<keyref name="nodeDisplayJobRef6" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4/el5/el6" />
-			<field xpath="@oid" />
-		</keyref>
-
-		<keyref name="nodeDisplayJobRef7" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4/el5/el6/el7" />
-			<field xpath="@oid" />
-		</keyref>
-
-		<keyref name="nodeDisplayJobRef8" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4/el5/el6/el7/el8" />
-			<field xpath="@oid" />
-		</keyref>
-
-		<keyref name="nodeDisplayJobRef9" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4/el5/el6/el7/el8/el9" />
-			<field xpath="@oid" />
-		</keyref>
-
-		<keyref name="nodeDisplayJobRef10" refer="lml:objectId">
-			<selector xpath="nodedisplay/data/el1/el2/el3/el4/el5/el6/el7/el8/el9/el10" />
-			<field xpath="@oid" />
-		</keyref>
-
-
-
-	</element>
-
-	<complexType name="gobject_type">
-		<annotation>
-			<documentation>Abstract type for all graphical objects. All graphical
-				objects like table, usagebar etc. have to have ids.
-				This is defined
-				by extending all graphical objects from this type.
-			</documentation>
-		</annotation>
-		<attribute name="id" type="string" use="required"></attribute>
-		<attribute name="title" type="string"></attribute>
-		<attribute name="description" type="string"></attribute>
-	</complexType>
-
-</schema>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/schema/lguitest.xsl b/rms/org.eclipse.ptp.rm.lml.core/schema/lguitest.xsl
deleted file mode 100644
index 10f94ab..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/schema/lguitest.xsl
+++ /dev/null
@@ -1,802 +0,0 @@
-<?xml version="1.0" ?>
-<!-- 
-          LML - LLView markup language 
-
-   Copyright (c) 2011 Forschungszentrum Juelich GmbH
-   All rights reserved. This program and the accompanying materials
-   are made available under the terms of the Eclipse Public License v1.0
-   which accompanies this distribution and is available at
-   http://www.eclipse.org/legal/epl-v10.html
- -->
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-				  xmlns="http://www.w3.org/1999/XSL/Transform"
-				  xmlns:lml="http://www.llview.de"
->
-
-<!-- This XSL-Stylesheet can be used for further constraint-checkings
-for lml-files. It checks all constraints, which cannot be checked by
-the corresponding xml-schema because xpath-expressions are restricted
-in xml-schema for optimization
-
-It prints out warnings and errors within the lml-instance-->
-
-<output method="text" indent="yes"/>
-<!-- regular expression by which date-values of tables are checked -->
-<!-- example 07/20/10 11:40:57 -->
-<variable name="dateformat" select="'^\d{2}/\d{2}/\d{2}\s*(\d{2}:\d{2}:\d{2})?$'"/>
-	
-<!-- works like a function. this template must be called once for every nodedisplay
-this template makes sure that min and max-attributes are defined correctly-->
-<template name="nodedisplaycheck" match="nodedisplay">
-		<!-- first checks are the same for base and referencing nodedisplays-->
-		<!-- check min and max against min<=max in scheme and in data-->
-		<for-each select="scheme//*[@min>@max]">
-	
-			Error: in scheme-tag: min-attribute must be lower then max-attribute <value-of select="name()"/> min=<value-of select="@min"/> max=<value-of select="@max"/>
-	
-		</for-each>
-
-		<for-each select="data//*[@min>@max]">
-	
-			Error: in data-tag: min-attribute must be lower then max-attribute <value-of select="name()"/> min=<value-of select="@min"/> max=<value-of select="@max"/>
-	
-		</for-each>
-
-		<!-- every element needs to define at least min or list-->
-		<for-each select="*//*[count(@min)=0 and count(@list)=0]">
-
-			Error: in Tag <value-of select="name()"/> neither min nor list defined
-
-		</for-each>
-
-		<!-- if min is defined list is not allowed and vice versa-->
-		<for-each select="*//*[count(@min)>0 and count(@list)>0]">
-
-			Error: in Tag <value-of select="name()"/> min and list are defined, but you are only allowed to define exactly one
-
-		</for-each>
-
-		<!-- not allowed: max and ! min -->
-		<for-each select="*//*[count(@max)>0 and count(@min)=0]">
-
-			Error: in Tag <value-of select="name()"/> if max is defined, you have to specify min, too
-
-		</for-each>
-
-		<!-- not allowed: step and ! min -->
-		<for-each select="*//*[count(@step)>0 and count(@min)=0]">
-
-			Error: in Tag <value-of select="name()"/> if step is defined, you have to specify min, too
-
-		</for-each>
-
-		<!--in data: elX-element is only allowed if at least one elX-element appears in scheme-tag-->
-		<variable name="ascheme" select="scheme"/>
-		<variable name="adata" select="data"/>
-
-		<for-each select="data//*">
-			<variable name="aname" select="name()"/>
-
-			<if test="count($ascheme//*[name()=$aname])=0">
-			Error: in data in tag <value-of select="$aname"/>, this is not allowed for this scheme, to deep tree-level
-			</if>
-		</for-each>
-		
-		<!-- check tagnames, at least one for every level -->
-		<for-each select="distinct-values(scheme//*/name())">
-			
-			<variable name="alevelname" select="."/>
-			
-			<if test="count( $ascheme//*[name() = $alevelname and @tagname] ) = 0">
-			Error: scheme-level <value-of select="$alevelname"/> does not define a tagname
-			</if>
-			
-		</for-each>
-		
-		<!-- check map-attribute: count of names must be greater than count of elements, so that implicit name identify elements -->
-		<for-each select="scheme//*[@map]">
-		
-			<variable name="mapcount" select="count(tokenize(@map, ','))"/><!-- could be zero if map="" ATTENTION -->
-			
-			<choose>
-			<when test="@min">
-				<choose>
-				<when test="@step">
-					
-					<if test="@max">
-						<variable name="listcount" select="floor((@max - @min) div @step) + 1 "/>
-						
-						<if test="$listcount > 1 and $listcount>$mapcount">
-			Error: amount of defined names in map-attribute is lower than number of elements within this list of elements in tag <value-of select="name()"/>. defined elements=<value-of select="$listcount"/>, defined names=<choose><when test="$mapcount=0">1</when><otherwise><value-of select="$mapcount"/></otherwise></choose>
-						</if>
-						
-					</if><!-- otherwise there is only one element. thus map defines at east one element, there is no problem -->
-					
-				</when>
-				<otherwise><!-- no step defined -> step=1-->
-				
-					<if test="@max">
-						<variable name="listcount" select="(@max - @min) + 1"/>
-						
-						<if test="$listcount > 1 and $listcount>$mapcount">
-			Error: amount of defined names in map-attribute is lower than number of elements within this list of elements in tag <value-of select="name()"/>. defined elements=<value-of select="$listcount"/>, defined names=<choose><when test="$mapcount=0">1</when><otherwise><value-of select="$mapcount"/></otherwise></choose>
-						</if>
-						
-					</if><!-- otherwise there is only one element. thus map defines at east one element, there is no problem -->
-				</otherwise>
-				</choose>
-			
-			</when>
-			<otherwise><!-- list-attribute -->
-				<variable name="listcount" select="count(tokenize(@list, ','))"/>
-				
-				<if test="$listcount > 1 and $listcount>$mapcount">
-			Error: amount of defined names in map-attribute is lower than number of elements within this list of elements in tag <value-of select="name()"/>. defined elements=<value-of select="$listcount"/>, defined names=<choose><when test="$mapcount=0">1</when><otherwise><value-of select="$mapcount"/></otherwise></choose>
-				</if>
-				
-			</otherwise>
-			</choose>	
-		
-		</for-each>
-		
-		<!-- either use mask-attribute or map-attribute but not both in one tag -->
-		<for-each select="scheme">
-			<for-each select=".//*[@mask][@map]">
-			Error: in scheme-definition: It is not allowed to use mask- and map-attributes together. element <value-of select="name()"/> has mask=<value-of select="@mask"/> and map=<value-of select="@map"/>
-			</for-each>
-		</for-each>
-		
-		<variable name="nodedisplay" select="."/>
-		
-		<!-- only one mask or map for every level, consider if this is not too much of constraint
-		<for-each select="distinct-values(scheme//*/name())">
-			<variable name="tagname" select="."/>
-			
-			<if test="count( distinct-values( $nodedisplay/scheme//*[name()=$tagname]/@mask ) ) + count( distinct-values( $nodedisplay/scheme//*[name()=$tagname]/@map ) ) >1">
-			Error: only one mask or map is allowed for every level, more than one mask or map for level <value-of select="$tagname"/>
-			</if>
-		</for-each>
-		-->
-		
-		<!-- check if data-elements are allowed by given scheme -->
-		<!--<for-each select="data/el1">
-			<call-template name="data-elements-allowed">
-				<with-param name="schemeel" select="$ascheme"/>
-				<with-param name="datael" select="."/>
-			</call-template>
-		</for-each>-->
-
-</template>
-
-<!-- special template for checking if data-elements are allowed by the scheme-element -->
-<template name="data-elements-allowed">
-	<param name="schemeel" />
-	<!--
-		upper scheme-level, where right scheme has to be searched
-	-->
-	<param name="datael" /><!-- data-tag which must be checked -->
-
-	<param name="maxlevel" select="'100'"/><!-- untill this level validity will be checked-->
-
-	<variable name="atagname" select="$datael/name()" />
-	<!-- current level -->
-	<variable name="alevel" select="number(substring($atagname,3))"/>
-
-	<if test="number($maxlevel)>=$alevel"><!-- stop checking on given level -->
-	<choose>
-		<!-- element definition with list-attribute?-->
-		<when test="$datael/@list">
-
-			<for-each select="tokenize($datael/@list,',')">
-
-				<variable name="atoken" select="." />
-				<!--
-					check validity of current token
-				-->
-
-				<!-- check if token in any list-->
-				
-				<variable name="schemelists" select="$schemeel/*[name()=$atagname and @list and matches(@list, concat('^(\s*\d+\s*,)*\s*', $atoken , '\s*(,\s*\d+\s*)*$')  )]"/>
-				
-				<if
-					test="count( $schemelists ) =0">
-					<!-- no list found for atoken, check ranges-->
-					<!-- atoken=@min anywhere? -->
-					<variable name="schememins" select="$schemeel/*[name()=$atagname and @min and @min=$atoken]"/>
-					
-					<if
-						test="count( $schememins )=0">
-						<!-- no min-tag found which is equal to token-->
-						<!-- atoken in [@min, @max] anywhere? -->
-						<variable name="schemeranges" select="$schemeel/*[name()=$atagname and @min and @max and $atoken>=@min and @max>=$atoken]"/>
-
-						<if
-							test="count( $schemeranges )=0">
-							<!-- no min-max-range found-->
-			Error: No possible definition for data-element <value-of select="$atoken" /> in tag	<value-of select="$atagname" />							
-						</if>
-						
-						<!-- success -->
-						<if test="count( $schemeranges )=1">
-							<for-each select="$datael/*">
-								<call-template name="data-elements-allowed">
-									<with-param name="schemeel" select="$schemeranges"/>
-									<with-param name="datael" select="."/>
-									<with-param name="maxlevel" select="$maxlevel"/>
-								</call-template>
-							</for-each>
-						</if>
-						<!-- denied -->
-						<if test="count( $schemeranges ) >1">
-			Error: Multiple range definitions for data-tag <value-of select="$atagname"/> and element <value-of select="$atoken"/>
-						</if>
-
-					</if>
-					<!-- success -->
-					<if test="count( $schememins )=1">
-						<for-each select="$datael/*">
-							<call-template name="data-elements-allowed">
-								<with-param name="schemeel" select="$schememins"/>
-								<with-param name="datael" select="."/>
-								<with-param name="maxlevel" select="$maxlevel"/>
-							</call-template>
-						</for-each>
-					</if>
-					<!-- denied -->
-					<if test="count( $schememins ) >1">
-			Error: Multiple min definitions for data-tag <value-of select="$atagname"/> and element <value-of select="$atoken"/> with min equal to token
-					</if>		
-				</if>
-				
-				<!-- is there only one possible schemeel? -->
-				<if test="count( $schemelists ) =1">
-					
-					<for-each select="$datael/*">
-						<call-template name="data-elements-allowed">
-							<with-param name="schemeel" select="$schemelists"/>
-							<with-param name="datael" select="."/>
-							<with-param name="maxlevel" select="$maxlevel"/>
-						</call-template>
-					</for-each>
-					
-				</if>
-				<!-- denied -->
-				<if test="count( $schemelists ) >1">
-			Error: Multiple list definitions for data-tag <value-of select="$atagname"/> and element <value-of select="$atoken"/>
-				</if>
-				
-			</for-each>
-
-		</when>
-
-		<!-- element definition with min-max-attributes?-->
-		<when test="$datael/@min">
-
-			<variable name="amin" select="$datael/@min" />
-
-			<!-- check if amin is in any range -->
-			<variable name="schemeels"
-				select="$schemeel/*[name()=$atagname and ($amin=@min or ($amin>=@min and @max>=$amin and (not(@step) or (($amin - @min) mod @step = 0)) ) )]" />
-
-			<choose>
-				<when test="count( $schemeels )=0"><!-- no range found for amin -->
-				
-				<!-- now list-scheme-elements must be searched -->
-				
-				<variable name="schemelists" select="$schemeel/*[name()=$atagname and @list and matches(@list, concat('^(\s*\d+\s*,)*\s*', $amin , '\s*(,\s*\d+\s*)*$')  )]"/>
-				<variable name="schemelistswithmax" select="$schemelists[ not($datael/@max) or ( $datael/@max and matches(@list, concat('^(\s*\d+\s*,)*\s*', $datael/@max , '\s*(,\s*\d+\s*)*$')  )  ) ]"/>
-				
-				<choose>
-					<when test="count($schemelistswithmax)=0">
-			Error: no scheme-definition found for tag <value-of select="$atagname"/> with min=<value-of select="$amin"/> and max=<value-of select="$datael/@max"/>
-					</when>
-					<when test="count($schemelists)>1">
-			Error: multiple list definitions for tag <value-of select="$atagname"/> with min=<value-of select="$amin"/>
-					</when>
-					<otherwise>
-						<!-- exactly one schemelists and one schemelistswithmax -->
-						<!-- count elements in scheme-list -->
-						
-						<variable name="schemelistcount" select="count( tokenize( $schemelistswithmax/@list, ',' ) )"/>
-						
-						<choose>
-							<when test="$datael/@max">
-								<choose>
-									<when test="$datael/@max - $datael/@min + 1 > $schemelistcount">
-			Error: range in tag <value-of select="$atagname"/> describes more elements than list=<value-of select="$schemelistswithmax/@list"/>  => range [<value-of select="$datael/@min"/>, <value-of select="$datael/@max"/>] not covered by scheme-list 
-									</when>
-									<otherwise>									
-										<variable name="tokensbetween" select="count( distinct-values( tokenize( replace( $schemelistswithmax/@list, '\s+', '' ), ',' )[ . >= $datael/@min and $datael/@max >= .] ) )"/>
-
-										<choose>
-											<when test="$datael/@max - $datael/@min + 1 > $tokensbetween">
-			Error: range in tag <value-of select="$atagname"/> describes other elements than list=<value-of select="$schemelistswithmax/@list"/>  => range [<value-of select="$datael/@min"/>, <value-of select="$datael/@max"/>] not fully covered by scheme-list
-											</when>
-											<otherwise>
-												<!-- range is fully covered by list -->
-												
-												<for-each select="$datael/*">
-												
-													<call-template name="data-elements-allowed">
-														<with-param name="schemeel" select="$schemelistswithmax"/>
-														<with-param name="datael" select="."/>	
-														<with-param name="maxlevel" select="$maxlevel"/>						
-													</call-template>
-													
-												</for-each>
-											</otherwise>
-										</choose>
-										
-									</otherwise>
-								
-								</choose>
-							</when>
-							<otherwise>
-								<!-- no max-attribute and min is in scheme-list -->
-								
-								<for-each select="$datael/*">
-							
-									<call-template name="data-elements-allowed">
-										<with-param name="schemeel" select="$schemelistswithmax"/>
-										<with-param name="datael" select="."/>		
-										<with-param name="maxlevel" select="$maxlevel"/>					
-									</call-template>
-								
-								</for-each>
-							</otherwise>
-						</choose>
-					</otherwise>
-				
-				</choose>			
-
-				</when>
-				<when test="count( $schemeels)=1"><!-- one range found, check max -->
-					<!--amin is ok and is in a range in $ascheme, is max also ok ?-->
-
-					<variable name="newschemeel" select="$schemeels" />
-					<!--
-						check if max exists. if so max must be lower then scheme-max or
-						equal to scheme-min and max must be a allowed multiple of step
-						added to min
-					-->
-					<choose>
-						<when test="$datael/@max and (($newschemeel/@max and $datael/@max>$newschemeel/@max) 
-												 or (not($newschemeel/@max) and not($datael/@max=$newschemeel/@min))
-												 or ($newschemeel/@step and not(($datael/@max - $newschemeel/@min) mod  $newschemeel/@step = 0) ) )">
-	
-							<!-- there is a range, where min is in but not max -->
-			Error: in element <value-of select="$atagname" /> in data-tag. Range is not allowed corresponding to scheme-range. min-attribute is ok but max-attribute not: data-range: [<value-of select="$datael/@min" />, <value-of select="$datael/@max" />] and scheme-range: [<value-of select="$newschemeel/@min" />, <value-of select="$newschemeel/@max" />], step =	<value-of select="$newschemeel/@step" />
-						</when>
-						<otherwise>
-							<!-- everything ok $datael is defined in $newschemeel -->
-							
-							<for-each select="$datael/*">
-							
-								<call-template name="data-elements-allowed">
-									<with-param name="schemeel" select="$newschemeel"/>
-									<with-param name="datael" select="."/>	
-									<with-param name="maxlevel" select="$maxlevel"/>						
-								</call-template>
-							
-							</for-each>
-							
-						</otherwise>
-					</choose>
-
-				</when>
-				<otherwise><!-- multiple ranges found -->
-			Error: multiple possible ranges for element	<value-of select="$atagname" />	in data-tag. data-range: [<value-of select="$datael/@min" />, <value-of select="$datael/@max" />]
-				</otherwise>
-			</choose>
-		</when>
-
-	</choose><!--  list or min-max-attributes -->
-	</if><!-- test current level against maxlevel -->
-
-</template>
-
-<!-- give connected id for a cell, columns and the value of the cell and this will check constraints -->
-<template name="typecheckforcell">
-<param name="aid"/><!-- id of column to which the cell is connected -->
-<param name="value"/><!-- value which must be checked -->
-<param name="acolumns"/><!-- all column definitions in the table -->
-
-<variable name="atype" select="$acolumns[@id=$aid]/@sort"/>
-
-<if test="$atype = 'date'">
-		<if test="not( matches( $value, $dateformat ) )">
-	Error: the date-value <value-of select="$value"/> does not match the given dateformat: <value-of select="$dateformat"/>	
-		</if>
-</if>
-
-<!-- checks for other types numeric, alpha -->
-
-</template>
-
-
-<!-- main template, which calls the other templates at the right place -->
-<template match="lml:lgui">
-
-<if test="not(@layout='true')">
-------------------------------------------------------------
-Checking tables:
-
-<for-each select="./table">
-	<!-- id of current table-->
-	<variable name="table" select="@id"/>
-
-	<!--Save column-objects of current table-->
-	<variable name="acolumns" select="column"/>
-
-	<for-each select="row">
-
-		<!-- position of current row-->
-		<variable name="row" select="position()"/>
-
-		<!-- test if too many cells in a row -->
-		<if test="count(cell)>count($acolumns)">
-	Error: Too many cells in row <value-of select="$row"/> in table <value-of select="$table"/>, #cells=<value-of select="count(cell)"/> allowed #=<value-of select="count($acolumns)"/>
-		</if>
-		
-		<!-- save current row-node -->
-		<variable name="rownode" select="."/>
-		<!-- check implicit ids given by position and preceding-sibling-cids for uniqueness and being allowed by column-definitions -->
-		<for-each select="cell">
-			<!-- save current position among all cells of this row -->
-			<variable name="apos" select="position()"/>
-			<!-- problem only occures if cid is not defined -->
-			<choose>
-			<when test="not(@cid)">
-				
-				<choose>
-					<!-- Look for preceding siblings with cids -->
-					<when test="count( preceding-sibling::cell[@cid] ) >= 1">
-						<!-- get cid of nearest preceding sibling -->					
-						<variable name="prevcid" select="preceding-sibling::cell[@cid][position() = 1]/@cid" />
-						<!-- get distance between current cell and nearest preceding sibling with cid defined -->
-						<variable name="distance" select="$apos - ( count( $rownode/cell[@cid=$prevcid]/preceding-sibling::cell ) + 1 )"/>
-						<!--  calculate implicit cid -->
-						<variable name="acid" select="$prevcid + $distance"/>
-						<!--  is this acid allowed by column-definitions? -->
-						<if test="count( $acolumns[@id = $acid] ) = 0">
-	Error: implicit cid of cell <value-of select="$apos" /> is not allowed for columns of table <value-of select="$table"/> in row <value-of select="$row"/>
-						</if>
-						<!-- is acid a duplicate referencing cid?-->
-						<if test="count( $rownode/cell[@cid=$acid] ) > 0">
-	Error: implicit cid of cell <value-of select="$apos"/> is already used by cell with position <value-of select="count( $rownode/cell[@cid = $acid]/preceding-sibling::cell ) + 1 "/> in table <value-of select="$table"/> in row <value-of select="$row"/>
-						</if>
-						
-						<!-- check values -->
-						<call-template name="typecheckforcell">
-							<with-param name="aid" select="$acid"/>
-							<with-param name="value" select="@value"/>
-							<with-param name="acolumns" select="$acolumns"/>
-						</call-template>						
-						
-					</when>
-					
-					<!-- no preceding cid defined => position is important position()=acid=apos -->
-					<otherwise>
-						<!--  is acid/apos allowed by column-definitions? -->
-						<if test="count( $acolumns[@id = $apos] ) = 0">
-	Error: implicit cid of cell <value-of select="$apos" /> is not allowed for columns of table <value-of select="$table"/> in row <value-of select="$row"/>
-						</if>
-						<!-- is acid/apos a duplicate referencing cid?-->
-						<if test="count( $rownode/cell[@cid=$apos] ) > 0">
-	Error: implicit cid of cell <value-of select="$apos"/> is already used by cell with position <value-of select="count( $rownode/cell[@cid = $apos]/preceding-sibling::cell ) + 1 "/> in table <value-of select="$table"/> in row <value-of select="$row"/>
-						</if>
-						
-						<!-- check values -->
-						<call-template name="typecheckforcell">
-							<with-param name="aid" select="$apos"/>
-							<with-param name="value" select="@value"/>
-							<with-param name="acolumns" select="$acolumns"/>
-						</call-template>						
-						
-						<!-- calculate all acid with preceding cid and compare them with apos -->
-						
-						<for-each select="$rownode/cell">
-						
-							<variable name="apos2" select="position()"/>
-						
-							<if test="not(@cid)">
-								<!-- Look for preceding siblings with cids -->
-								<if test="count( preceding-sibling::cell[@cid] ) >= 1">
-									<!-- get cid of nearest preceding sibling -->					
-									<variable name="prevcid" select="preceding-sibling::cell[@cid][position() = 1]/@cid" />
-									<!-- get distance between current cell and nearest preceding sibling with cid defined -->
-									<variable name="distance" select="$apos2 - ( count( $rownode/cell[@cid=$prevcid]/preceding-sibling::cell ) + 1 )"/>
-									<!--  calculate implicit cid -->
-									<variable name="acid" select="$prevcid + $distance"/>
-									
-									<!-- is this implicit cid equal to surrounding implicit cid given by a position? -->
-									<if test="$acid=$apos">
-	Error: two implicit cids are the same: cells <value-of select="$apos"/> and <value-of select="$apos2"/> in table <value-of select="$table"/> in row <value-of select="$row"/>
-									</if>
-
-										
-								</if>
-							</if>
-						
-						</for-each>
-						
-					</otherwise>
-				</choose>
-			</when>
-			<otherwise><!-- @cid is defined -->
-				
-				<!-- check values -->
-				<call-template name="typecheckforcell">
-					<with-param name="aid" select="@cid"/>
-					<with-param name="value" select="@value"/>
-					<with-param name="acolumns" select="$acolumns"/>
-				</call-template>				
-				
-			</otherwise>
-			</choose>
-		
-		</for-each>
-
-	</for-each>
-
-</for-each>
-</if>
-
-<if test="not(@layout='true')">
-------------------------------------------------------------
-Checking tablelayouts:
-
-<for-each select="tablelayout">
-
-<variable name="layoutid" select="@id"/>
-<variable name="gid" select="@gid"/>
-<variable name="orgtable" select="/lml:lgui/table[@id=$gid]"/>
-
-<!-- check if cid-attributes of tablelayout go with id-attributes of table  -->
-<for-each select="column[not(@active='false')]/@cid">
-
-	<variable name="acid" select="."/>
-	<variable name="countids" select="count( $orgtable/column[@id=$acid] )" />
-	
-	<if test="$countids=0">
-	Error: in tablelayout <value-of select="$layoutid"/>: cid-attribute <value-of select="$acid"/> is not allowed for table <value-of select="$orgtable/@id"/>
-	</if>	
-
-</for-each>
-
-<!-- check pos in {0..#columns-1}. pos-attribute can not comprise a value higher then maximum of positions -->
-<variable name="maxpos" select="count($orgtable/column)-1"/>
-
-<for-each select="column/@pos">
-
-	<variable name="apos" select="."/>
-	<if test="$apos>$maxpos">
-	Error: in tablelayout <value-of select="$layoutid"/>: pos-value is not allowed pos=<value-of select="$apos"/>, but pos must be lower or equal to <value-of select="$maxpos"/>
-	</if>
-
-</for-each>
-
-<!-- check sorted is only once not equal to "false", because the table can only be sorted by one column -->
-<if test="count( column[@sorted!='false'] ) > 1">
-	Error: in tablelayout <value-of select="$layoutid"/>: the table can only be sorted by one column, this layout defines <value-of select="count( column[@sorted!='false'] )"/> columns by which the table should be sorted
-</if>
-
-</for-each>
-</if>
-
-------------------------------------------------------------
-Checking infoboxlayouts:
-
-<for-each select="infoboxlayout">
-
-<variable name="layoutid" select="@id"/>
-
-<!-- check sorted is only once not equal to "false", because the table can only be sorted by one column -->
-<if test="count( ./*[@sorted!='false'] ) > 1">
-	Error: in infoboxlayout <value-of select="$layoutid"/>: the infoboxtable can only be sorted by one column, this layout defines <value-of select="count( ./*[@sorted!='false'] )"/> columns by which the table should be sorted
-</if>
-
-</for-each>
-
-------------------------------------------------------------
-Checking textlayouts:
-
-<for-each select="textlayout">
-
-<variable name="layoutid" select="@id"/>
-<variable name="gid" select="@gid"/>
-<variable name="orgtext" select="/lml:lgui/text[@id=$gid]"/>
-
-<!-- check if referred text-tag contains info-tag, otherwise error-->
-<if test="not( $orgtext/info )">
-	Error: in textlayout <value-of select="$layoutid"/>: textlayouts can only be defined for text-objects with key-value-pairs through info-tag in it
-</if>
-
-</for-each>
-
-<if test="not(@layout='true')">
-------------------------------------------------------------
-Checking usagebars:
-
-<for-each select="usagebar">
-	
-	usagebar <value-of select="@id"/>
-
-	<!-- total amount of cpucounts -->
-	<variable name="total" select="@cpucount"/>
-
-	<!-- cpucount-value must be equal to sum of cpucount-values of inner job-tags -->
-	<if test="sum(job/@cpucount) != $total">
-		Error: sum of cpucount-attributes of job-tags is not equal to allowed total cpucount given by the cpucount-attribute of the usagebar, total=<value-of select="$total"/>, sum=<value-of select="sum(job/@cpucount)"/>
-	</if>
-
-	<!-- cpucount-value of a job-tag must be equal to sum of cpucount-values of inner jobpart-tags -->
-	<for-each select="./job">
-		<!-- save position of job-tag -->
-		<variable name="pos" select="position()"/>
-		
-		<if test="count(jobpart)>0">
-
-			<variable name="jobtotal" select="@cpucount"/>
-	
-			<if test="sum(jobpart/@cpucount) != $jobtotal">
-		Error: sum of cpucount-attributes in jobparts is not equal to allowed total cpucount given by the cpucount-attribute of the job-tag with oid <value-of select="@oid"/>, total=<value-of select="$jobtotal"/>, sum=<value-of select="sum(jobpart/@cpucount)"/>, job-tag-nr=<value-of select="$pos"/>
-			</if>
-
-		</if>
-	</for-each>
-
-</for-each>
-</if>
-
-<if test="not(@layout='true')">
-------------------------------------------------------------
-Checking nodedisplays:
-	
-	Base Nodedisplays:
-		<for-each select="nodedisplay[count(@refto)=0]">
-		
-		Nodedisplay <value-of select="@id"/>
-			<!-- call template for nodedisplays-->
-			<apply-templates select="."/>
-
-			<!--special checks only for base nodedisplays-->
-
-			<!-- base nodedisplays are not allowed to use refid-attributes-->
-
-			<for-each select=".//*[@refid]">
-			Error: base nodedisplays are not allowed to use refid-attributes, but used in <value-of select="name()"/> refid=<value-of select="@refid"/>
-			</for-each>
-
-			<!-- base nodedisplay must define an oid for every system-element in the data-tag-->
-			<for-each select="data//*[count(@oid)=0]">
-
-			Error: In a basic nodedisplay every data-element must define oid: No oid in <value-of select="name()"/>
-
-			</for-each>
-			<!-- oids must refer to objects of type job-->
-			<for-each select="data//*">
-
-				<variable name="oid" select="@oid"/>
-
-				<if test="/lml:lgui/objects/object[@id=$oid]/@type!='job'">
-			Error: oid-reference must refer to a job-object: oid=<value-of select="$oid"/> type=<value-of select="/lml:lgui/objects/object[@id=$oid]/@type"/> in <value-of select="name()"/>
-				</if>
-
-			</for-each>
-
-			<!--name-attributes must not refer to jobs or queues, but only physical elements in the system-->
-			<for-each select="data//*[@name]">
-
-				<variable name="name" select="@name"/>
-
-				<if test="/lml:lgui/objects/object[@id=$name]/@type='job' or /lml:lgui/objects/object[@id=$name]/@type='queue'">
-			Error: name-attribute must refer to an object, which must not be of type queue or job: name=<value-of select="$name"/> in <value-of select="name()"/>
-				</if>
-
-			</for-each>
-
-
-			<!-- it is not allowed to use the name-attribute within lists of elements 
-				=> name can only be used if all upper elements have max=min -->
-			<for-each select="data//*[@max>@min]">
-				<variable name="mult" select="name()"/>
-				<for-each select="./descendant-or-self::node()[@name]">
-			Error: reference to an object not allowed in a list of elements: name in element <value-of select="name()"/> with name=<value-of select="@name"/>. Multiple definitions in element <value-of select="$mult"/>
-				</for-each>
-			</for-each>
-
-		</for-each>
-
-	Referencing Nodedisplays:
-		<for-each select="nodedisplay[count(@refto)>0]">
-			
-		Nodedisplay <value-of select="@id"/>
-			<!-- checks which are the same for both types of nodedisplays-->
-			<apply-templates select="."/>
-
-			<!-- special checks for nodedisplay-references-->
-			<!-- it is not allowed to use the refid-attribute within lists of elements 
-				=> refid can only be used if all upper elements have max=min -->
-			<for-each select="data//*[@max>@min]">
-				<variable name="mult" select="name()"/>
-				<for-each select="./descendant-or-self::node()[@refid]">
-			Error: reference to a physical element not allowed in a list of elements: refid in element <value-of select="name()"/> with refid=<value-of select="@refid"/>. Multiple definitions in element <value-of select="$mult"/>
-				</for-each>
-			</for-each>
-
-			<!-- referencing nodedisplays are not allowed to use attribute oid-->
-			<for-each select=".//*[@oid]">
-			Error: referencing nodedisplays are not allowed to use oid-attributes, but used in <value-of select="name()"/> oid=<value-of select="@oid"/>
-			</for-each>
-
-			<!-- referencing nodedisplays are not allowed to use attribute name-->
-			<for-each select=".//*[@name]">
-			Error: referencing nodedisplays are not allowed to use name-attributes, but used in <value-of select="name()"/> name=<value-of select="@name"/>
-			</for-each>
-
-			<!-- referencing nodedisplays are not allowed to use attribute status-->
-			<for-each select=".//*[@status]">
-			Error: referencing nodedisplays are not allowed to use status-attributes, but used in <value-of select="name()"/> status=<value-of select="@status"/>
-			</for-each>
-
-		</for-each>
-</if>
-
-<if test="not(@layout='true')">
-------------------------------------------------------------
-Checking charts:
-
-	<for-each select=".//chart">
-	
-	<variable name="cid" select="@id"/>
-	<!--check min-max attributes in x-tag within axes-->
-	<for-each select="axes/x">
-		<if test="@min>@max">
-	Error: in chart <value-of select="$cid"/> in x-axis-definition: min >= max, min=<value-of select="@min"/> max=<value-of select="@max"/>
-		</if>
-	</for-each>
-	<!--check min-max attributes in y-tags within axes-->
-	<for-each select="axes/y">
-		<if test="@min>@max">
-	Error: in chart <value-of select="$cid"/> in y-axis-definition: min >= max, min=<value-of select="@min"/> max=<value-of select="@max"/>
-		</if>
-	</for-each>
-
-	</for-each>
-</if>
-
-------------------------------------------------------------
-Checking layouts:
-	<for-each select="splitlayout">
-
-	Splitlayout <value-of select="@id"/>
-		
-		<for-each select=".//left|.//right|.//bottom|.//top">
-			<!-- a splitpane, which has lower elements, must not define gid -->
-			<if test="count(./*)>0 and @gid">
-		Error: in element with tagname <text>"</text><value-of select="name()"/><text>"</text>, a wrapper-splitplane cannot be connected with a graphical object, gid=<value-of select="@gid"/>
-			</if>
-			<!-- a leave-node within splitlayout must not define the divpos-attribute-->
-			<if test="count(./*)=0 and @divpos">
-		Error: in element with tagname <text>"</text><value-of select="name()"/><text>"</text>, a leave within in this layout is not allowed to define divpos, divpos=<value-of select="@divpos"/>
-			</if>
-			<!-- a leave-node within splitlayout must define gid-->
-			<if test="count(./*)=0 and count(@gid)=0">
-		Error: in element with tagname <text>"</text><value-of select="name()"/><text>"</text>, a leave component must be connected to a graphical element through the attribute gid
-			</if>
-			<!-- a splitpane-tag contains zero or two children-->
-			<if test="count(./*)!=0 and count(./*)!=2">
-		Error: in element with tagname <text>"</text><value-of select="name()"/><text>"</text>, every element is either empty or has two children, this one has <value-of select="count(./*)"/> children
-			</if>
-		</for-each>
-
-	</for-each>
-<!-- Eine Leerzeile am Ende-->
-<text>
-
-</text>
-	
-</template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/schema/nodedisplay.xsd b/rms/org.eclipse.ptp.rm.lml.core/schema/nodedisplay.xsd
deleted file mode 100644
index f51ec7e..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/schema/nodedisplay.xsd
+++ /dev/null
@@ -1,407 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-          LML - LLView markup language 
-
-   Copyright (c) 2011 Forschungszentrum Juelich GmbH
-   All rights reserved. This program and the accompanying materials
-   are made available under the terms of the Eclipse Public License v1.0
-   which accompanies this distribution and is available at
-   http://www.eclipse.org/legal/epl-v10.html
- -->
-<schema targetNamespace="http://www.llview.de"
-	xmlns="http://www.w3.org/2001/XMLSchema"
-	xmlns:lml="http://www.llview.de">
-
-    <include schemaLocation=""></include>
-    <include schemaLocation="lgui.xsd"></include>
-    <complexType name="element_type">
-    	<annotation>
-    		<documentation>
-    			Abstract element type for either scheme- or
-    			data-elements. This element is repeated (max-min+1)
-    			times, if step in the scheme-section is 1. max should be
-    			higher then min. If max is left out, max will be set to
-    			min (max=min). min="0", max="0" means there is only one
-    			element.
-    		</documentation>
-    	</annotation>
-    	<attribute name="min" type="nonNegativeInteger">
-    		<annotation>
-    			<documentation>
-    				Defines a list of elements. In default-case (count
-    				is not defined) count is set to one.
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="max" type="nonNegativeInteger"></attribute>
-    	<attribute name="list" type="lml:list_type"></attribute>
-    </complexType>
-
-
-
-
-    <complexType name="scheme_type">
-        <annotation>
-        	<documentation>Scheme description of batch-system. Describes an empty instance of the actual batch system.</documentation>
-        </annotation>
-        <sequence>
-    		<element name="el1" type="lml:scheme_element1" minOccurs="1" maxOccurs="unbounded"></element>
-    	</sequence>
-    </complexType>
-
-
-    <complexType name="data_type">
-    	<sequence>
-    		<element name="el1" type="lml:data_element1" minOccurs="1" maxOccurs="unbounded"></element>
-    	</sequence>
-    </complexType>
-
-    <complexType name="nodedisplay">
-    	<annotation>
-    		<documentation>
-    			Representation of the overview about cpus and which jobs
-    			are running on which cpu/node. Designed as tree.
-    			Scheme-tag describes an empty batch-system, data-tag the
-    			actual situation in this system. Data-tag connects
-    			elements in the nodedisplay with jobs, which are running
-    			in the system.
-    		</documentation>
-    	</annotation>
-    	<complexContent>
-    		<extension base="lml:gobject_type">
-    			<sequence>
-    				<element name="scheme" type="lml:scheme_type">
-
-    					<!-- defines unique tag-names within nodedisplay/scheme -->
-    					<key name="schemetagKey">
-    						<selector xpath=".//el" />
-    						<field xpath="@tagname" />
-    					</key>
-
-    				</element>
-    				<element name="data" type="lml:data_type">
-
-    					<!-- References to allowed tagnames within scheme-tag 
-    						<keyref name="schemetagRef" refer="lml:schemetagKey">
-    						<selector xpath=".//el"/>
-    						<field xpath="@tagname"/>
-    						</keyref>-->
-    					<!-- referenced implicit names can only be used once -->
-    					<unique name="refidsUnique">
-        					<selector xpath=".//*"/>
-        					<field xpath="@refid"/>
-        				</unique>
-
-    				</element>
-    			</sequence>
-    			<attribute name="refto" type="string"></attribute>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="scheme_element1">
-    	<complexContent>
-    		<extension base="lml:scheme_element">
-    			<sequence>
-    				<element name="el2" type="lml:scheme_element2" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-    
-    <complexType name="scheme_element10">
-    	<complexContent>
-    		<extension base="lml:scheme_element"></extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="scheme_element9">
-    	<complexContent>
-    		<extension base="lml:scheme_element">
-    			<sequence>
-    				<element name="el10" type="lml:scheme_element10" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="scheme_element8">
-    	<complexContent>
-    		<extension base="lml:scheme_element">
-    			<sequence>
-    				<element name="el9" type="lml:scheme_element9" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="scheme_element7">
-    	<complexContent>
-    		<extension base="lml:scheme_element">
-    			<sequence>
-    				<element name="el8" type="lml:scheme_element8" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="scheme_element6">
-    	<complexContent>
-    		<extension base="lml:scheme_element">
-    			<sequence>
-    				<element name="el7" type="lml:scheme_element7" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="scheme_element5">
-    	<complexContent>
-    		<extension base="lml:scheme_element">
-    			<sequence>
-    				<element name="el6" type="lml:scheme_element6" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="scheme_element4">
-    	<complexContent>
-    		<extension base="lml:scheme_element">
-    			<sequence>
-    				<element name="el5" type="lml:scheme_element5" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="scheme_element3">
-    	<complexContent>
-    		<extension base="lml:scheme_element">
-    			<sequence>
-    				<element name="el4" type="lml:scheme_element4" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="scheme_element2">
-    	<complexContent>
-    		<extension base="lml:scheme_element">
-    			<sequence>
-    				<element name="el3" type="lml:scheme_element3" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-    
-    
-    <complexType name="data_element1">
-    	<complexContent>
-    		<extension base="lml:data_element">
-    			<sequence>
-    				<element name="el2" type="lml:data_element2" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-    
-    <complexType name="data_element10">
-    	<complexContent>
-    		<extension base="lml:data_element"></extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="data_element9">
-    	<complexContent>
-    		<extension base="lml:data_element">
-    			<sequence>
-    				<element name="el10" type="lml:data_element10" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="data_element8">
-    	<complexContent>
-    		<extension base="lml:data_element">
-    			<sequence>
-    				<element name="el9" type="lml:data_element9" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="data_element7">
-    	<complexContent>
-    		<extension base="lml:data_element">
-    			<sequence>
-    				<element name="el8" type="lml:data_element8" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="data_element6">
-    	<complexContent>
-    		<extension base="lml:data_element">
-    			<sequence>
-    				<element name="el7" type="lml:data_element7" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="data_element5">
-    	<complexContent>
-    		<extension base="lml:data_element">
-    			<sequence>
-    				<element name="el6" type="lml:data_element6" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="data_element4">
-    	<complexContent>
-    		<extension base="lml:data_element">
-    			<sequence>
-    				<element name="el5" type="lml:data_element5" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="data_element3">
-    	<complexContent>
-    		<extension base="lml:data_element">
-    			<sequence>
-    				<element name="el4" type="lml:data_element4" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="data_element2">
-    	<complexContent>
-    		<extension base="lml:data_element">
-    			<sequence>
-    				<element name="el3" type="lml:data_element3" minOccurs="0" maxOccurs="unbounded"></element>
-    			</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-
-    <complexType name="data_element">
-    	<annotation>
-    		<documentation>
-    			Abstract base-type for el-tags in data-tag. Could be
-    			used for special attributes, which only data-elements
-    			are allowed to include.
-    		</documentation>
-    	</annotation>
-    	<complexContent>
-    		<extension base="lml:element_type">
-    			<attribute name="oid" type="NCName">
-    				<annotation>
-    					<documentation>
-    						Reference to one job within objects-tag. To
-    						make sure, that every physical element is
-    						connected to one job, this attribute is
-    						required.
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="name" type="NCName">
-    				<annotation>
-    					<documentation>
-    						For example: R30-M1 (Name of a node in
-    						jugene).
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="description" type="string">
-    				<annotation>
-    					<documentation>
-    						For example: A running node.
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="status" type="string">
-    				<annotation>
-    					<documentation>
-    						For example running, waiting, broken.
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="refid" type="string"></attribute>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="scheme_element">
-    	<annotation>
-    		<documentation>
-    			All el?-tags will be subtypes of this type. Tagname has
-    			to be defined here. Data-elements must not repeat this
-    			tagname.
-    		</documentation>
-    	</annotation>
-    	<complexContent>
-    		<extension base="lml:element_type">
-    			<attribute name="tagname" type="NCName"></attribute>
-    			<attribute name="mask" default="%d-">
-    				<annotation>
-    					<documentation>
-    						If mask is not defined, default-mask is
-    						"%d-". To separate name-parts of implicit
-    						names use the length of the mask or a given
-    						separator. An unidentifying mask like "%d"
-    						is not allowed.
-    					</documentation>
-    				</annotation>
-    				<simpleType>
-    					<restriction base="string">
-    						<pattern
-    							value="(([^%])*%(\-|\+|\s|\#)*0(\-|\+|\s|\#)*(\d)+d([^%])*)|(([^%])*%(\-|\+|\s|\#)*d([^%\d])+)|(([^%])*%(\-|\+|\s|\#)*1d([^%])*)">
-    						</pattern>
-    					</restriction>
-    				</simpleType>
-    			</attribute>
-    			<attribute name="step" type="positiveInteger"
-    				default="1">
-    				<annotation>
-    					<documentation>
-    						default-step-width is 1. This is the value,
-    						which is set, if step is not defined.
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="map" type="lml:namemapping_type">
-    				<annotation>
-    					<documentation>Map names as implicit names to these components. mask and map can not be used together. map defines special names for all elements within this list. names must be separated by commas.</documentation>
-    				</annotation></attribute>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-
-    <simpleType name="list_type">
-        <annotation>
-        	<documentation>Type for list-attribute in scheme- or data-tag. It allowes the definition of several positive integer-values seperated by commas.</documentation>
-        </annotation>
-        <restriction base="string">
-    		<pattern value="\s*\d+\s*(\s*,\s*\d+)*"></pattern>
-    	</restriction>
-    </simpleType>
-
-    <simpleType name="namemapping_type">
-        <annotation>
-        	<documentation>This type is used to map special names to elements of the nodedisplay. Usually a digit has to be printed with a mask-atttribute, but if the name does not contain a digit, this type will be used to define those special names.</documentation>
-        </annotation>
-        <restriction base="string">
-    		<pattern value=".*(,.*)*"></pattern>
-    	</restriction>
-    </simpleType>
-</schema>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/schema/relation.xsd b/rms/org.eclipse.ptp.rm.lml.core/schema/relation.xsd
deleted file mode 100644
index 485ab78..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/schema/relation.xsd
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-          LML - LLView markup language 
-
-   Copyright (c) 2011 Forschungszentrum Juelich GmbH
-   All rights reserved. This program and the accompanying materials
-   are made available under the terms of the Eclipse Public License v1.0
-   which accompanies this distribution and is available at
-   http://www.eclipse.org/legal/epl-v10.html
- -->
-<schema targetNamespace="http://www.llview.de" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:lml="http://www.llview.de">
-
-    <complexType name="relation_type">
-    	<annotation>
-    		<documentation>
-    			A set of objects, which are related to each other. Could
-    			contain a list of jobs of one user. If any job in the
-    			relation is focused, every job in this set will be
-    			highlighted. keyid can be used to define objects which are connected to all added objects in this relation_type. If keyid is not defined, all elements in this tag will be used as keys.
-    		</documentation>
-    	</annotation>
-    	<sequence>
-    		<element name="el" type="lml:relation_element_type"
-    			minOccurs="0" maxOccurs="unbounded">
-    		</element>
-    	</sequence>
-    	<attribute name="id" type="NCName" use="required">
-    		<annotation>
-    			<documentation>
-    				This id can be referenced by all objects in lml. Is
-    				similar to an id of an object-tag within the
-    				objects-tag.
-    			</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="name" type="string">
-    		<annotation>
-    			<documentation>Name of this set.</documentation>
-    		</annotation>
-    	</attribute>
-    	<attribute name="keyid" type="NCName">
-    		<annotation>
-    			<documentation>ID-Ref to one object or relation which is related to all elements added in this tag.</documentation>
-    		</annotation></attribute>
-    </complexType>
-
-    <complexType name="relation_element_type">
-    	<attribute name="refid" type="NCName">
-    		<annotation>
-    			<documentation>Reference-Id to an object-tag or another relation.</documentation>
-    		</annotation></attribute>
-    </complexType>
-
-    <complexType name="relations_type">
-    	<sequence>
-    		<element name="rel" type="lml:relation_type" minOccurs="0" maxOccurs="unbounded"></element>
-    	</sequence>
-    </complexType>
-</schema>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/schema/table.xsd b/rms/org.eclipse.ptp.rm.lml.core/schema/table.xsd
deleted file mode 100644
index d642fc2..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/schema/table.xsd
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-          LML - LLView markup language 
-
-   Copyright (c) 2011 Forschungszentrum Juelich GmbH
-   All rights reserved. This program and the accompanying materials
-   are made available under the terms of the Eclipse Public License v1.0
-   which accompanies this distribution and is available at
-   http://www.eclipse.org/legal/epl-v10.html
- -->
-<schema targetNamespace="http://www.llview.de" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:lml="http://www.llview.de">
-
-    <include schemaLocation="lgui.xsd"></include>
-    <complexType name="column_type">
-        <annotation>
-        	<documentation>Describes one column of table.</documentation>
-        </annotation>
-        <attribute name="name" type="NCName" use="required"></attribute>
-    	<attribute name="sort" type="lml:sorting_type"></attribute>
-    	<attribute name="description" type="string"></attribute>
-    	<attribute name="id" type="positiveInteger" use="required"></attribute>
-    </complexType>
-
-    <simpleType name="sorting_type">
-        <annotation>
-        	<documentation>Defines allowed ways of how columns are sorted.</documentation>
-        </annotation>
-        <restriction base="string">
-    		<enumeration value="numeric"></enumeration>
-    		<enumeration value="alpha"></enumeration>
-    		<enumeration value="date"></enumeration>
-    	</restriction>
-    </simpleType>
-
-    <complexType name="cell_type">
-        <annotation>
-        	<documentation>Can be linked to column by using foreign key cid to cid-attribute of column-tag.
-Otherwise order of cells define connections to columns.</documentation>
-        </annotation>
-        <attribute name="cid" type="positiveInteger">
-    		<annotation>
-    			<documentation>Is cid not defined, order of columns and cells will define which cell is connected to which column.</documentation>
-    		</annotation></attribute>
-    	<attribute name="value" type="string"></attribute>
-    </complexType>
-
-
-    <complexType name="row_type">
-        <annotation>
-        	<documentation>One row in final table.</documentation>
-        </annotation>
-        <sequence>
-    		<element name="cell" type="lml:cell_type" minOccurs="0" maxOccurs="unbounded"></element>
-    	</sequence>
-    	<attribute name="oid" type="NCName">
-    		<annotation>
-    			<documentation>Reference to object-tag</documentation>
-    		</annotation></attribute>
-    </complexType>
-
-
-    <complexType name="table_type">
-    	<annotation>
-    		<documentation>
-    			An abstract table. Defines several columns, which can be
-    			sorted by different datatypes. Then data is defined in
-    			row-tags, which can be linked with object-tags.
-    		</documentation>
-    	</annotation>
-    	<complexContent>
-    		<extension base="lml:gobject_type">    		
-    			<sequence>
-		    		<element name="column" type="lml:column_type" minOccurs="0"
-		    			maxOccurs="unbounded">
-		    		</element>
-		    		<element name="row" type="lml:row_type" minOccurs="0"
-		    			maxOccurs="unbounded">
-		    			
-		    			<!-- for one column only one cell in a row -->
-	        			<unique name="cellCIDUnique">
-	        				<selector xpath="cell"/>
-	        				<field xpath="@cid"/>
-	        			</unique>
-		    			
-		    		</element>
-		    	</sequence>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-
-</schema>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/schema/textboxes.xsd b/rms/org.eclipse.ptp.rm.lml.core/schema/textboxes.xsd
deleted file mode 100644
index d59ce20..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/schema/textboxes.xsd
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-          LML - LLView markup language 
-
-   Copyright (c) 2011 Forschungszentrum Juelich GmbH
-   All rights reserved. This program and the accompanying materials
-   are made available under the terms of the Eclipse Public License v1.0
-   which accompanies this distribution and is available at
-   http://www.eclipse.org/legal/epl-v10.html
- -->
-<schema targetNamespace="http://www.llview.de" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:lml="http://www.llview.de">
-
-
-    <include schemaLocation="lgui.xsd"></include>
-    <include schemaLocation="entities.xsd"></include>
-    <complexType name="textbox_type">
-    	<complexContent>
-    		<extension base="lml:gobject_type">
-    			<choice>
-		    		<element name="text" type="string"></element>
-		    		<element name="info" type="lml:textinfo_type"></element>
-		    	</choice>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-    <complexType name="textinfo_type">
-    	<sequence>
-    		<element name="data" type="lml:infodata_type" minOccurs="0" maxOccurs="unbounded"></element>
-    	</sequence>
-    </complexType>
-
-    <complexType name="infobox_type">
-    	<complexContent>
-    		<extension base="lml:gobject_type">
-
-
-
-    			<attribute name="type" type="NCName" default="notype">
-    				<annotation>
-    					<documentation>this attribute references to type-attributes of information-tags. This infobox will only show elements with the given type.</documentation>
-    				</annotation></attribute>
-    		</extension>
-    	</complexContent>
-    </complexType>
-</schema>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/schema/usagebar.xsd b/rms/org.eclipse.ptp.rm.lml.core/schema/usagebar.xsd
deleted file mode 100644
index eab6412..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/schema/usagebar.xsd
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-          LML - LLView markup language 
-
-   Copyright (c) 2011 Forschungszentrum Juelich GmbH
-   All rights reserved. This program and the accompanying materials
-   are made available under the terms of the Eclipse Public License v1.0
-   which accompanies this distribution and is available at
-   http://www.eclipse.org/legal/epl-v10.html
- -->
-<schema targetNamespace="http://www.llview.de" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:lml="http://www.llview.de">
-
-	<include schemaLocation="lgui.xsd"></include>
-
-    <annotation>
-    	<documentation>Gives a brief overview of running jobs on the system.</documentation></annotation>
-    <complexType name="job_type">
-        <annotation>
-        	<documentation>Describes one job in the usagebar. Saves how many cpus are used by this job and how many cpus are on one node.
-If this job is running on different node-architectures, where cpupernode differs, a list of jobparts has to be used.
-So one job can be divided into jobparts for a more detailled description.</documentation>
-        </annotation>
-        <sequence>
-    		<element name="jobpart" type="lml:job_part_type" minOccurs="0" maxOccurs="unbounded"></element>
-    	</sequence>
-    	<attribute name="oid" type="NCName" use="required"></attribute>
-    	<attribute name="cpucount" type="nonNegativeInteger" use="required"></attribute>
-    	<attribute name="cpupernode" type="positiveInteger"></attribute>
-    </complexType>
-    
-    <complexType name="job_part_type">
-    	<attribute name="cpucount" type="nonNegativeInteger" use="required"></attribute>
-    	<attribute name="cpupernode" type="positiveInteger"></attribute>
-    </complexType>
-
-    <complexType name="usagebar_type">
-    	<annotation>
-    		<documentation>
-    			Defines several jobs, that are now running on the
-    			system. CpuCount can be computed by adding all
-    			cpuCount-attributes of the defined job-tags.
-    		</documentation>
-    	</annotation>
-    	<complexContent>
-    		<extension base="lml:gobject_type">
-    			<sequence>
-    				<element name="job" type="lml:job_type"
-    					minOccurs="0" maxOccurs="unbounded">
-    				</element>
-    			</sequence>
-    			<attribute name="cpucount" type="nonNegativeInteger"
-    				use="required">
-    				<annotation>
-    					<documentation>
-    						defines how many cpus are in the whole
-    						system
-    					</documentation>
-    				</annotation>
-    			</attribute>
-    			<attribute name="cpupernode" type="positiveInteger" default="1"></attribute>
-    		</extension>
-    	</complexContent>
-    </complexType>
-
-</schema>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/ILMLCoreConstants.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/ILMLCoreConstants.java
deleted file mode 100644
index 533cadd..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/ILMLCoreConstants.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-package org.eclipse.ptp.rm.lml.core;
-
-public interface ILMLCoreConstants {
-	public static final String PLUGIN_ID = LMLCorePlugin.getUniqueIdentifier();
-	public static final String PREFIX = PLUGIN_ID + "."; //$NON-NLS-1$
-}
-	
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/ILMLManager.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/ILMLManager.java
deleted file mode 100644
index 76880f5..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/ILMLManager.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-package org.eclipse.ptp.rm.lml.core;
-
-import java.net.URL;
-
-import org.eclipse.ptp.rm.lml.core.listeners.ILMLListener;
-import org.eclipse.ptp.rm.lml.core.listeners.IListener;
-import org.eclipse.ptp.rm.lml.core.listeners.IViewListener;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-
-/**
- * This interface manages all different ILguiItems and the associated listeners.
- */
-public interface ILMLManager{
-	
-	/**
-	 * A new listener for the current considered ILguiItem is added.
-	 * @param listener 
-	 */
-	public void addListener(IViewListener listener, String view);
-	
-	public void addListener(ILMLListener listener, String view);
-	
-	public void addListener(IViewListener listener);
-	
-	public void removeListener(ILMLListener listener);
-	
-	public void removeListener(IViewListener listener);
-	
-	public IListener getListener(String view);
-	
-	/**
-	 * Checks if a new ILguiItem has to be created or if there is an existing ILguiItem. The method also creates the ILguItem. 
-	 * @param xmlFile the source of the XML file
-	 * @return true, if a new ILguiItem was created; otherwise false
-	 */
-	public boolean addLgui(URL xmlFile);
-	
-	/**
-	 * The current considered IlguiItem was sorted.
-	 */
-	public void sortLgui();
-	
-	public void selectLgui(int index);
-	
-	public void selectLgui(URL xmlFile);
-	
-	/**
-	 * Getting the current considered ILguiItem.
-	 * @return the current considered ILguiItem
-	 */
-	public ILguiItem getSelectedLguiItem();
-	
-	public String[] getLguis();
-	
-	public int getSelectedLguiIndex(String title);
-	
-	public void removeLgui(String title);
-	
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/LMLCorePlugin.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/LMLCorePlugin.java
deleted file mode 100644
index 80bc192..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/LMLCorePlugin.java
+++ /dev/null
@@ -1,325 +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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.core;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.text.SimpleDateFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import javax.xml.XMLConstants;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-
-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.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ptp.rm.lml.core.messages.Messages;
-import org.eclipse.ptp.rm.lml.core.util.DebugUtil;
-import org.eclipse.ptp.rm.lml.internal.core.LMLManager;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.xml.sax.SAXException;
-
-public class LMLCorePlugin extends Plugin {
-	public static final String PLUGIN_ID = "org.eclipse.ptp.rm.lml.core"; //$NON-NLS-1$
-
-	// The shared instance.
-	private static LMLCorePlugin fPlugin;
-	
-	/*
-	 * Unmarshaller for JAXB-generator 
-	 */
-	private static Unmarshaller unmarshaller;
-	
-	/*
-	 * DateFormat for (EEE MMM d HH:mm:ss yyyy)
-	 */
-	private SimpleDateFormat simpleDateFormat1;
-	
-	/*
-	 * DateFormat for (EEE MMM dd HH:mm:ss yyyy)
-	 */
-	private SimpleDateFormat simpleDateFormat2;
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static LMLCorePlugin getDefault() {
-		return fPlugin;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = LMLCorePlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Generate a unique identifier
-	 * 
-	 * @return unique identifier string
-	 */
-	public static String getUniqueIdentifier() {
-		if (getDefault() == null) {
-			// If the default instance is not yet initialized,
-			// return a static identifier. This identifier must
-			// match the plugin id defined in plugin.xml
-			return PLUGIN_ID;
-		}
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	/**
-	 * 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) {
-		if (DebugUtil.RM_TRACING) {
-			System.err.println(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, Messages.LMLCorePlugin_0, e));
-	}
-
-	/*
-	 * Resource bundle
-	 */
-	private ResourceBundle resourceBundle;
-	/*
-	 * ModelManager for this Eclipse session
-	 */
-	private ILMLManager lmlManager;
-
-	/**
-	 * The constructor.
-	 */
-	public LMLCorePlugin() {
-		super();
-		
-		fPlugin = this;
-		
-		try {
-			resourceBundle = ResourceBundle.getBundle(PLUGIN_ID + ".ParallelPluginResources"); //$NON-NLS-1$
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-	}
-	
-	/**
-	 * Getting the corresponding SimpleDateFormat to a given length:
-	 * 
-	 * @param length of a string
-	 * @return 
-	 */
-	public SimpleDateFormat getSimpleDateFormat(int length) {
-		return length == simpleDateFormat1.toPattern().length() ? simpleDateFormat1 : simpleDateFormat2;
-	}
-
-	/**
-	 * Get the model manager
-	 * 
-	 * @return the model manager
-	 */
-	public ILMLManager getLMLManager() {
-		return lmlManager;
-	}
-	
-	/**
-	 * Get the JAXB unmarshaller.
-	 * 
-	 * @return the JAXB unmarshaller
-	 */
-	public Unmarshaller getUnmarshaller() {
-		return unmarshaller;
-	}
-	
-	
-	/**
-	 * For the generation of instances from classes by JAXB a unmarshaller is needed. In the method the needed unmarshaller is created. It is said where the classes for the instantiation are.
-	 * @throws MalformedURLException
-	 * @throws JAXBException
-	 */
-	private void createUnmarshaller() throws MalformedURLException, JAXBException {
-		URL xsd = getBundle().getEntry("/schema/lgui.xsd");	
-		
-		JAXBContext jc = JAXBContext.newInstance("org.eclipse.ptp.rm.lml.internal.core.elements");
-		
-		unmarshaller = jc.createUnmarshaller();
-		
-		//if xsd is null => do not check for validity
-		if(xsd!=null){
-			
-			Schema mySchema;
-			SchemaFactory sf = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
-			
-			try {
-				
-				mySchema = sf.newSchema( xsd );
-			} catch( SAXException saxe ){
-				// ...(error handling)
-				mySchema = null;
-				
-			}
-			
-			//Connect schema to unmarshaller
-			unmarshaller.setSchema(mySchema);
-			
-		}
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-
-	/**
-	 * Locate the fragment for our architecture. This should really be phased
-	 * out, since there is now no guarantee that there will be local executables
-	 * for the proxy server or debugger.
-	 * 
-	 * @param fragment
-	 * @param file
-	 * @return path to "bin" directory in fragment
-	 */
-	public String locateFragmentFile(String fragment, String file) {
-		Bundle[] frags = Platform.getFragments(Platform.getBundle(LMLCorePlugin.PLUGIN_ID));
-
-		if (frags != null) {
-			String os = Platform.getOS();
-			String arch = Platform.getOSArch();
-			String frag_os_arch = fragment + "." + os + "." + arch; //$NON-NLS-1$ //$NON-NLS-2$
-
-			for (int i = 0; i < frags.length; i++) {
-				Bundle frag = frags[i];
-				URL path = frag.getEntry("/"); //$NON-NLS-1$
-				try {
-					URL local_path = FileLocator.toFileURL(path);
-					String str_path = local_path.getPath();
-
-					/*
-					 * Check each fragment that matches our os and arch for a
-					 * bin directory.
-					 */
-
-					int idx = str_path.indexOf(frag_os_arch);
-					if (idx > 0) {
-						/*
-						 * found it! This is the right fragment for our OS &
-						 * arch
-						 */
-						String file_path = str_path + "bin/" + file; //$NON-NLS-1$
-						File f = new File(file_path);
-						if (f.exists()) {
-							return file_path;
-						}
-					}
-
-				} catch (Exception e) {
-				}
-			}
-		}
-
-		/* guess we never found it.... */
-		return null;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		createUnmarshaller();
-		simpleDateFormat1 = new SimpleDateFormat("EEE MMM d HH:mm:ss yyyy");
-		simpleDateFormat2 = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy");
-		DebugUtil.configurePluginDebugOptions();
-		ResourcesPlugin.getWorkspace().addSaveParticipant(getUniqueIdentifier(), new ISaveParticipant() {
-			public void saving(ISaveContext saveContext) throws CoreException {
-				Preferences.savePreferences(getUniqueIdentifier());
-			}
-
-			public void rollback(ISaveContext saveContext) {
-			}
-
-			public void prepareToSave(ISaveContext saveContext) throws CoreException {
-			}
-
-			public void doneSaving(ISaveContext saveContext) {
-			}
-		});
-		lmlManager = new LMLManager();
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		try {
-			Preferences.savePreferences(getUniqueIdentifier());
-			ResourcesPlugin.getWorkspace().removeSaveParticipant(getUniqueIdentifier());
-		} finally {
-			super.stop(context);
-			fPlugin = null;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/Preferences.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/Preferences.java
deleted file mode 100644
index 129beac..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/Preferences.java
+++ /dev/null
@@ -1,526 +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
- *     
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-
-package org.eclipse.ptp.rm.lml.core;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Convenience class to facilitate using the new {@link IEclipsePreferences}
- * story. Adapted from org.eclipse.debug.internal.core.Preferences.
- * 
- * @since 5.0
- * @noinstantiate This class is not intended to be instantiated by clients.
- */
-public final class Preferences {
-
-	private static final IScopeContext[] contexts = new IScopeContext[] { new DefaultScope(), new InstanceScope() };
-
-	private static final int DEFAULT_CONTEXT = 0;
-	private static final int INSTANCE_CONTEXT = 1;
-
-	/**
-	 * Adds the given preference listener to the {@link DefaultScope} and the
-	 * {@link InstanceScope}
-	 * 
-	 * @param qualifier
-	 * @param listener
-	 */
-	public static void addPreferenceChangeListener(String qualifier, IPreferenceChangeListener listener) {
-		contexts[DEFAULT_CONTEXT].getNode(qualifier).addPreferenceChangeListener(listener);
-		contexts[INSTANCE_CONTEXT].getNode(qualifier).addPreferenceChangeListener(listener);
-	}
-
-	/**
-	 * Returns whether the named preference is know in the preference store.
-	 * 
-	 * @param qualifier
-	 * @param name
-	 * @return
-	 */
-	public static boolean contains(String qualifier, String name) {
-		return (contexts[INSTANCE_CONTEXT].getNode(qualifier).get(name, null) != null || contexts[DEFAULT_CONTEXT].getNode(
-				qualifier).get(name, null) != null);
-	}
-
-	/**
-	 * Returns the value in the preference store for the given key. If the key
-	 * is not defined then return the default value. Use the canonical scope
-	 * lookup order for finding the preference value.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the value of the preference or the given default value
-	 */
-	public static boolean getBoolean(String qualifier, String key) {
-		return Platform.getPreferencesService().getBoolean(qualifier, key, false, null);
-	}
-
-	/**
-	 * Returns the value in the preference store for the given key. If the key
-	 * is not defined then return the default value. Use the canonical scope
-	 * lookup order for finding the preference value.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the value of the preference or the given default value
-	 */
-	public static byte[] getByteArray(String qualifier, String key) {
-		return Platform.getPreferencesService().getByteArray(qualifier, key, null, null);
-	}
-
-	/**
-	 * Returns the default boolean value stored in the {@link DefaultScope} for
-	 * the given key or the specified default value if the key does not appear
-	 * in the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the boolean value set in the {@link DefaultScope} for the given
-	 *         key, or the specified default value.
-	 */
-	public static synchronized boolean getDefaultBoolean(String qualifier, String key, boolean defaultvalue) {
-		return contexts[DEFAULT_CONTEXT].getNode(qualifier).getBoolean(key, defaultvalue);
-	}
-
-	/**
-	 * Returns the default byte array value stored in the {@link DefaultScope}
-	 * for the given key or the specified default value if the key does not
-	 * appear in the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the byte array value set in the {@link DefaultScope} for the
-	 *         given key, or the specified default value.
-	 */
-	public static synchronized byte[] getDefaultByteArray(String qualifier, String key, byte[] defaultvalue) {
-		return contexts[DEFAULT_CONTEXT].getNode(qualifier).getByteArray(key, defaultvalue);
-	}
-
-	/**
-	 * Returns the default double value stored in the {@link DefaultScope} for
-	 * the given key or the specified default value if the key does not appear
-	 * in the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the double value set in the {@link DefaultScope} for the given
-	 *         key, or the specified default value.
-	 */
-	public static synchronized double getDefaultDouble(String qualifier, String key, double defaultvalue) {
-		return contexts[DEFAULT_CONTEXT].getNode(qualifier).getDouble(key, defaultvalue);
-	}
-
-	/**
-	 * Returns the default float value stored in the {@link DefaultScope} for
-	 * the given key or the specified default value if the key does not appear
-	 * in the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the float value set in the {@link DefaultScope} for the given
-	 *         key, or the specified default value.
-	 */
-	public static synchronized float getDefaultFloat(String qualifier, String key, float defaultvalue) {
-		return contexts[DEFAULT_CONTEXT].getNode(qualifier).getFloat(key, defaultvalue);
-	}
-
-	/**
-	 * Returns the default integer value stored in the {@link DefaultScope} for
-	 * the given key or the specified default value if the key does not appear
-	 * in the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the integer value set in the {@link DefaultScope} for the given
-	 *         key, or the specified default value.
-	 */
-	public static synchronized int getDefaultInt(String qualifier, String key, int defaultvalue) {
-		return contexts[DEFAULT_CONTEXT].getNode(qualifier).getInt(key, defaultvalue);
-	}
-
-	/**
-	 * Returns the default long value stored in the {@link DefaultScope} for the
-	 * given key or the specified default value if the key does not appear in
-	 * the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the long value set in the {@link DefaultScope} for the given key,
-	 *         or the specified default value.
-	 */
-	public static synchronized long getDefaultLong(String qualifier, String key, long defaultvalue) {
-		return contexts[DEFAULT_CONTEXT].getNode(qualifier).getLong(key, defaultvalue);
-	}
-
-	/**
-	 * Returns the default string value stored in the {@link DefaultScope} for
-	 * the given key or the specified default value if the key does not appear
-	 * in the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the string value set in the {@link DefaultScope} for the given
-	 *         key, or the specified default value.
-	 */
-	public static synchronized String getDefaultString(String qualifier, String key, String defaultvalue) {
-		return contexts[DEFAULT_CONTEXT].getNode(qualifier).get(key, defaultvalue);
-	}
-
-	/**
-	 * Returns the value in the preference store for the given key. If the key
-	 * is not defined then return the default value. Use the canonical scope
-	 * lookup order for finding the preference value.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the value of the preference or the given default value
-	 */
-	public static double getDouble(String qualifier, String key) {
-		return Platform.getPreferencesService().getDouble(qualifier, key, 0.0, null);
-	}
-
-	/**
-	 * Returns the value in the preference store for the given key. If the key
-	 * is not defined then return the default value. Use the canonical scope
-	 * lookup order for finding the preference value.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the value of the preference or the given default value
-	 */
-	public static float getFloat(String qualifier, String key) {
-		return Platform.getPreferencesService().getFloat(qualifier, key, 0.0f, null);
-	}
-
-	/**
-	 * Returns the value in the preference store for the given key. If the key
-	 * is not defined then return the default value. Use the canonical scope
-	 * lookup order for finding the preference value.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the value of the preference or the given default value
-	 */
-	public static int getInt(String qualifier, String key) {
-		return Platform.getPreferencesService().getInt(qualifier, key, 0, null);
-	}
-
-	/**
-	 * Returns the value in the preference store for the given key. If the key
-	 * is not defined then return the default value. Use the canonical scope
-	 * lookup order for finding the preference value.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the value of the preference or the given default value
-	 */
-	public static long getLong(String qualifier, String key) {
-		return Platform.getPreferencesService().getLong(qualifier, key, 0L, null);
-	}
-
-	/**
-	 * Returns the value in the preference store for the given key. If the key
-	 * is not defined then return the default value. Use the canonical scope
-	 * lookup order for finding the preference value.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 * @param defaultvalue
-	 * 
-	 * @return the value of the preference or the given default value
-	 */
-	public static String getString(String qualifier, String key) {
-		return Platform.getPreferencesService().getString(qualifier, key, "", null); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns true if the named preference has the default value.
-	 * 
-	 * @param qualifier
-	 * @param name
-	 * @return
-	 */
-	public static boolean isDefault(String qualifier, String name) {
-		String defVal = contexts[DEFAULT_CONTEXT].getNode(qualifier).get(name, null);
-		if (defVal != null) {
-			String val = contexts[INSTANCE_CONTEXT].getNode(qualifier).get(name, null);
-			return (val != null && val.equals(defVal));
-		}
-		return false;
-	}
-
-	/**
-	 * Removes the given preference listener from the {@link DefaultScope} and
-	 * the {@link InstanceScope}
-	 * 
-	 * @param qualifier
-	 * @param listener
-	 */
-	public static void removePreferenceChangeListener(String qualifier, IPreferenceChangeListener listener) {
-		contexts[DEFAULT_CONTEXT].getNode(qualifier).removePreferenceChangeListener(listener);
-		contexts[INSTANCE_CONTEXT].getNode(qualifier).removePreferenceChangeListener(listener);
-	}
-
-	/**
-	 * Save the preferences for the given plugin identifier. It should be noted
-	 * that all pending preference changes will be flushed with this method.
-	 * 
-	 * @param qualifier
-	 */
-	public static synchronized void savePreferences(String qualifier) {
-		try {
-			contexts[DEFAULT_CONTEXT].getNode(qualifier).flush();
-			contexts[INSTANCE_CONTEXT].getNode(qualifier).flush();
-		} catch (BackingStoreException bse) {
-			LMLCorePlugin.log(bse);
-		}
-	}
-
-	/**
-	 * Sets a boolean preference in the {@link InstanceScope}.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the value
-	 */
-	public static synchronized void setBoolean(String qualifier, String key, boolean value) {
-		contexts[INSTANCE_CONTEXT].getNode(qualifier).putBoolean(key, value);
-	}
-
-	/**
-	 * Sets a byte array preference in the {@link InstanceScope}.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the value
-	 */
-	public static synchronized void setByteArray(String qualifier, String key, byte[] value) {
-		contexts[INSTANCE_CONTEXT].getNode(qualifier).putByteArray(key, value);
-	}
-
-	/**
-	 * Sets a boolean in the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the new value
-	 */
-	public static synchronized void setDefaultBoolean(String qualifier, String key, boolean value) {
-		contexts[DEFAULT_CONTEXT].getNode(qualifier).putBoolean(key, value);
-	}
-
-	/**
-	 * Sets a byte array in the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the new value
-	 */
-	public static synchronized void setDefaultByteArray(String qualifier, String key, byte[] value) {
-		contexts[DEFAULT_CONTEXT].getNode(qualifier).putByteArray(key, value);
-	}
-
-	/**
-	 * Sets a double in the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the new value
-	 */
-	public static synchronized void setDefaultDouble(String qualifier, String key, double value) {
-		contexts[DEFAULT_CONTEXT].getNode(qualifier).putDouble(key, value);
-	}
-
-	/**
-	 * Sets a float in the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the new value
-	 */
-	public static synchronized void setDefaultFloat(String qualifier, String key, float value) {
-		contexts[DEFAULT_CONTEXT].getNode(qualifier).putFloat(key, value);
-	}
-
-	/**
-	 * Sets a integer in the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the new value
-	 */
-	public static synchronized void setDefaultInt(String qualifier, String key, int value) {
-		contexts[DEFAULT_CONTEXT].getNode(qualifier).putInt(key, value);
-	}
-
-	/**
-	 * Sets a long in the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the new value
-	 */
-	public static synchronized void setDefaultLong(String qualifier, String key, long value) {
-		contexts[DEFAULT_CONTEXT].getNode(qualifier).putLong(key, value);
-	}
-
-	/**
-	 * Sets a string in the {@link DefaultScope}
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the new value
-	 */
-	public static synchronized void setDefaultString(String qualifier, String key, String value) {
-		contexts[DEFAULT_CONTEXT].getNode(qualifier).put(key, value);
-	}
-
-	/**
-	 * Sets a double preference in the {@link InstanceScope}.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the value
-	 */
-	public static synchronized void setDouble(String qualifier, String key, double value) {
-		contexts[INSTANCE_CONTEXT].getNode(qualifier).putDouble(key, value);
-	}
-
-	/**
-	 * Sets a float preference in the {@link InstanceScope}.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the value
-	 */
-	public static synchronized void setFloat(String qualifier, String key, float value) {
-		contexts[INSTANCE_CONTEXT].getNode(qualifier).putFloat(key, value);
-	}
-
-	/**
-	 * Sets a integer preference in the {@link InstanceScope}.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the value
-	 */
-	public static synchronized void setInt(String qualifier, String key, int value) {
-		contexts[INSTANCE_CONTEXT].getNode(qualifier).putInt(key, value);
-	}
-
-	/**
-	 * Sets a long preference in the {@link InstanceScope}.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the value
-	 */
-	public static synchronized void setLong(String qualifier, String key, long value) {
-		contexts[INSTANCE_CONTEXT].getNode(qualifier).putLong(key, value);
-	}
-
-	/**
-	 * Sets a string preference in the {@link InstanceScope}.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the value
-	 */
-	public static synchronized void setString(String qualifier, String key, String value) {
-		contexts[INSTANCE_CONTEXT].getNode(qualifier).put(key, value);
-	}
-
-	/**
-	 * Sets the given preference to its default value. This is done by removing
-	 * any set value from the {@link InstanceScope}. Has no effect if the given
-	 * key is <code>null</code>.
-	 * 
-	 * @param qualifier
-	 * @param key
-	 *            the key for the preference
-	 */
-	public static synchronized void setToDefault(String qualifier, String key) {
-		if (key != null) {
-			contexts[INSTANCE_CONTEXT].getNode(qualifier).remove(key);
-		}
-	}
-
-	/**
-	 * Constructor
-	 */
-	private Preferences() {
-		// no direct instantiation
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/IJobListSortedEvent.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/IJobListSortedEvent.java
deleted file mode 100644
index 48d5477..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/IJobListSortedEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.core.events;
-
-import org.eclipse.ptp.rm.lml.core.ILMLManager;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-
-/**
- * Interface to manage the event that a joblist has been sorted.  
- * @author Claudia Knobloch
- */
-public interface IJobListSortedEvent {
-	
-	/**
-	 * Getting the involved IlguiItem.
-	 * @return the involved ILguiItem
-	 */
-	public ILguiItem getLguiItem();
-
-	/**
-	 * Getting the involved LMLManager.
-	 * @return the involved LMLManager
-	 */
-	public ILMLManager getLMLManager();
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/ILguiAddedEvent.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/ILguiAddedEvent.java
deleted file mode 100644
index de5f262..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/ILguiAddedEvent.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.core.events;
-
-import org.eclipse.ptp.rm.lml.core.ILMLManager;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-
-/**
- * Interface to manage the event that a LguiItem has been added.
- * @author Claudia Knobloch
- */
-public interface ILguiAddedEvent {
-	
-	/**
-	 * Getting the involved IlguiItem.
-	 * @return the involved ILguiItem
-	 */
-	public ILguiItem getLguiItem();
-	/**
-	 * Getting the involved LMLManager.
-	 * @return the involved LMLManager
-	 */
-	public ILMLManager getLMLManager();
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/ILguiRemovedEvent.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/ILguiRemovedEvent.java
deleted file mode 100644
index 539251d..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/ILguiRemovedEvent.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-
-package org.eclipse.ptp.rm.lml.core.events;
-
-import org.eclipse.ptp.rm.lml.core.ILMLManager;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-
-/**
- * Interface to manage the event that an LguiItem has been removed.
- * @author Claudia Knobloch
- */
-public interface ILguiRemovedEvent {
-	
-	/**
-	 * Getting the involved IlguiItem.
-	 * @return the involved ILguiItem
-	 */
-	public ILguiItem getLguiItem();
-
-	/**
-	 * Getting the involved LMLManager.
-	 * @return the involved LMLManager
-	 */
-	public ILMLManager getLMLManager();
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/ILguiSelectedEvent.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/ILguiSelectedEvent.java
deleted file mode 100644
index df0e2ea..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/ILguiSelectedEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.core.events;
-
-import org.eclipse.ptp.rm.lml.core.ILMLManager;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-
-/**
- * Interface to manage the event that an LguiItem has been selected.
- * @author Claudia Knobloch
- */
-public interface ILguiSelectedEvent {
-
-	/**
-	 * Getting the involved IlguiItem.
-	 * @return the involved ILguiItem
-	 */
-	public ILguiItem getLguiItem();
-
-	/**
-	 * Getting the involved LMLManager.
-	 * @return the involved LMLManager
-	 */
-	public ILMLManager getLMLManager();
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/ILguiUpdatedEvent.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/ILguiUpdatedEvent.java
deleted file mode 100644
index 12dcf32..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/events/ILguiUpdatedEvent.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.core.events;
-
-import org.eclipse.ptp.rm.lml.internal.core.model.LguiItem;
-
-/**
- * Interface to manage the event that an LguiItem has been updated.
- * @author Claudia Knobloch
- */
-public interface ILguiUpdatedEvent {
-	/**
-	 * Getting the involved IlguiItem.
-	 * @return the involved ILguiItem
-	 */
-	public LguiItem getLguiItem();
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/listeners/ILMLListener.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/listeners/ILMLListener.java
deleted file mode 100644
index dc6a7dd..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/listeners/ILMLListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Based on the class IResourceManagerListener 
- * 		 in package org.eclipse.ptp.core.listeners
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- */
-
-package org.eclipse.ptp.rm.lml.core.listeners;
-
-import org.eclipse.ptp.rm.lml.core.events.IJobListSortedEvent;
-
-/**
- * This interface manages the handling of different events.
- * @author Claudia Knobloch
- */
-public interface ILMLListener {
-	
-	/**
-	 * Handles an IJobListSortedEevnt.
-	 * @param e an IJobListSortedEvent
-	 */
-	public void handleEvent(IJobListSortedEvent e);
-	
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/listeners/ILguiListener.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/listeners/ILguiListener.java
deleted file mode 100644
index aba93c2..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/listeners/ILguiListener.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Based on the class IResourceManagerListener 
- * 		 in package org.eclipse.ptp.core.listeners
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- */
-
-package org.eclipse.ptp.rm.lml.core.listeners;
-
-import org.eclipse.ptp.rm.lml.core.events.ILguiUpdatedEvent;
-
-/**
- * This interface manages the handling of different events.
- * @author Claudia Knobloch
- */
-public interface ILguiListener extends IListener {
-	
-	public void handleEvent(ILguiUpdatedEvent e);
-
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/listeners/IListener.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/listeners/IListener.java
deleted file mode 100644
index 876f707..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/listeners/IListener.java
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-package org.eclipse.ptp.rm.lml.core.listeners;
-
-public interface IListener {
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/listeners/IViewListener.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/listeners/IViewListener.java
deleted file mode 100644
index de31219..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/listeners/IViewListener.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * Based on the class IResourceManagerListener 
- * 		 in package org.eclipse.ptp.core.listeners
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- */
-
-package org.eclipse.ptp.rm.lml.core.listeners;
-
-import org.eclipse.ptp.rm.lml.core.events.ILguiAddedEvent;
-import org.eclipse.ptp.rm.lml.core.events.ILguiRemovedEvent;
-import org.eclipse.ptp.rm.lml.core.events.ILguiSelectedEvent;
-
-/**
- * This interface manages the handling of different events.
- * @author Claudia Knobloch
- */
-public interface IViewListener extends IListener{
-
-	/**
-	 * Handles an ILguiAddedEvent.
-	 * @param e an ILguiAddedEvent
-	 */
-	public void handleEvent(ILguiAddedEvent e);
-	
-	/**
-	 * Handles an IlguiRemovedEvent.
-	 * @param e an ILguiRemovedEvent
-	 */
-	public void handleEvent(ILguiRemovedEvent e);
-	
-
-	/**
-	 * Handles an ILguiSelectedEvent.
-	 * @param e an ILguiSelectedEvent 
-	 */
-	public void handleEvent(ILguiSelectedEvent e);
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/messages/Messages.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/messages/Messages.java
deleted file mode 100644
index 4f57b4d..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/messages/Messages.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-package org.eclipse.ptp.rm.lml.core.messages;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rm.lml.core.messages.messages"; //$NON-NLS-1$
-
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	public static String LMLCorePlugin_0;
-
-	private Messages() {
-		// Prevent instances.
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/messages/messages.properties b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/messages/messages.properties
deleted file mode 100644
index fde6a5c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/messages/messages.properties
+++ /dev/null
@@ -1 +0,0 @@
-LMLCorePlugin_0=Internal Error
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/model/ILguiHandler.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/model/ILguiHandler.java
deleted file mode 100644
index 7208117..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/model/ILguiHandler.java
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-package org.eclipse.ptp.rm.lml.core.model;
-
-public interface ILguiHandler {
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/model/ILguiItem.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/model/ILguiItem.java
deleted file mode 100644
index 901603a..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/model/ILguiItem.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, Carsten Karbach, FZ Juelich
- */
-package org.eclipse.ptp.rm.lml.core.model;
-
-import java.net.URL;
-
-import org.eclipse.ptp.rm.lml.core.listeners.ILguiListener;
-import org.eclipse.ptp.rm.lml.internal.core.model.LayoutAccess;
-import org.eclipse.ptp.rm.lml.internal.core.model.NodedisplayAccess;
-import org.eclipse.ptp.rm.lml.internal.core.model.OIDToInformation;
-import org.eclipse.ptp.rm.lml.internal.core.model.OIDToObject;
-import org.eclipse.ptp.rm.lml.internal.core.model.ObjectStatus;
-import org.eclipse.ptp.rm.lml.internal.core.model.OverviewAccess;
-import org.eclipse.ptp.rm.lml.internal.core.model.TableHandler;
-
-
-/**
- * Interface to manage the handling of an LguiType. It helps to work with LguiType without knowing the exact build of LguiType. 
- * @author Claudia Knobloch
- */
-public interface ILguiItem  {
-	
-	/**
-	 * Getting the source of the XML file from whcih the corresponding LguiType has been generated. 
-	 * @return the source of the XML file
-	 */
-	public URL getXmlFile();
-	
-	/**
-	 * Getting a string representing the ILguiItem.
-	 * @return string 
-	 */
-	public String toString();
-	
-	/**
-	 * Getting the version of the LguiType:
-	 * @return version of the LguiType
-	 */
-	public String getVersion();
-	
-	/**
-	 * Checking if any layout is present.
-	 * @return 
-	 */
-	public boolean isLayout();
-	
-	public TableHandler getTableHandler();
-	
-	public OverviewAccess getOverviewAccess();
-	
-	public  void addListener(ILguiListener listener);
-	
-	public OIDToObject getOIDToObject();
-	
-	public ObjectStatus getObjectStatus();
-	
-	public OIDToInformation getOIDToInformation();
-	
-	public NodedisplayAccess getNodedisplayAccess();
-	
-	public LayoutAccess getLayoutAccess();
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/model/ITableColumnLayout.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/model/ITableColumnLayout.java
deleted file mode 100644
index 033dbb0..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/model/ITableColumnLayout.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-package org.eclipse.ptp.rm.lml.core.model;
-
-/**
- * This interface presents the layout of one column of a table,
- */
-public interface ITableColumnLayout {
-	
-	/**
-	 * Getting the title of the column. 
-	 * @return title of the column
-	 */
-	public String getTitle();
-	
-	/**
-	 * Getting the width of the column.
-	 * @return width of the table
-	 */
-	public int getWidth();
-	
-	/**
-	 * Getting the style (LEFT or RIGHT) of the column.
-	 * @return style of the column
-	 */
-	public String getStyle();
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/util/DebugUtil.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/util/DebugUtil.java
deleted file mode 100644
index 02d1ccb..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/core/util/DebugUtil.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - Initial API and implementation
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.core.util;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ptp.rm.lml.core.LMLCorePlugin;
-
-public class DebugUtil {
-	private static final String PROTOCOL_TRACING_OPTION = "org.eclipse.ptp.core/debug/proxy/protocol/tracing"; //$NON-NLS-1$
-	private static final String PROXY_CLIENT_TRACING_OPTION = "org.eclipse.ptp.core/debug/proxy/client/tracing"; //$NON-NLS-1$
-	private static final String PROXY_SERVER_DEBUG_LEVEL_OPTION = "org.eclipse.ptp.core/debug/proxy/server/debug_level"; //$NON-NLS-1$
-	private static final String RM_TRACING_OPTION = "org.eclipse.ptp.core/debug/rm/tracing"; //$NON-NLS-1$
-
-	public static boolean PROTOCOL_TRACING = false;
-	public static boolean PROXY_CLIENT_TRACING = false;
-	public static int PROXY_SERVER_DEBUG_LEVEL = 0;
-	public static boolean RM_TRACING = false;;
-
-	public static void configurePluginDebugOptions() {
-		if (LMLCorePlugin.getDefault().isDebugging()) {
-			String option = Platform.getDebugOption(PROTOCOL_TRACING_OPTION);
-			if (option != null) {
-				PROTOCOL_TRACING = option.equalsIgnoreCase("true"); //$NON-NLS-1$
-			}
-			option = Platform.getDebugOption(PROXY_CLIENT_TRACING_OPTION);
-			if (option != null) {
-				PROXY_CLIENT_TRACING = option.equalsIgnoreCase("true"); //$NON-NLS-1$
-			}
-			option = Platform.getDebugOption(PROXY_SERVER_DEBUG_LEVEL_OPTION);
-			if (option != null) {
-				try {
-					PROXY_SERVER_DEBUG_LEVEL = Integer.parseInt(option);
-				} catch (NumberFormatException e) {
-					PROXY_SERVER_DEBUG_LEVEL = 0;
-				}
-			}
-			option = Platform.getDebugOption(RM_TRACING_OPTION);
-			if (option != null) {
-				RM_TRACING = option.equalsIgnoreCase("true"); //$NON-NLS-1$
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/LMLManager.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/LMLManager.java
deleted file mode 100644
index 69a815b..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/LMLManager.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-package org.eclipse.ptp.rm.lml.internal.core;
-
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.ptp.rm.lml.core.ILMLManager;
-import org.eclipse.ptp.rm.lml.core.events.IJobListSortedEvent;
-import org.eclipse.ptp.rm.lml.core.events.ILguiAddedEvent;
-import org.eclipse.ptp.rm.lml.core.events.ILguiSelectedEvent;
-import org.eclipse.ptp.rm.lml.core.listeners.ILMLListener;
-import org.eclipse.ptp.rm.lml.core.listeners.IListener;
-import org.eclipse.ptp.rm.lml.core.listeners.IViewListener;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.internal.core.events.JobListSortedEvent;
-import org.eclipse.ptp.rm.lml.internal.core.events.LguiAddedEvent;
-import org.eclipse.ptp.rm.lml.internal.core.events.LguiSelectedEvent;
-import org.eclipse.ptp.rm.lml.internal.core.model.LguiItem;
-
-/**
- * Class of the interface ILMLManager
- */
-public class LMLManager implements ILMLManager{
-	
-	/*
-	 * Map of all ILguioItems 
-	 */
-	protected final Map<String, ILguiItem> LGUIS = new HashMap<String, ILguiItem>();
-	
-	/*
-	 * The current considered ILguiItem
-	 */
-	private ILguiItem fSelectedLguiItem = null;
-	
-	/*
-	 * A list of all listeners on the ILguiItem
-	 */
-	private ListenerList lmlListeners = new ListenerList();
-	
-	private ListenerList viewListeners = new ListenerList();
-	
-	private final Map<String, IListener> listeners = new HashMap<String, IListener>();
-
-	public void addListener(IViewListener listener) {
-		viewListeners.add(listener);
-		listeners.put("ViewManager", listener);
-	}
-	
-	public void addListener(IViewListener listener, String view) {
-		viewListeners.add(listener);
-		listeners.put(view,listener);
-	}
-	
-	public void addListener(ILMLListener listener, String view) {
-		lmlListeners.add(listener);
-//		listeners.put(view, (IListener) listener);
-	}
-	
-	public IListener getListener(String view) {
-		return listeners.get(view);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.ILMLManager#addLgui(URL xmlFile)
-	 */
-	public boolean addLgui(URL xmlFile) {
-		if (!LGUIS.containsKey(xmlFile.getPath())) {
-			fSelectedLguiItem = new LguiItem(xmlFile);
-			synchronized (LGUIS){
-				LGUIS.put(xmlFile.getPath(), fSelectedLguiItem);
-			}
-			fireNewLgui();
-			return false;
-		} else {
-			return true;
-		}	
-	}
-	
-	public String[] getLguis() {
-		Set<String> lguis = LGUIS.keySet();
-		return lguis.toArray(new String[lguis.size()]);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.ILMLManager#sortLgui
-	 */
-	public void sortLgui() {
-		fireSortedLgui();
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.ILMLManager#getSelectedLguiItem()
-	 */
-	public ILguiItem getSelectedLguiItem() {
-		return fSelectedLguiItem;
-	}
-	
-	/**
-	 * Method is called when a new ILguiItem was generated.
-	 */
-	private void fireNewLgui() {
-		ILguiAddedEvent event = new LguiAddedEvent(this, fSelectedLguiItem);
-		for (Object listener : viewListeners.getListeners()) {
-			((IViewListener) listener).handleEvent(event);
-		}
-	}
-	
-	/**
-	 * Method is called when an ILguiItem was sorted.
-	 */
-	private void fireSortedLgui() {
-		IJobListSortedEvent event = new JobListSortedEvent(this, fSelectedLguiItem);
-		for (Object listener : lmlListeners.getListeners()) {
-			((ILMLListener) listener).handleEvent(event);
-		}
-	}
-	
-	private void fireSelectedLgui() {
-		ILguiSelectedEvent event = new LguiSelectedEvent(this, fSelectedLguiItem);
-		for (Object listener : viewListeners.getListeners()) {
-			((IViewListener) listener).handleEvent(event);
-		}
-	}
-
-	private String getSelectedLguiTitle(int index) {
-		String[] lguis = LGUIS.keySet().toArray(new String[LGUIS.size()]);
-		return lguis[index];
-	}
-	
-	public void selectLgui(int index) {
-		fSelectedLguiItem = LGUIS.get(getSelectedLguiTitle(index));
-		fireSelectedLgui();
-	}
-	
-	public void selectLgui(URL xmlFile) {
-		fSelectedLguiItem = LGUIS.get(xmlFile.getPath());
-		fireSelectedLgui();
-	}
-
-	public int getSelectedLguiIndex(String title) {
-		String[] lguis = LGUIS.keySet().toArray(new String[LGUIS.size()]);
-		int index = 0;
-		for (int i = 0; i < lguis.length; i++) {
-			if (title.equals(lguis[i])) {
-				index = i;
-			}
-		}
-		return index;
-	}
-
-	public void removeLgui(String title) {
-		LGUIS.remove(title);
-		if (LGUIS.isEmpty()) {
-			fSelectedLguiItem = null;
-		} else {
-			fSelectedLguiItem = LGUIS.get(getLguis()[0]);
-		}
-		fireSelectedLgui();
-	}
-
-	public void removeListener(ILMLListener listener) {
-		lmlListeners.remove(listener);
-	}
-	
-	public void removeListener(IViewListener listener) {
-		viewListeners.remove(listener);
-		listeners.remove("ViewManager");
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AbslayoutType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AbslayoutType.java
deleted file mode 100644
index 6a563a2..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AbslayoutType.java
+++ /dev/null
@@ -1,86 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			Describes a layout with absolute coordinates. Every
- *     			component must be added by a comp-tag.
- *     		
- * 
- * <p>Java class for abslayout_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="abslayout_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}layout_type">
- *       &lt;sequence>
- *         &lt;element name="comp" type="{http://www.llview.de}component_type" maxOccurs="unbounded"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "abslayout_type", propOrder = {
-    "comp"
-})
-public class AbslayoutType
-    extends LayoutType
- implements Serializable {
-
-    @XmlElement(required = true)
-    protected List<ComponentType> comp;
-
-    /**
-     * Gets the value of the comp property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the comp property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getComp().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link ComponentType }
-     * 
-     * 
-     */
-    public List<ComponentType> getComp() {
-        if (comp == null) {
-            comp = new ArrayList<ComponentType>();
-        }
-        return this.comp;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AlignType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AlignType.java
deleted file mode 100644
index 7a1a19d..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AlignType.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for align_type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * <p>
- * <pre>
- * &lt;simpleType name="align_type">
- *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
- *     &lt;enumeration value="WEST"/>
- *     &lt;enumeration value="EAST"/>
- *     &lt;enumeration value="NORTH"/>
- *     &lt;enumeration value="SOUTH"/>
- *     &lt;enumeration value="CENTER"/>
- *   &lt;/restriction>
- * &lt;/simpleType>
- * </pre>
- * 
- */
-@XmlType(name = "align_type")
-@XmlEnum
-public enum AlignType {
-
-    WEST,
-    EAST,
-    NORTH,
-    SOUTH,
-    CENTER;
-
-    public String value() {
-        return name();
-    }
-
-    public static AlignType fromValue(String v) {
-        return valueOf(v);
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AxesType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AxesType.java
deleted file mode 100644
index 163b031..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AxesType.java
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Combines one x-axis-element and one y-axis-element.
- * 
- * <p>Java class for axes_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="axes_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="x" type="{http://www.llview.de}axis_type"/>
- *         &lt;element name="y" type="{http://www.llview.de}axis_type"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "axes_type", propOrder = {
-    "x",
-    "y"
-})
-public class AxesType  implements Serializable {
-
-    @XmlElement(required = true)
-    protected AxisType x;
-    @XmlElement(required = true)
-    protected AxisType y;
-
-    /**
-     * Gets the value of the x property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link AxisType }
-     *     
-     */
-    public AxisType getX() {
-        return x;
-    }
-
-    /**
-     * Sets the value of the x property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link AxisType }
-     *     
-     */
-    public void setX(AxisType value) {
-        this.x = value;
-    }
-
-    /**
-     * Gets the value of the y property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link AxisType }
-     *     
-     */
-    public AxisType getY() {
-        return y;
-    }
-
-    /**
-     * Sets the value of the y property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link AxisType }
-     *     
-     */
-    public void setY(AxisType value) {
-        this.y = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AxisType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AxisType.java
deleted file mode 100644
index 476bf81..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AxisType.java
+++ /dev/null
@@ -1,257 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.math.BigInteger;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Type for either x- or y-axis. Contains important data of these objects.
- * 
- * <p>Java class for axis_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="axis_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="ticlabels" type="{http://www.llview.de}ticlabels_type" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="type" type="{http://www.llview.de}axis_type_constants" default="linear" />
- *       &lt;attribute name="unit" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="label" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="shortlabel" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="min" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
- *       &lt;attribute name="max" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
- *       &lt;attribute name="ticcount" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" default="10" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "axis_type", propOrder = {
-    "ticlabels"
-})
-public class AxisType  implements Serializable {
-
-    protected TiclabelsType ticlabels;
-    @XmlAttribute
-    protected AxisTypeConstants type;
-    @XmlAttribute
-    protected String unit;
-    @XmlAttribute
-    protected String label;
-    @XmlAttribute
-    protected String shortlabel;
-    @XmlAttribute(required = true)
-    protected double min;
-    @XmlAttribute(required = true)
-    protected double max;
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger ticcount;
-
-    /**
-     * Gets the value of the ticlabels property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link TiclabelsType }
-     *     
-     */
-    public TiclabelsType getTiclabels() {
-        return ticlabels;
-    }
-
-    /**
-     * Sets the value of the ticlabels property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link TiclabelsType }
-     *     
-     */
-    public void setTiclabels(TiclabelsType value) {
-        this.ticlabels = value;
-    }
-
-    /**
-     * Gets the value of the type property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link AxisTypeConstants }
-     *     
-     */
-    public AxisTypeConstants getType() {
-        if (type == null) {
-            return AxisTypeConstants.LINEAR;
-        } else {
-            return type;
-        }
-    }
-
-    /**
-     * Sets the value of the type property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link AxisTypeConstants }
-     *     
-     */
-    public void setType(AxisTypeConstants value) {
-        this.type = value;
-    }
-
-    /**
-     * Gets the value of the unit property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getUnit() {
-        return unit;
-    }
-
-    /**
-     * Sets the value of the unit property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setUnit(String value) {
-        this.unit = value;
-    }
-
-    /**
-     * Gets the value of the label property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getLabel() {
-        return label;
-    }
-
-    /**
-     * Sets the value of the label property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setLabel(String value) {
-        this.label = value;
-    }
-
-    /**
-     * Gets the value of the shortlabel property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getShortlabel() {
-        return shortlabel;
-    }
-
-    /**
-     * Sets the value of the shortlabel property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setShortlabel(String value) {
-        this.shortlabel = value;
-    }
-
-    /**
-     * Gets the value of the min property.
-     * 
-     */
-    public double getMin() {
-        return min;
-    }
-
-    /**
-     * Sets the value of the min property.
-     * 
-     */
-    public void setMin(double value) {
-        this.min = value;
-    }
-
-    /**
-     * Gets the value of the max property.
-     * 
-     */
-    public double getMax() {
-        return max;
-    }
-
-    /**
-     * Sets the value of the max property.
-     * 
-     */
-    public void setMax(double value) {
-        this.max = value;
-    }
-
-    /**
-     * Gets the value of the ticcount property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getTiccount() {
-        if (ticcount == null) {
-            return new BigInteger("10");
-        } else {
-            return ticcount;
-        }
-    }
-
-    /**
-     * Sets the value of the ticcount property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setTiccount(BigInteger value) {
-        this.ticcount = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AxisTypeConstants.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AxisTypeConstants.java
deleted file mode 100644
index 80615b1..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/AxisTypeConstants.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for axis_type_constants.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * <p>
- * <pre>
- * &lt;simpleType name="axis_type_constants">
- *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
- *     &lt;enumeration value="linear"/>
- *     &lt;enumeration value="log"/>
- *   &lt;/restriction>
- * &lt;/simpleType>
- * </pre>
- * 
- */
-@XmlType(name = "axis_type_constants")
-@XmlEnum
-public enum AxisTypeConstants {
-
-    @XmlEnumValue("linear")
-    LINEAR("linear"),
-    @XmlEnumValue("log")
-    LOG("log");
-    private final String value;
-
-    AxisTypeConstants(String v) {
-        value = v;
-    }
-
-    public String value() {
-        return value;
-    }
-
-    public static AxisTypeConstants fromValue(String v) {
-        for (AxisTypeConstants c: AxisTypeConstants.values()) {
-            if (c.value.equals(v)) {
-                return c;
-            }
-        }
-        throw new IllegalArgumentException(v);
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/CellType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/CellType.java
deleted file mode 100644
index 9ea56c8..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/CellType.java
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.math.BigInteger;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Can be linked to column by using foreign key cid to cid-attribute of column-tag.
- * Otherwise order of cells define connections to columns.
- * 
- * <p>Java class for cell_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="cell_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="cid" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />
- *       &lt;attribute name="value" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "cell_type")
-public class CellType  implements Serializable {
-
-    @XmlAttribute
-    @XmlSchemaType(name = "positiveInteger")
-    protected BigInteger cid;
-    @XmlAttribute
-    protected String value;
-
-    /**
-     * Gets the value of the cid property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getCid() {
-        return cid;
-    }
-
-    /**
-     * Sets the value of the cid property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setCid(BigInteger value) {
-        this.cid = value;
-    }
-
-    /**
-     * Gets the value of the value property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getValue() {
-        return value;
-    }
-
-    /**
-     * Sets the value of the value property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ChartType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ChartType.java
deleted file mode 100644
index c2f8f20..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ChartType.java
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			Collects data of a chart describing a histogram or other
- *     			diagrams.
- *     		
- * 
- * <p>Java class for chart_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="chart_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}gobject_type">
- *       &lt;sequence>
- *         &lt;element name="axes" type="{http://www.llview.de}axes_type" minOccurs="0"/>
- *         &lt;element name="data" type="{http://www.llview.de}datacollection_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "chart_type", propOrder = {
-    "axes",
-    "data"
-})
-public class ChartType
-    extends GobjectType
- implements Serializable {
-
-    protected AxesType axes;
-    protected List<DatacollectionType> data;
-
-    /**
-     * Gets the value of the axes property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link AxesType }
-     *     
-     */
-    public AxesType getAxes() {
-        return axes;
-    }
-
-    /**
-     * Sets the value of the axes property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link AxesType }
-     *     
-     */
-    public void setAxes(AxesType value) {
-        this.axes = value;
-    }
-
-    /**
-     * Gets the value of the data property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the data property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getData().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link DatacollectionType }
-     * 
-     * 
-     */
-    public List<DatacollectionType> getData() {
-        if (data == null) {
-            data = new ArrayList<DatacollectionType>();
-        }
-        return this.data;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ChartgroupType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ChartgroupType.java
deleted file mode 100644
index e594a83..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ChartgroupType.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * A group of charts. Could be displayed as overlay-diagrams.
- * 
- * <p>Java class for chartgroup_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="chartgroup_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}gobject_type">
- *       &lt;sequence>
- *         &lt;element name="chart" type="{http://www.llview.de}chart_type" maxOccurs="unbounded"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "chartgroup_type", propOrder = {
-    "chart"
-})
-public class ChartgroupType
-    extends GobjectType
- implements Serializable {
-
-    @XmlElement(required = true)
-    protected List<ChartType> chart;
-
-    /**
-     * Gets the value of the chart property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the chart property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getChart().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link ChartType }
-     * 
-     * 
-     */
-    public List<ChartType> getChart() {
-        if (chart == null) {
-            chart = new ArrayList<ChartType>();
-        }
-        return this.chart;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ChartlayoutType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ChartlayoutType.java
deleted file mode 100644
index b9618c3..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ChartlayoutType.java
+++ /dev/null
@@ -1,298 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.math.BigInteger;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			Definition of layout-tag for charts
- *     		
- * 
- * <p>Java class for chartlayout_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="chartlayout_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}componentlayout_type">
- *       &lt;attribute name="border" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" default="0" />
- *       &lt;attribute name="showlegend" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *       &lt;attribute name="backgroundcolor" type="{http://www.llview.de}hexcolor_type" default="#FFF" />
- *       &lt;attribute name="innerbackgroundcolor" type="{http://www.llview.de}hexcolor_type" default="#AAA" />
- *       &lt;attribute name="axescolor" type="{http://www.llview.de}hexcolor_type" default="#555" />
- *       &lt;attribute name="bordercolor" type="{http://www.llview.de}hexcolor_type" default="#000" />
- *       &lt;attribute name="gridcolor" type="{http://www.llview.de}hexcolor_type" default="#555" />
- *       &lt;attribute name="cutpaint" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "chartlayout_type")
-public class ChartlayoutType
-    extends ComponentlayoutType
- implements Serializable {
-
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger border;
-    @XmlAttribute
-    protected Boolean showlegend;
-    @XmlAttribute
-    protected String backgroundcolor;
-    @XmlAttribute
-    protected String innerbackgroundcolor;
-    @XmlAttribute
-    protected String axescolor;
-    @XmlAttribute
-    protected String bordercolor;
-    @XmlAttribute
-    protected String gridcolor;
-    @XmlAttribute
-    protected Boolean cutpaint;
-
-    /**
-     * Gets the value of the border property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getBorder() {
-        if (border == null) {
-            return new BigInteger("0");
-        } else {
-            return border;
-        }
-    }
-
-    /**
-     * Sets the value of the border property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setBorder(BigInteger value) {
-        this.border = value;
-    }
-
-    /**
-     * Gets the value of the showlegend property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Boolean }
-     *     
-     */
-    public boolean isShowlegend() {
-        if (showlegend == null) {
-            return true;
-        } else {
-            return showlegend;
-        }
-    }
-
-    /**
-     * Sets the value of the showlegend property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Boolean }
-     *     
-     */
-    public void setShowlegend(Boolean value) {
-        this.showlegend = value;
-    }
-
-    /**
-     * Gets the value of the backgroundcolor property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getBackgroundcolor() {
-        if (backgroundcolor == null) {
-            return "#FFF";
-        } else {
-            return backgroundcolor;
-        }
-    }
-
-    /**
-     * Sets the value of the backgroundcolor property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setBackgroundcolor(String value) {
-        this.backgroundcolor = value;
-    }
-
-    /**
-     * Gets the value of the innerbackgroundcolor property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getInnerbackgroundcolor() {
-        if (innerbackgroundcolor == null) {
-            return "#AAA";
-        } else {
-            return innerbackgroundcolor;
-        }
-    }
-
-    /**
-     * Sets the value of the innerbackgroundcolor property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setInnerbackgroundcolor(String value) {
-        this.innerbackgroundcolor = value;
-    }
-
-    /**
-     * Gets the value of the axescolor property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getAxescolor() {
-        if (axescolor == null) {
-            return "#555";
-        } else {
-            return axescolor;
-        }
-    }
-
-    /**
-     * Sets the value of the axescolor property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setAxescolor(String value) {
-        this.axescolor = value;
-    }
-
-    /**
-     * Gets the value of the bordercolor property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getBordercolor() {
-        if (bordercolor == null) {
-            return "#000";
-        } else {
-            return bordercolor;
-        }
-    }
-
-    /**
-     * Sets the value of the bordercolor property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setBordercolor(String value) {
-        this.bordercolor = value;
-    }
-
-    /**
-     * Gets the value of the gridcolor property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getGridcolor() {
-        if (gridcolor == null) {
-            return "#555";
-        } else {
-            return gridcolor;
-        }
-    }
-
-    /**
-     * Sets the value of the gridcolor property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setGridcolor(String value) {
-        this.gridcolor = value;
-    }
-
-    /**
-     * Gets the value of the cutpaint property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Boolean }
-     *     
-     */
-    public boolean isCutpaint() {
-        if (cutpaint == null) {
-            return true;
-        } else {
-            return cutpaint;
-        }
-    }
-
-    /**
-     * Sets the value of the cutpaint property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Boolean }
-     *     
-     */
-    public void setCutpaint(Boolean value) {
-        this.cutpaint = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ColorconstantType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ColorconstantType.java
deleted file mode 100644
index 6bb2e13..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ColorconstantType.java
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-
-/**
- * Definition of a color name. Connects a name like "red" width a html-like color like "#F00"
- * 
- * <p>Java class for colorconstant_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="colorconstant_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}NCName" />
- *       &lt;attribute name="color" use="required" type="{http://www.llview.de}hexcolor_type" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "colorconstant_type")
-public class ColorconstantType  implements Serializable {
-
-    @XmlAttribute(required = true)
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String name;
-    @XmlAttribute(required = true)
-    protected String color;
-
-    /**
-     * Gets the value of the name property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Sets the value of the name property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setName(String value) {
-        this.name = value;
-    }
-
-    /**
-     * Gets the value of the color property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getColor() {
-        return color;
-    }
-
-    /**
-     * Sets the value of the color property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setColor(String value) {
-        this.color = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ColordefinitionType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ColordefinitionType.java
deleted file mode 100644
index 6554dc1..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ColordefinitionType.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Collects a list of colorconstants.
- * 
- * <p>Java class for colordefinition_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="colordefinition_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="colorname" type="{http://www.llview.de}colorconstant_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "colordefinition_type", propOrder = {
-    "colorname"
-})
-public class ColordefinitionType  implements Serializable {
-
-    @XmlElement(namespace = "http://www.llview.de")
-    protected List<ColorconstantType> colorname;
-
-    /**
-     * Gets the value of the colorname property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the colorname property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getColorname().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link ColorconstantType }
-     * 
-     * 
-     */
-    public List<ColorconstantType> getColorname() {
-        if (colorname == null) {
-            colorname = new ArrayList<ColorconstantType>();
-        }
-        return this.colorname;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ColumnType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ColumnType.java
deleted file mode 100644
index 5be3b9f..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ColumnType.java
+++ /dev/null
@@ -1,159 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.math.BigInteger;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-
-/**
- * Describes one column of table.
- * 
- * <p>Java class for column_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="column_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}NCName" />
- *       &lt;attribute name="sort" type="{http://www.llview.de}sorting_type" />
- *       &lt;attribute name="description" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "column_type")
-public class ColumnType  implements Serializable {
-
-    @XmlAttribute(required = true)
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String name;
-    @XmlAttribute
-    protected SortingType sort;
-    @XmlAttribute
-    protected String description;
-    @XmlAttribute(required = true)
-    @XmlSchemaType(name = "positiveInteger")
-    protected BigInteger id;
-
-    /**
-     * Gets the value of the name property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Sets the value of the name property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setName(String value) {
-        this.name = value;
-    }
-
-    /**
-     * Gets the value of the sort property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link SortingType }
-     *     
-     */
-    public SortingType getSort() {
-        return sort;
-    }
-
-    /**
-     * Sets the value of the sort property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link SortingType }
-     *     
-     */
-    public void setSort(SortingType value) {
-        this.sort = value;
-    }
-
-    /**
-     * Gets the value of the description property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    /**
-     * Sets the value of the description property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setDescription(String value) {
-        this.description = value;
-    }
-
-    /**
-     * Gets the value of the id property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getId() {
-        return id;
-    }
-
-    /**
-     * Sets the value of the id property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setId(BigInteger value) {
-        this.id = value;
-    }
-
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ColumnlayoutType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ColumnlayoutType.java
deleted file mode 100644
index b3d5143..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ColumnlayoutType.java
+++ /dev/null
@@ -1,228 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.math.BigInteger;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			Layout-definitions for exactly one column of a table.
- *     			Defines where to position the column, width and if this
- *     			column is sorted
- *     		
- * 
- * <p>Java class for columnlayout_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="columnlayout_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="cid" use="required" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />
- *       &lt;attribute name="pos" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" />
- *       &lt;attribute name="width">
- *         &lt;simpleType>
- *           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}double">
- *             &lt;minInclusive value="0"/>
- *             &lt;maxInclusive value="1"/>
- *           &lt;/restriction>
- *         &lt;/simpleType>
- *       &lt;/attribute>
- *       &lt;attribute name="sorted" type="{http://www.llview.de}columnsortedtype" default="false" />
- *       &lt;attribute name="active" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *       &lt;attribute name="key" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "columnlayout_type")
-public class ColumnlayoutType  implements Serializable {
-
-    @XmlAttribute(required = true)
-    @XmlSchemaType(name = "positiveInteger")
-    protected BigInteger cid;
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger pos;
-    @XmlAttribute
-    protected Double width;
-    @XmlAttribute
-    protected Columnsortedtype sorted;
-    @XmlAttribute
-    protected Boolean active;
-    @XmlAttribute
-    protected String key;
-
-    /**
-     * Gets the value of the cid property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getCid() {
-        return cid;
-    }
-
-    /**
-     * Sets the value of the cid property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setCid(BigInteger value) {
-        this.cid = value;
-    }
-
-    /**
-     * Gets the value of the pos property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getPos() {
-        return pos;
-    }
-
-    /**
-     * Sets the value of the pos property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setPos(BigInteger value) {
-        this.pos = value;
-    }
-
-    /**
-     * Gets the value of the width property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Double }
-     *     
-     */
-    public Double getWidth() {
-        return width;
-    }
-
-    /**
-     * Sets the value of the width property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Double }
-     *     
-     */
-    public void setWidth(Double value) {
-        this.width = value;
-    }
-
-    /**
-     * Gets the value of the sorted property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Columnsortedtype }
-     *     
-     */
-    public Columnsortedtype getSorted() {
-        if (sorted == null) {
-            return Columnsortedtype.FALSE;
-        } else {
-            return sorted;
-        }
-    }
-
-    /**
-     * Sets the value of the sorted property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Columnsortedtype }
-     *     
-     */
-    public void setSorted(Columnsortedtype value) {
-        this.sorted = value;
-    }
-
-    /**
-     * Gets the value of the active property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Boolean }
-     *     
-     */
-    public boolean isActive() {
-        if (active == null) {
-            return true;
-        } else {
-            return active;
-        }
-    }
-
-    /**
-     * Sets the value of the active property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Boolean }
-     *     
-     */
-    public void setActive(Boolean value) {
-        this.active = value;
-    }
-
-    /**
-     * Gets the value of the key property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getKey() {
-        return key;
-    }
-
-    /**
-     * Sets the value of the key property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setKey(String value) {
-        this.key = value;
-    }
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Columnsortedtype.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Columnsortedtype.java
deleted file mode 100644
index 8e15977..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Columnsortedtype.java
+++ /dev/null
@@ -1,61 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for columnsortedtype.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * <p>
- * <pre>
- * &lt;simpleType name="columnsortedtype">
- *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
- *     &lt;enumeration value="asc"/>
- *     &lt;enumeration value="desc"/>
- *     &lt;enumeration value="false"/>
- *   &lt;/restriction>
- * &lt;/simpleType>
- * </pre>
- * 
- */
-@XmlType(name = "columnsortedtype")
-@XmlEnum
-public enum Columnsortedtype {
-
-    @XmlEnumValue("asc")
-    ASC("asc"),
-    @XmlEnumValue("desc")
-    DESC("desc"),
-    @XmlEnumValue("false")
-    FALSE("false");
-    private final String value;
-
-    Columnsortedtype(String v) {
-        value = v;
-    }
-
-    public String value() {
-        return value;
-    }
-
-    public static Columnsortedtype fromValue(String v) {
-        for (Columnsortedtype c: Columnsortedtype.values()) {
-            if (c.value.equals(v)) {
-                return c;
-            }
-        }
-        throw new IllegalArgumentException(v);
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ComponentType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ComponentType.java
deleted file mode 100644
index 4d7c42a..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ComponentType.java
+++ /dev/null
@@ -1,190 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.math.BigInteger;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Describes the absolute position of one graphical object
- * 
- * <p>Java class for component_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="component_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="gid" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="x" use="required" type="{http://www.w3.org/2001/XMLSchema}integer" />
- *       &lt;attribute name="y" use="required" type="{http://www.w3.org/2001/XMLSchema}integer" />
- *       &lt;attribute name="w" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" default="100" />
- *       &lt;attribute name="h" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" default="100" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "component_type")
-public class ComponentType  implements Serializable {
-
-    @XmlAttribute(required = true)
-    protected String gid;
-    @XmlAttribute(required = true)
-    protected BigInteger x;
-    @XmlAttribute(required = true)
-    protected BigInteger y;
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger w;
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger h;
-
-    /**
-     * Gets the value of the gid property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getGid() {
-        return gid;
-    }
-
-    /**
-     * Sets the value of the gid property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setGid(String value) {
-        this.gid = value;
-    }
-
-    /**
-     * Gets the value of the x property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getX() {
-        return x;
-    }
-
-    /**
-     * Sets the value of the x property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setX(BigInteger value) {
-        this.x = value;
-    }
-
-    /**
-     * Gets the value of the y property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getY() {
-        return y;
-    }
-
-    /**
-     * Sets the value of the y property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setY(BigInteger value) {
-        this.y = value;
-    }
-
-    /**
-     * Gets the value of the w property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getW() {
-        if (w == null) {
-            return new BigInteger("100");
-        } else {
-            return w;
-        }
-    }
-
-    /**
-     * Sets the value of the w property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setW(BigInteger value) {
-        this.w = value;
-    }
-
-    /**
-     * Gets the value of the h property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getH() {
-        if (h == null) {
-            return new BigInteger("100");
-        } else {
-            return h;
-        }
-    }
-
-    /**
-     * Sets the value of the h property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setH(BigInteger value) {
-        this.h = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ComponentlayoutType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ComponentlayoutType.java
deleted file mode 100644
index 36cde66..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ComponentlayoutType.java
+++ /dev/null
@@ -1,133 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.10 at 02:31:08 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-
-
-
-
-/**
- * <p>Java class for componentlayout_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="componentlayout_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="id" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="gid" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="active" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "componentlayout_type")
-@XmlSeeAlso({
-    ChartlayoutType.class,
-    UsagebarlayoutType.class,
-    InfoboxlayoutType.class,
-    NodedisplaylayoutType.class,
-    TablelayoutType.class
-})
-public class ComponentlayoutType {
-
-    @XmlAttribute
-    protected String id;
-    @XmlAttribute(required = true)
-    protected String gid;
-    @XmlAttribute
-    protected Boolean active;
-
-    /**
-     * Gets the value of the id property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * Sets the value of the id property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setId(String value) {
-        this.id = value;
-    }
-
-    /**
-     * Gets the value of the gid property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getGid() {
-        return gid;
-    }
-
-    /**
-     * Sets the value of the gid property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setGid(String value) {
-        this.gid = value;
-    }
-
-    /**
-     * Gets the value of the active property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Boolean }
-     *     
-     */
-    public boolean isActive() {
-        if (active == null) {
-            return true;
-        } else {
-            return active;
-        }
-    }
-
-    /**
-     * Sets the value of the active property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Boolean }
-     *     
-     */
-    public void setActive(Boolean value) {
-        this.active = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement.java
deleted file mode 100644
index 00e1d2c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement.java
+++ /dev/null
@@ -1,204 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-
-/**
- * 
- *     			Abstract base-type for el-tags in data-tag. Could be
- *     			used for special attributes, which only data-elements
- *     			are allowed to include.
- *     		
- * 
- * <p>Java class for data_element complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="data_element">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}element_type">
- *       &lt;attribute name="oid" type="{http://www.w3.org/2001/XMLSchema}NCName" />
- *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}NCName" />
- *       &lt;attribute name="description" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="status" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="refid" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "data_element")
-@XmlSeeAlso({
-    DataElement10 .class,
-    DataElement9 .class,
-    DataElement7 .class,
-    DataElement8 .class,
-    DataElement2 .class,
-    DataElement1 .class,
-    DataElement6 .class,
-    DataElement5 .class,
-    DataElement4 .class,
-    DataElement3 .class
-})
-public class DataElement
-    extends ElementType
- implements Serializable {
-
-    @XmlAttribute
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String oid;
-    @XmlAttribute
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String name;
-    @XmlAttribute
-    protected String description;
-    @XmlAttribute
-    protected String status;
-    @XmlAttribute
-    protected String refid;
-
-    /**
-     * Gets the value of the oid property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getOid() {
-        return oid;
-    }
-
-    /**
-     * Sets the value of the oid property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setOid(String value) {
-        this.oid = value;
-    }
-
-    /**
-     * Gets the value of the name property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Sets the value of the name property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setName(String value) {
-        this.name = value;
-    }
-
-    /**
-     * Gets the value of the description property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    /**
-     * Sets the value of the description property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setDescription(String value) {
-        this.description = value;
-    }
-
-    /**
-     * Gets the value of the status property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getStatus() {
-        return status;
-    }
-
-    /**
-     * Sets the value of the status property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setStatus(String value) {
-        this.status = value;
-    }
-
-    /**
-     * Gets the value of the refid property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getRefid() {
-        return refid;
-    }
-
-    /**
-     * Sets the value of the refid property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setRefid(String value) {
-        this.refid = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement1.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement1.java
deleted file mode 100644
index f708ba9..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement1.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for data_element1 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="data_element1">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}data_element">
- *       &lt;sequence>
- *         &lt;element name="el2" type="{http://www.llview.de}data_element2" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "data_element1", propOrder = {
-    "el2"
-})
-public class DataElement1
-    extends DataElement
- implements Serializable {
-
-    protected List<DataElement2> el2;
-
-    /**
-     * Gets the value of the el2 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el2 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl2().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link DataElement2 }
-     * 
-     * 
-     */
-    public List<DataElement2> getEl2() {
-        if (el2 == null) {
-            el2 = new ArrayList<DataElement2>();
-        }
-        return this.el2;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement10.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement10.java
deleted file mode 100644
index 0ed361c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement10.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for data_element10 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="data_element10">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}data_element">
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "data_element10")
-public class DataElement10
-    extends DataElement
- implements Serializable {
-
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement2.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement2.java
deleted file mode 100644
index a23ff40..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement2.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for data_element2 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="data_element2">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}data_element">
- *       &lt;sequence>
- *         &lt;element name="el3" type="{http://www.llview.de}data_element3" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "data_element2", propOrder = {
-    "el3"
-})
-public class DataElement2
-    extends DataElement
- implements Serializable {
-
-    protected List<DataElement3> el3;
-
-    /**
-     * Gets the value of the el3 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el3 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl3().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link DataElement3 }
-     * 
-     * 
-     */
-    public List<DataElement3> getEl3() {
-        if (el3 == null) {
-            el3 = new ArrayList<DataElement3>();
-        }
-        return this.el3;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement3.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement3.java
deleted file mode 100644
index 43dc521..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement3.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for data_element3 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="data_element3">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}data_element">
- *       &lt;sequence>
- *         &lt;element name="el4" type="{http://www.llview.de}data_element4" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "data_element3", propOrder = {
-    "el4"
-})
-public class DataElement3
-    extends DataElement
- implements Serializable {
-
-    protected List<DataElement4> el4;
-
-    /**
-     * Gets the value of the el4 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el4 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl4().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link DataElement4 }
-     * 
-     * 
-     */
-    public List<DataElement4> getEl4() {
-        if (el4 == null) {
-            el4 = new ArrayList<DataElement4>();
-        }
-        return this.el4;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement4.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement4.java
deleted file mode 100644
index aecd3fe..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement4.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for data_element4 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="data_element4">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}data_element">
- *       &lt;sequence>
- *         &lt;element name="el5" type="{http://www.llview.de}data_element5" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "data_element4", propOrder = {
-    "el5"
-})
-public class DataElement4
-    extends DataElement
- implements Serializable {
-
-    protected List<DataElement5> el5;
-
-    /**
-     * Gets the value of the el5 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el5 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl5().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link DataElement5 }
-     * 
-     * 
-     */
-    public List<DataElement5> getEl5() {
-        if (el5 == null) {
-            el5 = new ArrayList<DataElement5>();
-        }
-        return this.el5;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement5.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement5.java
deleted file mode 100644
index 7c6f8b5..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement5.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for data_element5 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="data_element5">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}data_element">
- *       &lt;sequence>
- *         &lt;element name="el6" type="{http://www.llview.de}data_element6" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "data_element5", propOrder = {
-    "el6"
-})
-public class DataElement5
-    extends DataElement
- implements Serializable {
-
-    protected List<DataElement6> el6;
-
-    /**
-     * Gets the value of the el6 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el6 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl6().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link DataElement6 }
-     * 
-     * 
-     */
-    public List<DataElement6> getEl6() {
-        if (el6 == null) {
-            el6 = new ArrayList<DataElement6>();
-        }
-        return this.el6;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement6.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement6.java
deleted file mode 100644
index ae335d5..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement6.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for data_element6 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="data_element6">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}data_element">
- *       &lt;sequence>
- *         &lt;element name="el7" type="{http://www.llview.de}data_element7" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "data_element6", propOrder = {
-    "el7"
-})
-public class DataElement6
-    extends DataElement
- implements Serializable {
-
-    protected List<DataElement7> el7;
-
-    /**
-     * Gets the value of the el7 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el7 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl7().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link DataElement7 }
-     * 
-     * 
-     */
-    public List<DataElement7> getEl7() {
-        if (el7 == null) {
-            el7 = new ArrayList<DataElement7>();
-        }
-        return this.el7;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement7.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement7.java
deleted file mode 100644
index 18e4838..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement7.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for data_element7 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="data_element7">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}data_element">
- *       &lt;sequence>
- *         &lt;element name="el8" type="{http://www.llview.de}data_element8" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "data_element7", propOrder = {
-    "el8"
-})
-public class DataElement7
-    extends DataElement
- implements Serializable {
-
-    protected List<DataElement8> el8;
-
-    /**
-     * Gets the value of the el8 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el8 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl8().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link DataElement8 }
-     * 
-     * 
-     */
-    public List<DataElement8> getEl8() {
-        if (el8 == null) {
-            el8 = new ArrayList<DataElement8>();
-        }
-        return this.el8;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement8.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement8.java
deleted file mode 100644
index 3ac1789..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement8.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for data_element8 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="data_element8">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}data_element">
- *       &lt;sequence>
- *         &lt;element name="el9" type="{http://www.llview.de}data_element9" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "data_element8", propOrder = {
-    "el9"
-})
-public class DataElement8
-    extends DataElement
- implements Serializable {
-
-    protected List<DataElement9> el9;
-
-    /**
-     * Gets the value of the el9 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el9 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl9().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link DataElement9 }
-     * 
-     * 
-     */
-    public List<DataElement9> getEl9() {
-        if (el9 == null) {
-            el9 = new ArrayList<DataElement9>();
-        }
-        return this.el9;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement9.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement9.java
deleted file mode 100644
index 0b4b100..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataElement9.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for data_element9 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="data_element9">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}data_element">
- *       &lt;sequence>
- *         &lt;element name="el10" type="{http://www.llview.de}data_element10" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "data_element9", propOrder = {
-    "el10"
-})
-public class DataElement9
-    extends DataElement
- implements Serializable {
-
-    protected List<DataElement10> el10;
-
-    /**
-     * Gets the value of the el10 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el10 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl10().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link DataElement10 }
-     * 
-     * 
-     */
-    public List<DataElement10> getEl10() {
-        if (el10 == null) {
-            el10 = new ArrayList<DataElement10>();
-        }
-        return this.el10;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataType.java
deleted file mode 100644
index ce4886f..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DataType.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for data_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="data_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="el1" type="{http://www.llview.de}data_element1" maxOccurs="unbounded"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "data_type", propOrder = {
-    "el1"
-})
-public class DataType  implements Serializable {
-
-    @XmlElement(required = true)
-    protected List<DataElement1> el1;
-
-    /**
-     * Gets the value of the el1 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el1 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl1().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link DataElement1 }
-     * 
-     * 
-     */
-    public List<DataElement1> getEl1() {
-        if (el1 == null) {
-            el1 = new ArrayList<DataElement1>();
-        }
-        return this.el1;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DatacollectionType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DatacollectionType.java
deleted file mode 100644
index ad89482..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DatacollectionType.java
+++ /dev/null
@@ -1,143 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElements;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Defines a set of datapoints and datarects.
- * Saves real data of a diagram.
- * 
- * <p>Java class for datacollection_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="datacollection_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence maxOccurs="unbounded" minOccurs="0">
- *         &lt;element name="p" type="{http://www.llview.de}datapoint_type" maxOccurs="unbounded" minOccurs="0"/>
- *         &lt;element name="r" type="{http://www.llview.de}datarect_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="description" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "datacollection_type", propOrder = {
-    "pAndR"
-})
-public class DatacollectionType  implements Serializable {
-
-    @XmlElements({
-        @XmlElement(name = "r", type = DatarectType.class),
-        @XmlElement(name = "p")
-    })
-    protected List<DatapointType> pAndR;
-    @XmlAttribute
-    protected String name;
-    @XmlAttribute
-    protected String description;
-
-    /**
-     * Gets the value of the pAndR property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the pAndR property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getPAndR().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link DatarectType }
-     * {@link DatapointType }
-     * 
-     * 
-     */
-    public List<DatapointType> getPAndR() {
-        if (pAndR == null) {
-            pAndR = new ArrayList<DatapointType>();
-        }
-        return this.pAndR;
-    }
-
-    /**
-     * Gets the value of the name property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Sets the value of the name property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setName(String value) {
-        this.name = value;
-    }
-
-    /**
-     * Gets the value of the description property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    /**
-     * Sets the value of the description property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setDescription(String value) {
-        this.description = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DatapointType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DatapointType.java
deleted file mode 100644
index 32f9e42..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DatapointType.java
+++ /dev/null
@@ -1,120 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-
-/**
- * 
- *     			One point in a diagram. Could define one bar in a bar
- *     			chart.
- *     		
- * 
- * <p>Java class for datapoint_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="datapoint_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="x" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
- *       &lt;attribute name="y" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
- *       &lt;attribute name="oid" type="{http://www.w3.org/2001/XMLSchema}NCName" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "datapoint_type")
-@XmlSeeAlso({
-    DatarectType.class
-})
-public class DatapointType  implements Serializable {
-
-    @XmlAttribute(required = true)
-    protected double x;
-    @XmlAttribute(required = true)
-    protected double y;
-    @XmlAttribute
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String oid;
-
-    /**
-     * Gets the value of the x property.
-     * 
-     */
-    public double getX() {
-        return x;
-    }
-
-    /**
-     * Sets the value of the x property.
-     * 
-     */
-    public void setX(double value) {
-        this.x = value;
-    }
-
-    /**
-     * Gets the value of the y property.
-     * 
-     */
-    public double getY() {
-        return y;
-    }
-
-    /**
-     * Sets the value of the y property.
-     * 
-     */
-    public void setY(double value) {
-        this.y = value;
-    }
-
-    /**
-     * Gets the value of the oid property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getOid() {
-        return oid;
-    }
-
-    /**
-     * Sets the value of the oid property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setOid(String value) {
-        this.oid = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DatarectType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DatarectType.java
deleted file mode 100644
index a12c173..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/DatarectType.java
+++ /dev/null
@@ -1,114 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			One rect in a diagram. Used in timeline-diagram for
- *     			usage-prediction in llview. (x,y) is upper left corner of the rect.
- *     		
- * 
- * <p>Java class for datarect_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="datarect_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}datapoint_type">
- *       &lt;attribute name="w" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
- *       &lt;attribute name="h" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
- *       &lt;attribute name="text" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "datarect_type")
-public class DatarectType
-    extends DatapointType
- implements Serializable {
-
-    @XmlAttribute(required = true)
-    protected double w;
-    @XmlAttribute(required = true)
-    protected double h;
-    @XmlAttribute
-    protected String text;
-
-    /**
-     * Gets the value of the w property.
-     * 
-     */
-    public double getW() {
-        return w;
-    }
-
-    /**
-     * Sets the value of the w property.
-     * 
-     */
-    public void setW(double value) {
-        this.w = value;
-    }
-
-    /**
-     * Gets the value of the h property.
-     * 
-     */
-    public double getH() {
-        return h;
-    }
-
-    /**
-     * Sets the value of the h property.
-     * 
-     */
-    public void setH(double value) {
-        this.h = value;
-    }
-
-    /**
-     * Gets the value of the text property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getText() {
-        return text;
-    }
-
-    /**
-     * Sets the value of the text property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setText(String value) {
-        this.text = value;
-    }
-
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ElementType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ElementType.java
deleted file mode 100644
index 4ada350..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ElementType.java
+++ /dev/null
@@ -1,141 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.math.BigInteger;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			Abstract element type for either scheme- or
- *     			data-elements. This element is repeated (max-min+1)
- *     			times, if step in the scheme-section is 1. max should be
- *     			higher then min. If max is left out, max will be set to
- *     			min (max=min). min="0", max="0" means there is only one
- *     			element.
- *     		
- * 
- * <p>Java class for element_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="element_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="min" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" />
- *       &lt;attribute name="max" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" />
- *       &lt;attribute name="list" type="{http://www.llview.de}list_type" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "element_type")
-@XmlSeeAlso({
-    SchemeElement.class,
-    DataElement.class,
-    Nodedisplayelement.class
-})
-public class ElementType  implements Serializable {
-
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger min;
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger max;
-    @XmlAttribute
-    protected String list;
-
-    /**
-     * Gets the value of the min property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getMin() {
-        return min;
-    }
-
-    /**
-     * Sets the value of the min property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setMin(BigInteger value) {
-        this.min = value;
-    }
-
-    /**
-     * Gets the value of the max property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getMax() {
-        return max;
-    }
-
-    /**
-     * Sets the value of the max property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setMax(BigInteger value) {
-        this.max = value;
-    }
-
-    /**
-     * Gets the value of the list property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getList() {
-        return list;
-    }
-
-    /**
-     * Sets the value of the list property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setList(String value) {
-        this.list = value;
-    }
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/EntitiesType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/EntitiesType.java
deleted file mode 100644
index 2d2192d..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/EntitiesType.java
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Dummy-root-object. Contains key and keyref definitions to define foreign keys and primary keys.
- * Primary key is here objects/object.id . Foreign key is information/info.id
- * 
- * <p>Java class for entities_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="entities_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="objects" type="{http://www.llview.de}objects_type" minOccurs="0"/>
- *         &lt;element name="information" type="{http://www.llview.de}information_type" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "entities_type", propOrder = {
-    "objects",
-    "information"
-})
-public class EntitiesType  implements Serializable {
-
-    protected ObjectsType objects;
-    protected InformationType information;
-
-    /**
-     * Gets the value of the objects property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link ObjectsType }
-     *     
-     */
-    public ObjectsType getObjects() {
-        return objects;
-    }
-
-    /**
-     * Sets the value of the objects property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link ObjectsType }
-     *     
-     */
-    public void setObjects(ObjectsType value) {
-        this.objects = value;
-    }
-
-    /**
-     * Gets the value of the information property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link InformationType }
-     *     
-     */
-    public InformationType getInformation() {
-        return information;
-    }
-
-    /**
-     * Sets the value of the information property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link InformationType }
-     *     
-     */
-    public void setInformation(InformationType value) {
-        this.information = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/GobjectType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/GobjectType.java
deleted file mode 100644
index 04460b5..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/GobjectType.java
+++ /dev/null
@@ -1,136 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Abstract type for all graphical objects. All graphical objects like table, usagebar etc. have to have ids.
- * This is defined by extending all graphical objects from this type.
- * 
- * <p>Java class for gobject_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="gobject_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="description" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "gobject_type")
-@XmlSeeAlso({
-    ChartType.class,
-    TableType.class,
-    TextboxType.class,
-    InfoboxType.class,
-    UsagebarType.class,
-    Nodedisplay.class,
-    ChartgroupType.class
-})
-public class GobjectType  implements Serializable {
-
-    @XmlAttribute(required = true)
-    protected String id;
-    @XmlAttribute
-    protected String title;
-    @XmlAttribute
-    protected String description;
-
-    /**
-     * Gets the value of the id property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * Sets the value of the id property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setId(String value) {
-        this.id = value;
-    }
-
-    /**
-     * Gets the value of the title property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getTitle() {
-        return title;
-    }
-
-    /**
-     * Sets the value of the title property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setTitle(String value) {
-        this.title = value;
-    }
-
-    /**
-     * Gets the value of the description property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    /**
-     * Sets the value of the description property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setDescription(String value) {
-        this.description = value;
-    }
-
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfoType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfoType.java
deleted file mode 100644
index c62d071..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfoType.java
+++ /dev/null
@@ -1,177 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-
-/**
- * 
- *     			Is referenced to an existing object-instance by id.
- *     			description gives a brief idea of what this info
- *     			contains. Collects a list of key-value-pairs. For
- *     			example key="cpucount" value="290.000".
- *     		
- * 
- * <p>Java class for info_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="info_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="data" type="{http://www.llview.de}infodata_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="oid" use="required" type="{http://www.w3.org/2001/XMLSchema}NCName" />
- *       &lt;attribute name="description" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="type" type="{http://www.w3.org/2001/XMLSchema}NCName" default="notype" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "info_type", propOrder = {
-    "data"
-})
-public class InfoType  implements Serializable {
-
-    protected List<InfodataType> data;
-    @XmlAttribute(required = true)
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String oid;
-    @XmlAttribute
-    protected String description;
-    @XmlAttribute
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String type;
-
-    /**
-     * Gets the value of the data property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the data property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getData().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link InfodataType }
-     * 
-     * 
-     */
-    public List<InfodataType> getData() {
-        if (data == null) {
-            data = new ArrayList<InfodataType>();
-        }
-        return this.data;
-    }
-
-    /**
-     * Gets the value of the oid property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getOid() {
-        return oid;
-    }
-
-    /**
-     * Sets the value of the oid property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setOid(String value) {
-        this.oid = value;
-    }
-
-    /**
-     * Gets the value of the description property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    /**
-     * Sets the value of the description property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setDescription(String value) {
-        this.description = value;
-    }
-
-    /**
-     * Gets the value of the type property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getType() {
-        if (type == null) {
-            return "notype";
-        } else {
-            return type;
-        }
-    }
-
-    /**
-     * Sets the value of the type property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setType(String value) {
-        this.type = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfoboxType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfoboxType.java
deleted file mode 100644
index acd3a34..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfoboxType.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-
-/**
- * <p>Java class for infobox_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="infobox_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}gobject_type">
- *       &lt;attribute name="type" type="{http://www.w3.org/2001/XMLSchema}NCName" default="notype" />
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "infobox_type")
-public class InfoboxType
-    extends GobjectType
- implements Serializable {
-
-    @XmlAttribute
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String type;
-
-    /**
-     * Gets the value of the type property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getType() {
-        if (type == null) {
-            return "notype";
-        } else {
-            return type;
-        }
-    }
-
-    /**
-     * Sets the value of the type property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setType(String value) {
-        this.type = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfoboxlayoutColtype.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfoboxlayoutColtype.java
deleted file mode 100644
index 298640b..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfoboxlayoutColtype.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for infoboxlayout_coltype complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="infoboxlayout_coltype">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="pos" type="{http://www.llview.de}integer01type" />
- *       &lt;attribute name="width" default="0.5">
- *         &lt;simpleType>
- *           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}double">
- *             &lt;minInclusive value="0"/>
- *             &lt;maxInclusive value="1"/>
- *           &lt;/restriction>
- *         &lt;/simpleType>
- *       &lt;/attribute>
- *       &lt;attribute name="sorted" type="{http://www.llview.de}columnsortedtype" default="false" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "infoboxlayout_coltype")
-public class InfoboxlayoutColtype  implements Serializable {
-
-    @XmlAttribute
-    protected Integer pos;
-    @XmlAttribute
-    protected Double width;
-    @XmlAttribute
-    protected Columnsortedtype sorted;
-
-    /**
-     * Gets the value of the pos property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Integer }
-     *     
-     */
-    public Integer getPos() {
-        return pos;
-    }
-
-    /**
-     * Sets the value of the pos property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Integer }
-     *     
-     */
-    public void setPos(Integer value) {
-        this.pos = value;
-    }
-
-    /**
-     * Gets the value of the width property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Double }
-     *     
-     */
-    public double getWidth() {
-        if (width == null) {
-            return  0.5D;
-        } else {
-            return width;
-        }
-    }
-
-    /**
-     * Sets the value of the width property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Double }
-     *     
-     */
-    public void setWidth(Double value) {
-        this.width = value;
-    }
-
-    /**
-     * Gets the value of the sorted property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Columnsortedtype }
-     *     
-     */
-    public Columnsortedtype getSorted() {
-        if (sorted == null) {
-            return Columnsortedtype.FALSE;
-        } else {
-            return sorted;
-        }
-    }
-
-    /**
-     * Sets the value of the sorted property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Columnsortedtype }
-     *     
-     */
-    public void setSorted(Columnsortedtype value) {
-        this.sorted = value;
-    }
-
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfoboxlayoutType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfoboxlayoutType.java
deleted file mode 100644
index ca3f575..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfoboxlayoutType.java
+++ /dev/null
@@ -1,99 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for infoboxlayout_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="infoboxlayout_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}componentlayout_type">
- *       &lt;sequence>
- *         &lt;element name="typecol" type="{http://www.llview.de}infoboxlayout_coltype" minOccurs="0"/>
- *         &lt;element name="infocol" type="{http://www.llview.de}infoboxlayout_coltype" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "infoboxlayout_type", propOrder = {
-    "typecol",
-    "infocol"
-})
-public class InfoboxlayoutType
-    extends ComponentlayoutType
- implements Serializable {
-
-    protected InfoboxlayoutColtype typecol;
-    protected InfoboxlayoutColtype infocol;
-
-    /**
-     * Gets the value of the typecol property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link InfoboxlayoutColtype }
-     *     
-     */
-    public InfoboxlayoutColtype getTypecol() {
-        return typecol;
-    }
-
-    /**
-     * Sets the value of the typecol property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link InfoboxlayoutColtype }
-     *     
-     */
-    public void setTypecol(InfoboxlayoutColtype value) {
-        this.typecol = value;
-    }
-
-    /**
-     * Gets the value of the infocol property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link InfoboxlayoutColtype }
-     *     
-     */
-    public InfoboxlayoutColtype getInfocol() {
-        return infocol;
-    }
-
-    /**
-     * Sets the value of the infocol property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link InfoboxlayoutColtype }
-     *     
-     */
-    public void setInfocol(InfoboxlayoutColtype value) {
-        this.infocol = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfodataType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfodataType.java
deleted file mode 100644
index 72f4ce3..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InfodataType.java
+++ /dev/null
@@ -1,97 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Key value pair for information.
- * 
- * <p>Java class for infodata_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="infodata_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="key" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="value" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "infodata_type")
-public class InfodataType  implements Serializable {
-
-    @XmlAttribute(required = true)
-    protected String key;
-    @XmlAttribute
-    protected String value;
-
-    /**
-     * Gets the value of the key property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getKey() {
-        return key;
-    }
-
-    /**
-     * Sets the value of the key property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setKey(String value) {
-        this.key = value;
-    }
-
-    /**
-     * Gets the value of the value property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getValue() {
-        return value;
-    }
-
-    /**
-     * Sets the value of the value property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InformationType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InformationType.java
deleted file mode 100644
index 02b1fb3..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/InformationType.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Collects a list of infos. Exists a most once.
- * 
- * <p>Java class for information_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="information_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="info" type="{http://www.llview.de}info_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "information_type", propOrder = {
-    "info"
-})
-public class InformationType  implements Serializable {
-
-    protected List<InfoType> info;
-
-    /**
-     * Gets the value of the info property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the info property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getInfo().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link InfoType }
-     * 
-     * 
-     */
-    public List<InfoType> getInfo() {
-        if (info == null) {
-            info = new ArrayList<InfoType>();
-        }
-        return this.info;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/JobPartType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/JobPartType.java
deleted file mode 100644
index 2e5dd52..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/JobPartType.java
+++ /dev/null
@@ -1,99 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.math.BigInteger;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for job_part_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="job_part_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="cpucount" use="required" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" />
- *       &lt;attribute name="cpupernode" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "job_part_type")
-public class JobPartType  implements Serializable {
-
-    @XmlAttribute(required = true)
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger cpucount;
-    @XmlAttribute
-    @XmlSchemaType(name = "positiveInteger")
-    protected BigInteger cpupernode;
-
-    /**
-     * Gets the value of the cpucount property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getCpucount() {
-        return cpucount;
-    }
-
-    /**
-     * Sets the value of the cpucount property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setCpucount(BigInteger value) {
-        this.cpucount = value;
-    }
-
-    /**
-     * Gets the value of the cpupernode property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getCpupernode() {
-        return cpupernode;
-    }
-
-    /**
-     * Sets the value of the cpupernode property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setCpupernode(BigInteger value) {
-        this.cpupernode = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/JobType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/JobType.java
deleted file mode 100644
index 328b988..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/JobType.java
+++ /dev/null
@@ -1,171 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-
-/**
- * Describes one job in the usagebar. Saves how many cpus are used by this job and how many cpus are on one node.
- * If this job is running on different node-architectures, where cpupernode differs, a list of jobparts has to be used.
- * So one job can be divided into jobparts for a more detailled description.
- * 
- * <p>Java class for job_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="job_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="jobpart" type="{http://www.llview.de}job_part_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="oid" use="required" type="{http://www.w3.org/2001/XMLSchema}NCName" />
- *       &lt;attribute name="cpucount" use="required" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" />
- *       &lt;attribute name="cpupernode" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "job_type", propOrder = {
-    "jobpart"
-})
-public class JobType  implements Serializable {
-
-    protected List<JobPartType> jobpart;
-    @XmlAttribute(required = true)
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String oid;
-    @XmlAttribute(required = true)
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger cpucount;
-    @XmlAttribute
-    @XmlSchemaType(name = "positiveInteger")
-    protected BigInteger cpupernode;
-
-    /**
-     * Gets the value of the jobpart property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the jobpart property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getJobpart().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link JobPartType }
-     * 
-     * 
-     */
-    public List<JobPartType> getJobpart() {
-        if (jobpart == null) {
-            jobpart = new ArrayList<JobPartType>();
-        }
-        return this.jobpart;
-    }
-
-    /**
-     * Gets the value of the oid property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getOid() {
-        return oid;
-    }
-
-    /**
-     * Sets the value of the oid property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setOid(String value) {
-        this.oid = value;
-    }
-
-    /**
-     * Gets the value of the cpucount property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getCpucount() {
-        return cpucount;
-    }
-
-    /**
-     * Sets the value of the cpucount property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setCpucount(BigInteger value) {
-        this.cpucount = value;
-    }
-
-    /**
-     * Gets the value of the cpupernode property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getCpupernode() {
-        return cpupernode;
-    }
-
-    /**
-     * Sets the value of the cpupernode property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setCpupernode(BigInteger value) {
-        this.cpupernode = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/LayoutType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/LayoutType.java
deleted file mode 100644
index fbf612c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/LayoutType.java
+++ /dev/null
@@ -1,75 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * All layout-types should extend this type
- * 
- * <p>Java class for layout_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="layout_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "layout_type")
-@XmlSeeAlso({
-    SplitlayoutType.class,
-    AbslayoutType.class
-})
-public class LayoutType  implements Serializable {
-
-    @XmlAttribute(required = true)
-    protected String id;
-
-    /**
-     * Gets the value of the id property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * Sets the value of the id property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setId(String value) {
-        this.id = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/LguiType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/LguiType.java
deleted file mode 100644
index 9875594..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/LguiType.java
+++ /dev/null
@@ -1,203 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElementRef;
-import javax.xml.bind.annotation.XmlElementRefs;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			Defines which main tags are allowed in LML.
- *     		
- * 
- * <p>Java class for lgui_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="lgui_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence maxOccurs="unbounded" minOccurs="0">
- *         &lt;sequence minOccurs="0">
- *           &lt;element name="objects" type="{http://www.llview.de}objects_type" minOccurs="0"/>
- *           &lt;element name="relations" type="{http://www.llview.de}relations_type" minOccurs="0"/>
- *           &lt;element name="information" type="{http://www.llview.de}information_type" minOccurs="0"/>
- *         &lt;/sequence>
- *         &lt;sequence minOccurs="0">
- *           &lt;element name="table" type="{http://www.llview.de}table_type" minOccurs="0"/>
- *           &lt;element name="usagebar" type="{http://www.llview.de}usagebar_type" minOccurs="0"/>
- *           &lt;element name="text" type="{http://www.llview.de}textbox_type" minOccurs="0"/>
- *           &lt;element name="infobox" type="{http://www.llview.de}infobox_type" minOccurs="0"/>
- *           &lt;element name="nodedisplay" type="{http://www.llview.de}nodedisplay" minOccurs="0"/>
- *           &lt;element name="chart" type="{http://www.llview.de}chart_type" minOccurs="0"/>
- *           &lt;element name="chartgroup" type="{http://www.llview.de}chartgroup_type" minOccurs="0"/>
- *         &lt;/sequence>
- *         &lt;sequence minOccurs="0">
- *           &lt;element name="splitlayout" type="{http://www.llview.de}splitlayout_type" minOccurs="0"/>
- *           &lt;element name="abslayout" type="{http://www.llview.de}abslayout_type" minOccurs="0"/>
- *           &lt;element name="nodedisplaylayout" type="{http://www.llview.de}nodedisplaylayout_type" minOccurs="0"/>
- *           &lt;element name="usagebarlayout" type="{http://www.llview.de}usagebarlayout_type" minOccurs="0"/>
- *           &lt;element name="chartlayout" type="{http://www.llview.de}chartlayout_type" minOccurs="0"/>
- *           &lt;element name="tablelayout" type="{http://www.llview.de}tablelayout_type" minOccurs="0"/>
- *           &lt;element name="infoboxlayout" type="{http://www.llview.de}infoboxlayout_type" minOccurs="0"/>
- *           &lt;element name="textlayout" type="{http://www.llview.de}infoboxlayout_type" minOccurs="0"/>
- *         &lt;/sequence>
- *       &lt;/sequence>
- *       &lt;attribute name="version" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="layout" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "lgui_type", propOrder = {
-    "objectsAndRelationsAndInformation"
-})
-public class LguiType  implements Serializable {
-
-    @XmlElementRefs({
-        @XmlElementRef(name = "table", type = JAXBElement.class),
-        @XmlElementRef(name = "splitlayout", type = JAXBElement.class),
-        @XmlElementRef(name = "textlayout", type = JAXBElement.class),
-        @XmlElementRef(name = "objects", type = JAXBElement.class),
-        @XmlElementRef(name = "relations", type = JAXBElement.class),
-        @XmlElementRef(name = "chartlayout", type = JAXBElement.class),
-        @XmlElementRef(name = "nodedisplay", type = JAXBElement.class),
-        @XmlElementRef(name = "nodedisplaylayout", type = JAXBElement.class),
-        @XmlElementRef(name = "infobox", type = JAXBElement.class),
-        @XmlElementRef(name = "chartgroup", type = JAXBElement.class),
-        @XmlElementRef(name = "tablelayout", type = JAXBElement.class),
-        @XmlElementRef(name = "infoboxlayout", type = JAXBElement.class),
-        @XmlElementRef(name = "information", type = JAXBElement.class),
-        @XmlElementRef(name = "abslayout", type = JAXBElement.class),
-        @XmlElementRef(name = "usagebarlayout", type = JAXBElement.class),
-        @XmlElementRef(name = "usagebar", type = JAXBElement.class),
-        @XmlElementRef(name = "chart", type = JAXBElement.class),
-        @XmlElementRef(name = "text", type = JAXBElement.class)
-    })
-    protected List<JAXBElement<?>> objectsAndRelationsAndInformation;
-    @XmlAttribute
-    protected String version;
-    @XmlAttribute
-    protected Boolean layout;
-
-    /**
-     * Gets the value of the objectsAndRelationsAndInformation property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the objectsAndRelationsAndInformation property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getObjectsAndRelationsAndInformation().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link JAXBElement }{@code <}{@link TableType }{@code >}
-     * {@link JAXBElement }{@code <}{@link SplitlayoutType }{@code >}
-     * {@link JAXBElement }{@code <}{@link InfoboxlayoutType }{@code >}
-     * {@link JAXBElement }{@code <}{@link RelationsType }{@code >}
-     * {@link JAXBElement }{@code <}{@link ObjectsType }{@code >}
-     * {@link JAXBElement }{@code <}{@link ChartlayoutType }{@code >}
-     * {@link JAXBElement }{@code <}{@link Nodedisplay }{@code >}
-     * {@link JAXBElement }{@code <}{@link NodedisplaylayoutType }{@code >}
-     * {@link JAXBElement }{@code <}{@link InfoboxType }{@code >}
-     * {@link JAXBElement }{@code <}{@link ChartgroupType }{@code >}
-     * {@link JAXBElement }{@code <}{@link TablelayoutType }{@code >}
-     * {@link JAXBElement }{@code <}{@link InfoboxlayoutType }{@code >}
-     * {@link JAXBElement }{@code <}{@link InformationType }{@code >}
-     * {@link JAXBElement }{@code <}{@link AbslayoutType }{@code >}
-     * {@link JAXBElement }{@code <}{@link UsagebarType }{@code >}
-     * {@link JAXBElement }{@code <}{@link UsagebarlayoutType }{@code >}
-     * {@link JAXBElement }{@code <}{@link TextboxType }{@code >}
-     * {@link JAXBElement }{@code <}{@link ChartType }{@code >}
-     * 
-     * 
-     */
-    public List<JAXBElement<?>> getObjectsAndRelationsAndInformation() {
-        if (objectsAndRelationsAndInformation == null) {
-            objectsAndRelationsAndInformation = new ArrayList<JAXBElement<?>>();
-        }
-        return this.objectsAndRelationsAndInformation;
-    }
-
-    /**
-     * Gets the value of the version property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getVersion() {
-        return version;
-    }
-
-    /**
-     * Sets the value of the version property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setVersion(String value) {
-        this.version = value;
-    }
-
-    /**
-     * Gets the value of the layout property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Boolean }
-     *     
-     */
-    public boolean isLayout() {
-        if (layout == null) {
-            return false;
-        } else {
-            return layout;
-        }
-    }
-
-    /**
-     * Sets the value of the layout property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Boolean }
-     *     
-     */
-    public void setLayout(Boolean value) {
-        this.layout = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplay.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplay.java
deleted file mode 100644
index 2189f99..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplay.java
+++ /dev/null
@@ -1,139 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			Representation of the overview about cpus and which jobs
- *     			are running on which cpu/node. Designed as tree.
- *     			Scheme-tag describes an empty batch-system, data-tag the
- *     			actual situation in this system. Data-tag connects
- *     			elements in the nodedisplay with jobs, which are running
- *     			in the system.
- *     		
- * 
- * <p>Java class for nodedisplay complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="nodedisplay">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}gobject_type">
- *       &lt;sequence>
- *         &lt;element name="scheme" type="{http://www.llview.de}scheme_type"/>
- *         &lt;element name="data" type="{http://www.llview.de}data_type"/>
- *       &lt;/sequence>
- *       &lt;attribute name="refto" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "nodedisplay", propOrder = {
-    "scheme",
-    "data"
-})
-public class Nodedisplay
-    extends GobjectType
- implements Serializable {
-
-    @XmlElement(required = true)
-    protected SchemeType scheme;
-    @XmlElement(required = true)
-    protected DataType data;
-    @XmlAttribute
-    protected String refto;
-
-    /**
-     * Gets the value of the scheme property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link SchemeType }
-     *     
-     */
-    public SchemeType getScheme() {
-        return scheme;
-    }
-
-    /**
-     * Sets the value of the scheme property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link SchemeType }
-     *     
-     */
-    public void setScheme(SchemeType value) {
-        this.scheme = value;
-    }
-
-    /**
-     * Gets the value of the data property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link DataType }
-     *     
-     */
-    public DataType getData() {
-        return data;
-    }
-
-    /**
-     * Sets the value of the data property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link DataType }
-     *     
-     */
-    public void setData(DataType value) {
-        this.data = value;
-    }
-
-    /**
-     * Gets the value of the refto property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getRefto() {
-        return refto;
-    }
-
-    /**
-     * Sets the value of the refto property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setRefto(String value) {
-        this.refto = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement.java
deleted file mode 100644
index 5ec6bfd..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement.java
+++ /dev/null
@@ -1,630 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			Contains all attributes that are equal at all levels
- *     		
- * 
- * <p>Java class for nodedisplayelement complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="nodedisplayelement">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}element_type">
- *       &lt;sequence>
- *         &lt;element name="img" type="{http://www.llview.de}picture_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="rows" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" default="0" />
- *       &lt;attribute name="cols" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" default="8" />
- *       &lt;attribute name="hgap" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" default="1" />
- *       &lt;attribute name="vgap" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" default="1" />
- *       &lt;attribute name="fontsize" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" default="10" />
- *       &lt;attribute name="border" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" default="1" />
- *       &lt;attribute name="fontfamily" type="{http://www.w3.org/2001/XMLSchema}string" default="Monospaced" />
- *       &lt;attribute name="showtitle" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="titlebackground" type="{http://www.llview.de}hexcolor_type" default="#EFEFEF" />
- *       &lt;attribute name="background" type="{http://www.llview.de}hexcolor_type" default="#FFF" />
- *       &lt;attribute name="maxlevel" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" />
- *       &lt;attribute name="mouseborder" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" default="2" />
- *       &lt;attribute name="transparent" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *       &lt;attribute name="bordercolor" type="{http://www.llview.de}hexcolor_type" default="#000" />
- *       &lt;attribute name="showfulltitle" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />
- *       &lt;attribute name="highestrowfirst" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *       &lt;attribute name="highestcolfirst" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "nodedisplayelement", propOrder = {
-    "img"
-})
-@XmlSeeAlso({
-    Nodedisplayelement2 .class,
-    Nodedisplayelement3 .class,
-    Nodedisplayelement0 .class,
-    Nodedisplayelement1 .class,
-    Nodedisplayelement8 .class,
-    Nodedisplayelement9 .class,
-    Nodedisplayelement6 .class,
-    Nodedisplayelement7 .class,
-    Nodedisplayelement4 .class,
-    Nodedisplayelement5 .class
-})
-public class Nodedisplayelement
-    extends ElementType
- implements Serializable {
-
-    protected List<PictureType> img;
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger rows;
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger cols;
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger hgap;
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger vgap;
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger fontsize;
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger border;
-    @XmlAttribute
-    protected String fontfamily;
-    @XmlAttribute
-    protected Boolean showtitle;
-    @XmlAttribute
-    protected String titlebackground;
-    @XmlAttribute
-    protected String background;
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger maxlevel;
-    @XmlAttribute
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger mouseborder;
-    @XmlAttribute
-    protected Boolean transparent;
-    @XmlAttribute
-    protected String bordercolor;
-    @XmlAttribute
-    protected Boolean showfulltitle;
-    @XmlAttribute
-    protected Boolean highestrowfirst;
-    @XmlAttribute
-    protected Boolean highestcolfirst;
-
-    /**
-     * Gets the value of the img property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the img property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getImg().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link PictureType }
-     * 
-     * 
-     */
-    public List<PictureType> getImg() {
-        if (img == null) {
-            img = new ArrayList<PictureType>();
-        }
-        return this.img;
-    }
-
-    /**
-     * Gets the value of the rows property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getRows() {
-        if (rows == null) {
-            return new BigInteger("0");
-        } else {
-            return rows;
-        }
-    }
-
-    /**
-     * Sets the value of the rows property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setRows(BigInteger value) {
-        this.rows = value;
-    }
-
-    /**
-     * Gets the value of the cols property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getCols() {
-        if (cols == null) {
-            return new BigInteger("8");
-        } else {
-            return cols;
-        }
-    }
-
-    /**
-     * Sets the value of the cols property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setCols(BigInteger value) {
-        this.cols = value;
-    }
-
-    /**
-     * Gets the value of the hgap property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getHgap() {
-        if (hgap == null) {
-            return new BigInteger("1");
-        } else {
-            return hgap;
-        }
-    }
-
-    /**
-     * Sets the value of the hgap property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setHgap(BigInteger value) {
-        this.hgap = value;
-    }
-
-    /**
-     * Gets the value of the vgap property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getVgap() {
-        if (vgap == null) {
-            return new BigInteger("1");
-        } else {
-            return vgap;
-        }
-    }
-
-    /**
-     * Sets the value of the vgap property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setVgap(BigInteger value) {
-        this.vgap = value;
-    }
-
-    /**
-     * Gets the value of the fontsize property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getFontsize() {
-        if (fontsize == null) {
-            return new BigInteger("10");
-        } else {
-            return fontsize;
-        }
-    }
-
-    /**
-     * Sets the value of the fontsize property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setFontsize(BigInteger value) {
-        this.fontsize = value;
-    }
-
-    /**
-     * Gets the value of the border property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getBorder() {
-        if (border == null) {
-            return new BigInteger("1");
-        } else {
-            return border;
-        }
-    }
-
-    /**
-     * Sets the value of the border property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setBorder(BigInteger value) {
-        this.border = value;
-    }
-
-    /**
-     * Gets the value of the fontfamily property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getFontfamily() {
-        if (fontfamily == null) {
-            return "Monospaced";
-        } else {
-            return fontfamily;
-        }
-    }
-
-    /**
-     * Sets the value of the fontfamily property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setFontfamily(String value) {
-        this.fontfamily = value;
-    }
-
-    /**
-     * Gets the value of the showtitle property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Boolean }
-     *     
-     */
-    public boolean isShowtitle() {
-        if (showtitle == null) {
-            return false;
-        } else {
-            return showtitle;
-        }
-    }
-
-    /**
-     * Sets the value of the showtitle property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Boolean }
-     *     
-     */
-    public void setShowtitle(Boolean value) {
-        this.showtitle = value;
-    }
-
-    /**
-     * Gets the value of the titlebackground property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getTitlebackground() {
-        if (titlebackground == null) {
-            return "#EFEFEF";
-        } else {
-            return titlebackground;
-        }
-    }
-
-    /**
-     * Sets the value of the titlebackground property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setTitlebackground(String value) {
-        this.titlebackground = value;
-    }
-
-    /**
-     * Gets the value of the background property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getBackground() {
-        if (background == null) {
-            return "#FFF";
-        } else {
-            return background;
-        }
-    }
-
-    /**
-     * Sets the value of the background property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setBackground(String value) {
-        this.background = value;
-    }
-
-    /**
-     * Gets the value of the maxlevel property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getMaxlevel() {
-        return maxlevel;
-    }
-
-    /**
-     * Sets the value of the maxlevel property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setMaxlevel(BigInteger value) {
-        this.maxlevel = value;
-    }
-
-    /**
-     * Gets the value of the mouseborder property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getMouseborder() {
-        if (mouseborder == null) {
-            return new BigInteger("2");
-        } else {
-            return mouseborder;
-        }
-    }
-
-    /**
-     * Sets the value of the mouseborder property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setMouseborder(BigInteger value) {
-        this.mouseborder = value;
-    }
-
-    /**
-     * Gets the value of the transparent property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Boolean }
-     *     
-     */
-    public boolean isTransparent() {
-        if (transparent == null) {
-            return true;
-        } else {
-            return transparent;
-        }
-    }
-
-    /**
-     * Sets the value of the transparent property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Boolean }
-     *     
-     */
-    public void setTransparent(Boolean value) {
-        this.transparent = value;
-    }
-
-    /**
-     * Gets the value of the bordercolor property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getBordercolor() {
-        if (bordercolor == null) {
-            return "#000";
-        } else {
-            return bordercolor;
-        }
-    }
-
-    /**
-     * Sets the value of the bordercolor property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setBordercolor(String value) {
-        this.bordercolor = value;
-    }
-
-    /**
-     * Gets the value of the showfulltitle property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Boolean }
-     *     
-     */
-    public boolean isShowfulltitle() {
-        if (showfulltitle == null) {
-            return true;
-        } else {
-            return showfulltitle;
-        }
-    }
-
-    /**
-     * Sets the value of the showfulltitle property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Boolean }
-     *     
-     */
-    public void setShowfulltitle(Boolean value) {
-        this.showfulltitle = value;
-    }
-
-    /**
-     * Gets the value of the highestrowfirst property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Boolean }
-     *     
-     */
-    public boolean isHighestrowfirst() {
-        if (highestrowfirst == null) {
-            return false;
-        } else {
-            return highestrowfirst;
-        }
-    }
-
-    /**
-     * Sets the value of the highestrowfirst property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Boolean }
-     *     
-     */
-    public void setHighestrowfirst(Boolean value) {
-        this.highestrowfirst = value;
-    }
-
-    /**
-     * Gets the value of the highestcolfirst property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Boolean }
-     *     
-     */
-    public boolean isHighestcolfirst() {
-        if (highestcolfirst == null) {
-            return false;
-        } else {
-            return highestcolfirst;
-        }
-    }
-
-    /**
-     * Sets the value of the highestcolfirst property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Boolean }
-     *     
-     */
-    public void setHighestcolfirst(Boolean value) {
-        this.highestcolfirst = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement0.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement0.java
deleted file mode 100644
index 8780faa..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement0.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for nodedisplayelement0 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="nodedisplayelement0">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}nodedisplayelement">
- *       &lt;sequence>
- *         &lt;element name="el1" type="{http://www.llview.de}nodedisplayelement1" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "nodedisplayelement0", propOrder = {
-    "el1"
-})
-public class Nodedisplayelement0
-    extends Nodedisplayelement
- implements Serializable {
-
-    protected List<Nodedisplayelement1> el1;
-
-    /**
-     * Gets the value of the el1 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el1 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl1().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link Nodedisplayelement1 }
-     * 
-     * 
-     */
-    public List<Nodedisplayelement1> getEl1() {
-        if (el1 == null) {
-            el1 = new ArrayList<Nodedisplayelement1>();
-        }
-        return this.el1;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement1.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement1.java
deleted file mode 100644
index d353779..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement1.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for nodedisplayelement1 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="nodedisplayelement1">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}nodedisplayelement">
- *       &lt;sequence>
- *         &lt;element name="el2" type="{http://www.llview.de}nodedisplayelement2" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "nodedisplayelement1", propOrder = {
-    "el2"
-})
-public class Nodedisplayelement1
-    extends Nodedisplayelement
- implements Serializable {
-
-    protected List<Nodedisplayelement2> el2;
-
-    /**
-     * Gets the value of the el2 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el2 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl2().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link Nodedisplayelement2 }
-     * 
-     * 
-     */
-    public List<Nodedisplayelement2> getEl2() {
-        if (el2 == null) {
-            el2 = new ArrayList<Nodedisplayelement2>();
-        }
-        return this.el2;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement2.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement2.java
deleted file mode 100644
index c361864..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement2.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for nodedisplayelement2 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="nodedisplayelement2">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}nodedisplayelement">
- *       &lt;sequence>
- *         &lt;element name="el3" type="{http://www.llview.de}nodedisplayelement3" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "nodedisplayelement2", propOrder = {
-    "el3"
-})
-public class Nodedisplayelement2
-    extends Nodedisplayelement
- implements Serializable {
-
-    protected List<Nodedisplayelement3> el3;
-
-    /**
-     * Gets the value of the el3 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el3 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl3().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link Nodedisplayelement3 }
-     * 
-     * 
-     */
-    public List<Nodedisplayelement3> getEl3() {
-        if (el3 == null) {
-            el3 = new ArrayList<Nodedisplayelement3>();
-        }
-        return this.el3;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement3.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement3.java
deleted file mode 100644
index d6a8ea2..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement3.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for nodedisplayelement3 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="nodedisplayelement3">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}nodedisplayelement">
- *       &lt;sequence>
- *         &lt;element name="el4" type="{http://www.llview.de}nodedisplayelement4" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "nodedisplayelement3", propOrder = {
-    "el4"
-})
-public class Nodedisplayelement3
-    extends Nodedisplayelement
- implements Serializable {
-
-    protected List<Nodedisplayelement4> el4;
-
-    /**
-     * Gets the value of the el4 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el4 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl4().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link Nodedisplayelement4 }
-     * 
-     * 
-     */
-    public List<Nodedisplayelement4> getEl4() {
-        if (el4 == null) {
-            el4 = new ArrayList<Nodedisplayelement4>();
-        }
-        return this.el4;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement4.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement4.java
deleted file mode 100644
index 4271081..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement4.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for nodedisplayelement4 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="nodedisplayelement4">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}nodedisplayelement">
- *       &lt;sequence>
- *         &lt;element name="el5" type="{http://www.llview.de}nodedisplayelement5" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "nodedisplayelement4", propOrder = {
-    "el5"
-})
-public class Nodedisplayelement4
-    extends Nodedisplayelement
- implements Serializable {
-
-    protected List<Nodedisplayelement5> el5;
-
-    /**
-     * Gets the value of the el5 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el5 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl5().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link Nodedisplayelement5 }
-     * 
-     * 
-     */
-    public List<Nodedisplayelement5> getEl5() {
-        if (el5 == null) {
-            el5 = new ArrayList<Nodedisplayelement5>();
-        }
-        return this.el5;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement5.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement5.java
deleted file mode 100644
index 00d06da..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement5.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for nodedisplayelement5 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="nodedisplayelement5">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}nodedisplayelement">
- *       &lt;sequence>
- *         &lt;element name="el6" type="{http://www.llview.de}nodedisplayelement6" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "nodedisplayelement5", propOrder = {
-    "el6"
-})
-public class Nodedisplayelement5
-    extends Nodedisplayelement
- implements Serializable {
-
-    protected List<Nodedisplayelement6> el6;
-
-    /**
-     * Gets the value of the el6 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el6 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl6().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link Nodedisplayelement6 }
-     * 
-     * 
-     */
-    public List<Nodedisplayelement6> getEl6() {
-        if (el6 == null) {
-            el6 = new ArrayList<Nodedisplayelement6>();
-        }
-        return this.el6;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement6.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement6.java
deleted file mode 100644
index 79489f9..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement6.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for nodedisplayelement6 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="nodedisplayelement6">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}nodedisplayelement">
- *       &lt;sequence>
- *         &lt;element name="el7" type="{http://www.llview.de}nodedisplayelement7" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "nodedisplayelement6", propOrder = {
-    "el7"
-})
-public class Nodedisplayelement6
-    extends Nodedisplayelement
- implements Serializable {
-
-    protected List<Nodedisplayelement7> el7;
-
-    /**
-     * Gets the value of the el7 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el7 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl7().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link Nodedisplayelement7 }
-     * 
-     * 
-     */
-    public List<Nodedisplayelement7> getEl7() {
-        if (el7 == null) {
-            el7 = new ArrayList<Nodedisplayelement7>();
-        }
-        return this.el7;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement7.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement7.java
deleted file mode 100644
index 8a5ec31..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement7.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for nodedisplayelement7 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="nodedisplayelement7">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}nodedisplayelement">
- *       &lt;sequence>
- *         &lt;element name="el8" type="{http://www.llview.de}nodedisplayelement8" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "nodedisplayelement7", propOrder = {
-    "el8"
-})
-public class Nodedisplayelement7
-    extends Nodedisplayelement
- implements Serializable {
-
-    protected List<Nodedisplayelement8> el8;
-
-    /**
-     * Gets the value of the el8 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el8 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl8().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link Nodedisplayelement8 }
-     * 
-     * 
-     */
-    public List<Nodedisplayelement8> getEl8() {
-        if (el8 == null) {
-            el8 = new ArrayList<Nodedisplayelement8>();
-        }
-        return this.el8;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement8.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement8.java
deleted file mode 100644
index 135ec2e..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement8.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for nodedisplayelement8 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="nodedisplayelement8">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}nodedisplayelement">
- *       &lt;sequence>
- *         &lt;element name="el9" type="{http://www.llview.de}nodedisplayelement9" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "nodedisplayelement8", propOrder = {
-    "el9"
-})
-public class Nodedisplayelement8
-    extends Nodedisplayelement
- implements Serializable {
-
-    protected List<Nodedisplayelement9> el9;
-
-    /**
-     * Gets the value of the el9 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el9 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl9().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link Nodedisplayelement9 }
-     * 
-     * 
-     */
-    public List<Nodedisplayelement9> getEl9() {
-        if (el9 == null) {
-            el9 = new ArrayList<Nodedisplayelement9>();
-        }
-        return this.el9;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement9.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement9.java
deleted file mode 100644
index 9eb11f1..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/Nodedisplayelement9.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for nodedisplayelement9 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="nodedisplayelement9">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}nodedisplayelement">
- *       &lt;sequence>
- *         &lt;element name="el10" type="{http://www.llview.de}nodedisplayelement" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "nodedisplayelement9", propOrder = {
-    "el10"
-})
-public class Nodedisplayelement9
-    extends Nodedisplayelement
- implements Serializable {
-
-    protected List<Nodedisplayelement> el10;
-
-    /**
-     * Gets the value of the el10 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el10 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl10().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link Nodedisplayelement }
-     * 
-     * 
-     */
-    public List<Nodedisplayelement> getEl10() {
-        if (el10 == null) {
-            el10 = new ArrayList<Nodedisplayelement>();
-        }
-        return this.el10;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/NodedisplaylayoutType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/NodedisplaylayoutType.java
deleted file mode 100644
index f32daf0..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/NodedisplaylayoutType.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Settings will not be inherited through hierarchy, but default layout will be set for all scheme-elements, which are not defined
- * 
- * <p>Java class for nodedisplaylayout_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="nodedisplaylayout_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}componentlayout_type">
- *       &lt;sequence>
- *         &lt;element name="el0" type="{http://www.llview.de}nodedisplayelement0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "nodedisplaylayout_type", propOrder = {
-    "el0"
-})
-public class NodedisplaylayoutType
-    extends ComponentlayoutType
- implements Serializable {
-
-    @XmlElement(required = true)
-    protected Nodedisplayelement0 el0;
-
-    /**
-     * Gets the value of the el0 property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Nodedisplayelement0 }
-     *     
-     */
-    public Nodedisplayelement0 getEl0() {
-        return el0;
-    }
-
-    /**
-     * Sets the value of the el0 property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Nodedisplayelement0 }
-     *     
-     */
-    public void setEl0(Nodedisplayelement0 value) {
-        this.el0 = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ObjectFactory.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ObjectFactory.java
deleted file mode 100644
index 08e2d01..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ObjectFactory.java
+++ /dev/null
@@ -1,899 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.annotation.XmlElementDecl;
-import javax.xml.bind.annotation.XmlRegistry;
-import javax.xml.namespace.QName;
-
-
-/**
- * This object contains factory methods for each 
- * Java content interface and Java element interface 
- * generated in the lml package. 
- * <p>An ObjectFactory allows you to programatically 
- * construct new instances of the Java representation 
- * for XML content. The Java representation of XML 
- * content can consist of schema derived interfaces 
- * and classes representing the binding of schema 
- * type definitions, element declarations and model 
- * groups.  Factory methods for each of these are 
- * provided in this class.
- * 
- */
-@XmlRegistry
-public class ObjectFactory  implements Serializable {
-
-    private final static QName _Lgui_QNAME = new QName("http://www.llview.de", "lgui");
-    private final static QName _LguiTypeInformation_QNAME = new QName("", "information");
-    private final static QName _LguiTypeText_QNAME = new QName("", "text");
-    private final static QName _LguiTypeUsagebarlayout_QNAME = new QName("", "usagebarlayout");
-    private final static QName _LguiTypeTablelayout_QNAME = new QName("", "tablelayout");
-    private final static QName _LguiTypeTable_QNAME = new QName("", "table");
-    private final static QName _LguiTypeSplitlayout_QNAME = new QName("", "splitlayout");
-    private final static QName _LguiTypeNodedisplay_QNAME = new QName("", "nodedisplay");
-    private final static QName _LguiTypeInfoboxlayout_QNAME = new QName("", "infoboxlayout");
-    private final static QName _LguiTypeUsagebar_QNAME = new QName("", "usagebar");
-    private final static QName _LguiTypeAbslayout_QNAME = new QName("", "abslayout");
-    private final static QName _LguiTypeRelations_QNAME = new QName("", "relations");
-    private final static QName _LguiTypeChartlayout_QNAME = new QName("", "chartlayout");
-    private final static QName _LguiTypeChart_QNAME = new QName("", "chart");
-    private final static QName _LguiTypeNodedisplaylayout_QNAME = new QName("", "nodedisplaylayout");
-    private final static QName _LguiTypeObjects_QNAME = new QName("", "objects");
-    private final static QName _LguiTypeChartgroup_QNAME = new QName("", "chartgroup");
-    private final static QName _LguiTypeInfobox_QNAME = new QName("", "infobox");
-    private final static QName _LguiTypeTextlayout_QNAME = new QName("", "textlayout");
-
-    /**
-     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: lml
-     * 
-     */
-    public ObjectFactory() {
-    }
-
-    /**
-     * Create an instance of {@link DataElement6 }
-     * 
-     */
-    public DataElement6 createDataElement6() {
-        return new DataElement6();
-    }
-
-    /**
-     * Create an instance of {@link SchemeElement1 }
-     * 
-     */
-    public SchemeElement1 createSchemeElement1() {
-        return new SchemeElement1();
-    }
-
-    /**
-     * Create an instance of {@link ComponentlayoutType }
-     * 
-     */
-    public ComponentlayoutType createComponentlayoutType() {
-        return new ComponentlayoutType();
-    }
-
-    /**
-     * Create an instance of {@link Nodedisplayelement3 }
-     * 
-     */
-    public Nodedisplayelement3 createNodedisplayelement3() {
-        return new Nodedisplayelement3();
-    }
-
-    /**
-     * Create an instance of {@link ComponentType }
-     * 
-     */
-    public ComponentType createComponentType() {
-        return new ComponentType();
-    }
-
-    /**
-     * Create an instance of {@link RelationsType }
-     * 
-     */
-    public RelationsType createRelationsType() {
-        return new RelationsType();
-    }
-
-    /**
-     * Create an instance of {@link RelationElementType }
-     * 
-     */
-    public RelationElementType createRelationElementType() {
-        return new RelationElementType();
-    }
-
-    /**
-     * Create an instance of {@link Nodedisplayelement7 }
-     * 
-     */
-    public Nodedisplayelement7 createNodedisplayelement7() {
-        return new Nodedisplayelement7();
-    }
-
-    /**
-     * Create an instance of {@link DataElement }
-     * 
-     */
-    public DataElement createDataElement() {
-        return new DataElement();
-    }
-
-    /**
-     * Create an instance of {@link InformationType }
-     * 
-     */
-    public InformationType createInformationType() {
-        return new InformationType();
-    }
-
-    /**
-     * Create an instance of {@link SplitlayoutType }
-     * 
-     */
-    public SplitlayoutType createSplitlayoutType() {
-        return new SplitlayoutType();
-    }
-
-    /**
-     * Create an instance of {@link LayoutType }
-     * 
-     */
-    public LayoutType createLayoutType() {
-        return new LayoutType();
-    }
-
-    /**
-     * Create an instance of {@link UsagebarlayoutType }
-     * 
-     */
-    public UsagebarlayoutType createUsagebarlayoutType() {
-        return new UsagebarlayoutType();
-    }
-
-    /**
-     * Create an instance of {@link PictureType }
-     * 
-     */
-    public PictureType createPictureType() {
-        return new PictureType();
-    }
-
-    /**
-     * Create an instance of {@link Nodedisplayelement1 }
-     * 
-     */
-    public Nodedisplayelement1 createNodedisplayelement1() {
-        return new Nodedisplayelement1();
-    }
-
-    /**
-     * Create an instance of {@link TiclabelType }
-     * 
-     */
-    public TiclabelType createTiclabelType() {
-        return new TiclabelType();
-    }
-
-    /**
-     * Create an instance of {@link PaneType }
-     * 
-     */
-    public PaneType createPaneType() {
-        return new PaneType();
-    }
-
-    /**
-     * Create an instance of {@link SchemeElement2 }
-     * 
-     */
-    public SchemeElement2 createSchemeElement2() {
-        return new SchemeElement2();
-    }
-
-    /**
-     * Create an instance of {@link SchemeElement5 }
-     * 
-     */
-    public SchemeElement5 createSchemeElement5() {
-        return new SchemeElement5();
-    }
-
-    /**
-     * Create an instance of {@link DataElement4 }
-     * 
-     */
-    public DataElement4 createDataElement4() {
-        return new DataElement4();
-    }
-
-    /**
-     * Create an instance of {@link InfoboxlayoutColtype }
-     * 
-     */
-    public InfoboxlayoutColtype createInfoboxlayoutColtype() {
-        return new InfoboxlayoutColtype();
-    }
-
-    /**
-     * Create an instance of {@link DatarectType }
-     * 
-     */
-    public DatarectType createDatarectType() {
-        return new DatarectType();
-    }
-
-    /**
-     * Create an instance of {@link TableType }
-     * 
-     */
-    public TableType createTableType() {
-        return new TableType();
-    }
-
-    /**
-     * Create an instance of {@link TextinfoType }
-     * 
-     */
-    public TextinfoType createTextinfoType() {
-        return new TextinfoType();
-    }
-
-    /**
-     * Create an instance of {@link InfoType }
-     * 
-     */
-    public InfoType createInfoType() {
-        return new InfoType();
-    }
-
-    /**
-     * Create an instance of {@link LguiType }
-     * 
-     */
-    public LguiType createLguiType() {
-        return new LguiType();
-    }
-
-    /**
-     * Create an instance of {@link DatacollectionType }
-     * 
-     */
-    public DatacollectionType createDatacollectionType() {
-        return new DatacollectionType();
-    }
-
-    /**
-     * Create an instance of {@link Nodedisplay }
-     * 
-     */
-    public Nodedisplay createNodedisplay() {
-        return new Nodedisplay();
-    }
-
-    /**
-     * Create an instance of {@link InfoboxlayoutType }
-     * 
-     */
-    public InfoboxlayoutType createInfoboxlayoutType() {
-        return new InfoboxlayoutType();
-    }
-
-    /**
-     * Create an instance of {@link SchemeType }
-     * 
-     */
-    public SchemeType createSchemeType() {
-        return new SchemeType();
-    }
-
-    /**
-     * Create an instance of {@link NodedisplaylayoutType }
-     * 
-     */
-    public NodedisplaylayoutType createNodedisplaylayoutType() {
-        return new NodedisplaylayoutType();
-    }
-
-    /**
-     * Create an instance of {@link RowType }
-     * 
-     */
-    public RowType createRowType() {
-        return new RowType();
-    }
-
-    /**
-     * Create an instance of {@link DataElement2 }
-     * 
-     */
-    public DataElement2 createDataElement2() {
-        return new DataElement2();
-    }
-
-    /**
-     * Create an instance of {@link TablelayoutType }
-     * 
-     */
-    public TablelayoutType createTablelayoutType() {
-        return new TablelayoutType();
-    }
-
-    /**
-     * Create an instance of {@link TextboxType }
-     * 
-     */
-    public TextboxType createTextboxType() {
-        return new TextboxType();
-    }
-
-    /**
-     * Create an instance of {@link AxisType }
-     * 
-     */
-    public AxisType createAxisType() {
-        return new AxisType();
-    }
-
-    /**
-     * Create an instance of {@link Nodedisplayelement }
-     * 
-     */
-    public Nodedisplayelement createNodedisplayelement() {
-        return new Nodedisplayelement();
-    }
-
-    /**
-     * Create an instance of {@link Nodedisplayelement4 }
-     * 
-     */
-    public Nodedisplayelement4 createNodedisplayelement4() {
-        return new Nodedisplayelement4();
-    }
-
-    /**
-     * Create an instance of {@link SchemeElement }
-     * 
-     */
-    public SchemeElement createSchemeElement() {
-        return new SchemeElement();
-    }
-
-    /**
-     * Create an instance of {@link ColumnType }
-     * 
-     */
-    public ColumnType createColumnType() {
-        return new ColumnType();
-    }
-
-    /**
-     * Create an instance of {@link JobPartType }
-     * 
-     */
-    public JobPartType createJobPartType() {
-        return new JobPartType();
-    }
-
-    /**
-     * Create an instance of {@link ColorconstantType }
-     * 
-     */
-    public ColorconstantType createColorconstantType() {
-        return new ColorconstantType();
-    }
-
-    /**
-     * Create an instance of {@link DataElement7 }
-     * 
-     */
-    public DataElement7 createDataElement7() {
-        return new DataElement7();
-    }
-
-    /**
-     * Create an instance of {@link DataElement9 }
-     * 
-     */
-    public DataElement9 createDataElement9() {
-        return new DataElement9();
-    }
-
-    /**
-     * Create an instance of {@link InfodataType }
-     * 
-     */
-    public InfodataType createInfodataType() {
-        return new InfodataType();
-    }
-
-    /**
-     * Create an instance of {@link InfoboxType }
-     * 
-     */
-    public InfoboxType createInfoboxType() {
-        return new InfoboxType();
-    }
-
-    /**
-     * Create an instance of {@link DataElement5 }
-     * 
-     */
-    public DataElement5 createDataElement5() {
-        return new DataElement5();
-    }
-
-    /**
-     * Create an instance of {@link CellType }
-     * 
-     */
-    public CellType createCellType() {
-        return new CellType();
-    }
-
-    /**
-     * Create an instance of {@link Nodedisplayelement5 }
-     * 
-     */
-    public Nodedisplayelement5 createNodedisplayelement5() {
-        return new Nodedisplayelement5();
-    }
-
-    /**
-     * Create an instance of {@link RelationType }
-     * 
-     */
-    public RelationType createRelationType() {
-        return new RelationType();
-    }
-
-    /**
-     * Create an instance of {@link ObjectType }
-     * 
-     */
-    public ObjectType createObjectType() {
-        return new ObjectType();
-    }
-
-    /**
-     * Create an instance of {@link ChartgroupType }
-     * 
-     */
-    public ChartgroupType createChartgroupType() {
-        return new ChartgroupType();
-    }
-
-    /**
-     * Create an instance of {@link SchemeElement3 }
-     * 
-     */
-    public SchemeElement3 createSchemeElement3() {
-        return new SchemeElement3();
-    }
-
-    /**
-     * Create an instance of {@link GobjectType }
-     * 
-     */
-    public GobjectType createGobjectType() {
-        return new GobjectType();
-    }
-
-    /**
-     * Create an instance of {@link ChartType }
-     * 
-     */
-    public ChartType createChartType() {
-        return new ChartType();
-    }
-
-    /**
-     * Create an instance of {@link AbslayoutType }
-     * 
-     */
-    public AbslayoutType createAbslayoutType() {
-        return new AbslayoutType();
-    }
-
-    /**
-     * Create an instance of {@link SchemeElement6 }
-     * 
-     */
-    public SchemeElement6 createSchemeElement6() {
-        return new SchemeElement6();
-    }
-
-    /**
-     * Create an instance of {@link Nodedisplayelement9 }
-     * 
-     */
-    public Nodedisplayelement9 createNodedisplayelement9() {
-        return new Nodedisplayelement9();
-    }
-
-    /**
-     * Create an instance of {@link DataElement8 }
-     * 
-     */
-    public DataElement8 createDataElement8() {
-        return new DataElement8();
-    }
-
-    /**
-     * Create an instance of {@link ColordefinitionType }
-     * 
-     */
-    public ColordefinitionType createColordefinitionType() {
-        return new ColordefinitionType();
-    }
-
-    /**
-     * Create an instance of {@link DatapointType }
-     * 
-     */
-    public DatapointType createDatapointType() {
-        return new DatapointType();
-    }
-
-    /**
-     * Create an instance of {@link Nodedisplayelement8 }
-     * 
-     */
-    public Nodedisplayelement8 createNodedisplayelement8() {
-        return new Nodedisplayelement8();
-    }
-
-    /**
-     * Create an instance of {@link AxesType }
-     * 
-     */
-    public AxesType createAxesType() {
-        return new AxesType();
-    }
-
-    /**
-     * Create an instance of {@link SchemeElement7 }
-     * 
-     */
-    public SchemeElement7 createSchemeElement7() {
-        return new SchemeElement7();
-    }
-
-    /**
-     * Create an instance of {@link ElementType }
-     * 
-     */
-    public ElementType createElementType() {
-        return new ElementType();
-    }
-
-    /**
-     * Create an instance of {@link DataElement10 }
-     * 
-     */
-    public DataElement10 createDataElement10() {
-        return new DataElement10();
-    }
-
-    /**
-     * Create an instance of {@link ColumnlayoutType }
-     * 
-     */
-    public ColumnlayoutType createColumnlayoutType() {
-        return new ColumnlayoutType();
-    }
-
-    /**
-     * Create an instance of {@link SchemeElement10 }
-     * 
-     */
-    public SchemeElement10 createSchemeElement10() {
-        return new SchemeElement10();
-    }
-
-    /**
-     * Create an instance of {@link DataType }
-     * 
-     */
-    public DataType createDataType() {
-        return new DataType();
-    }
-
-    /**
-     * Create an instance of {@link ObjectsType }
-     * 
-     */
-    public ObjectsType createObjectsType() {
-        return new ObjectsType();
-    }
-
-    /**
-     * Create an instance of {@link Nodedisplayelement2 }
-     * 
-     */
-    public Nodedisplayelement2 createNodedisplayelement2() {
-        return new Nodedisplayelement2();
-    }
-
-    /**
-     * Create an instance of {@link DataElement1 }
-     * 
-     */
-    public DataElement1 createDataElement1() {
-        return new DataElement1();
-    }
-
-    /**
-     * Create an instance of {@link SchemeElement9 }
-     * 
-     */
-    public SchemeElement9 createSchemeElement9() {
-        return new SchemeElement9();
-    }
-
-    /**
-     * Create an instance of {@link EntitiesType }
-     * 
-     */
-    public EntitiesType createEntitiesType() {
-        return new EntitiesType();
-    }
-
-    /**
-     * Create an instance of {@link JobType }
-     * 
-     */
-    public JobType createJobType() {
-        return new JobType();
-    }
-
-    /**
-     * Create an instance of {@link UsagebarType }
-     * 
-     */
-    public UsagebarType createUsagebarType() {
-        return new UsagebarType();
-    }
-
-    /**
-     * Create an instance of {@link Nodedisplayelement0 }
-     * 
-     */
-    public Nodedisplayelement0 createNodedisplayelement0() {
-        return new Nodedisplayelement0();
-    }
-
-    /**
-     * Create an instance of {@link SchemeElement8 }
-     * 
-     */
-    public SchemeElement8 createSchemeElement8() {
-        return new SchemeElement8();
-    }
-
-    /**
-     * Create an instance of {@link ChartlayoutType }
-     * 
-     */
-    public ChartlayoutType createChartlayoutType() {
-        return new ChartlayoutType();
-    }
-
-    /**
-     * Create an instance of {@link TiclabelsType }
-     * 
-     */
-    public TiclabelsType createTiclabelsType() {
-        return new TiclabelsType();
-    }
-
-    /**
-     * Create an instance of {@link DataElement3 }
-     * 
-     */
-    public DataElement3 createDataElement3() {
-        return new DataElement3();
-    }
-
-    /**
-     * Create an instance of {@link SchemeElement4 }
-     * 
-     */
-    public SchemeElement4 createSchemeElement4() {
-        return new SchemeElement4();
-    }
-
-    /**
-     * Create an instance of {@link Nodedisplayelement6 }
-     * 
-     */
-    public Nodedisplayelement6 createNodedisplayelement6() {
-        return new Nodedisplayelement6();
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link LguiType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "http://www.llview.de", name = "lgui")
-    public JAXBElement<LguiType> createLgui(LguiType value) {
-        return new JAXBElement<LguiType>(_Lgui_QNAME, LguiType.class, null, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link InformationType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "information", scope = LguiType.class)
-    public JAXBElement<InformationType> createLguiTypeInformation(InformationType value) {
-        return new JAXBElement<InformationType>(_LguiTypeInformation_QNAME, InformationType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link TextboxType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "text", scope = LguiType.class)
-    public JAXBElement<TextboxType> createLguiTypeText(TextboxType value) {
-        return new JAXBElement<TextboxType>(_LguiTypeText_QNAME, TextboxType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link UsagebarlayoutType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "usagebarlayout", scope = LguiType.class)
-    public JAXBElement<UsagebarlayoutType> createLguiTypeUsagebarlayout(UsagebarlayoutType value) {
-        return new JAXBElement<UsagebarlayoutType>(_LguiTypeUsagebarlayout_QNAME, UsagebarlayoutType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link TablelayoutType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "tablelayout", scope = LguiType.class)
-    public JAXBElement<TablelayoutType> createLguiTypeTablelayout(TablelayoutType value) {
-        return new JAXBElement<TablelayoutType>(_LguiTypeTablelayout_QNAME, TablelayoutType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link TableType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "table", scope = LguiType.class)
-    public JAXBElement<TableType> createLguiTypeTable(TableType value) {
-        return new JAXBElement<TableType>(_LguiTypeTable_QNAME, TableType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link SplitlayoutType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "splitlayout", scope = LguiType.class)
-    public JAXBElement<SplitlayoutType> createLguiTypeSplitlayout(SplitlayoutType value) {
-        return new JAXBElement<SplitlayoutType>(_LguiTypeSplitlayout_QNAME, SplitlayoutType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link Nodedisplay }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "nodedisplay", scope = LguiType.class)
-    public JAXBElement<Nodedisplay> createLguiTypeNodedisplay(Nodedisplay value) {
-        return new JAXBElement<Nodedisplay>(_LguiTypeNodedisplay_QNAME, Nodedisplay.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link InfoboxlayoutType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "infoboxlayout", scope = LguiType.class)
-    public JAXBElement<InfoboxlayoutType> createLguiTypeInfoboxlayout(InfoboxlayoutType value) {
-        return new JAXBElement<InfoboxlayoutType>(_LguiTypeInfoboxlayout_QNAME, InfoboxlayoutType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link UsagebarType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "usagebar", scope = LguiType.class)
-    public JAXBElement<UsagebarType> createLguiTypeUsagebar(UsagebarType value) {
-        return new JAXBElement<UsagebarType>(_LguiTypeUsagebar_QNAME, UsagebarType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link AbslayoutType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "abslayout", scope = LguiType.class)
-    public JAXBElement<AbslayoutType> createLguiTypeAbslayout(AbslayoutType value) {
-        return new JAXBElement<AbslayoutType>(_LguiTypeAbslayout_QNAME, AbslayoutType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link RelationsType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "relations", scope = LguiType.class)
-    public JAXBElement<RelationsType> createLguiTypeRelations(RelationsType value) {
-        return new JAXBElement<RelationsType>(_LguiTypeRelations_QNAME, RelationsType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link ChartlayoutType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "chartlayout", scope = LguiType.class)
-    public JAXBElement<ChartlayoutType> createLguiTypeChartlayout(ChartlayoutType value) {
-        return new JAXBElement<ChartlayoutType>(_LguiTypeChartlayout_QNAME, ChartlayoutType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link ChartType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "chart", scope = LguiType.class)
-    public JAXBElement<ChartType> createLguiTypeChart(ChartType value) {
-        return new JAXBElement<ChartType>(_LguiTypeChart_QNAME, ChartType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link NodedisplaylayoutType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "nodedisplaylayout", scope = LguiType.class)
-    public JAXBElement<NodedisplaylayoutType> createLguiTypeNodedisplaylayout(NodedisplaylayoutType value) {
-        return new JAXBElement<NodedisplaylayoutType>(_LguiTypeNodedisplaylayout_QNAME, NodedisplaylayoutType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link ObjectsType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "objects", scope = LguiType.class)
-    public JAXBElement<ObjectsType> createLguiTypeObjects(ObjectsType value) {
-        return new JAXBElement<ObjectsType>(_LguiTypeObjects_QNAME, ObjectsType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link ChartgroupType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "chartgroup", scope = LguiType.class)
-    public JAXBElement<ChartgroupType> createLguiTypeChartgroup(ChartgroupType value) {
-        return new JAXBElement<ChartgroupType>(_LguiTypeChartgroup_QNAME, ChartgroupType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link InfoboxType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "infobox", scope = LguiType.class)
-    public JAXBElement<InfoboxType> createLguiTypeInfobox(InfoboxType value) {
-        return new JAXBElement<InfoboxType>(_LguiTypeInfobox_QNAME, InfoboxType.class, LguiType.class, value);
-    }
-
-    /**
-     * Create an instance of {@link JAXBElement }{@code <}{@link InfoboxlayoutType }{@code >}}
-     * 
-     */
-    @XmlElementDecl(namespace = "", name = "textlayout", scope = LguiType.class)
-    public JAXBElement<InfoboxlayoutType> createLguiTypeTextlayout(InfoboxlayoutType value) {
-        return new JAXBElement<InfoboxlayoutType>(_LguiTypeTextlayout_QNAME, InfoboxlayoutType.class, LguiType.class, value);
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ObjectName.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ObjectName.java
deleted file mode 100644
index 96d3d4e..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ObjectName.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for object_name.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * <p>
- * <pre>
- * &lt;simpleType name="object_name">
- *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
- *     &lt;enumeration value="job"/>
- *     &lt;enumeration value="node"/>
- *     &lt;enumeration value="system"/>
- *     &lt;enumeration value="queue"/>
- *     &lt;enumeration value="scheduler"/>
- *     &lt;enumeration value="class"/>
- *     &lt;enumeration value="partition"/>
- *     &lt;enumeration value="partmap"/>
- *     &lt;enumeration value="smallpartition"/>
- *   &lt;/restriction>
- * &lt;/simpleType>
- * </pre>
- * 
- */
-@XmlType(name = "object_name")
-@XmlEnum
-public enum ObjectName {
-
-    @XmlEnumValue("job")
-    JOB("job"),
-    @XmlEnumValue("node")
-    NODE("node"),
-    @XmlEnumValue("system")
-    SYSTEM("system"),
-    @XmlEnumValue("queue")
-    QUEUE("queue"),
-    @XmlEnumValue("scheduler")
-    SCHEDULER("scheduler"),
-    @XmlEnumValue("class")
-    CLASS("class"),
-    @XmlEnumValue("partition")
-    PARTITION("partition"),
-    @XmlEnumValue("partmap")
-    PARTMAP("partmap"),
-    @XmlEnumValue("smallpartition")
-    SMALLPARTITION("smallpartition");
-    private final String value;
-
-    ObjectName(String v) {
-        value = v;
-    }
-
-    public String value() {
-        return value;
-    }
-
-    public static ObjectName fromValue(String v) {
-        for (ObjectName c: ObjectName.values()) {
-            if (c.value.equals(v)) {
-                return c;
-            }
-        }
-        throw new IllegalArgumentException(v);
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ObjectType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ObjectType.java
deleted file mode 100644
index 919a34f..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ObjectType.java
+++ /dev/null
@@ -1,163 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-
-/**
- * Defines one instance within the batch-system. 
- * For example one object could represent one job on the batch-system or one node.
- * Even the system is one object.
- * The color defines with which color this object is identified and painted.
- * 
- * <p>Java class for object_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="object_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="type" use="required" type="{http://www.llview.de}object_name" />
- *       &lt;attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}NCName" />
- *       &lt;attribute name="color" type="{http://www.llview.de}hexcolor_type" default="#FFF" />
- *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "object_type")
-public class ObjectType  implements Serializable {
-
-    @XmlAttribute(required = true)
-    protected ObjectName type;
-    @XmlAttribute(required = true)
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String id;
-    @XmlAttribute
-    protected String color;
-    @XmlAttribute
-    protected String name;
-
-    /**
-     * Gets the value of the type property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link ObjectName }
-     *     
-     */
-    public ObjectName getType() {
-        return type;
-    }
-
-    /**
-     * Sets the value of the type property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link ObjectName }
-     *     
-     */
-    public void setType(ObjectName value) {
-        this.type = value;
-    }
-
-    /**
-     * Gets the value of the id property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * Sets the value of the id property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setId(String value) {
-        this.id = value;
-    }
-
-    /**
-     * Gets the value of the color property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getColor() {
-        if (color == null) {
-            return "#FFF";
-        } else {
-            return color;
-        }
-    }
-
-    /**
-     * Sets the value of the color property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setColor(String value) {
-        this.color = value;
-    }
-
-    /**
-     * Gets the value of the name property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Sets the value of the name property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setName(String value) {
-        this.name = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ObjectsType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ObjectsType.java
deleted file mode 100644
index 2ace659..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/ObjectsType.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Collects a list of objects. Can only exist once in whole lml-file.
- * 
- * <p>Java class for objects_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="objects_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="object" type="{http://www.llview.de}object_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "objects_type", propOrder = {
-    "object"
-})
-public class ObjectsType  implements Serializable {
-
-    protected List<ObjectType> object;
-
-    /**
-     * Gets the value of the object property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the object property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getObject().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link ObjectType }
-     * 
-     * 
-     */
-    public List<ObjectType> getObject() {
-        if (object == null) {
-            object = new ArrayList<ObjectType>();
-        }
-        return this.object;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/PaneType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/PaneType.java
deleted file mode 100644
index 05d4165..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/PaneType.java
+++ /dev/null
@@ -1,226 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			Describes one side of a splitpane. This tag is later
- *     			transformed into a panel. You can split one panel with
- *     			left and right-components or top and bottom-components.
- *     			First split will cause a horizontal split, second will
- *     			cause a vertical split. The gid-attribute is for
- *     			referencing graphical object-id-attributes. If there are
- *     			child-elements for a pane, gid must not be specified.
- *     			Through the divpos-element you are able to set the
- *     			percentage of where to put the divider.
- *     		
- * 
- * <p>Java class for pane_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="pane_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;sequence minOccurs="0">
- *           &lt;element name="left" type="{http://www.llview.de}pane_type"/>
- *           &lt;element name="right" type="{http://www.llview.de}pane_type"/>
- *         &lt;/sequence>
- *         &lt;sequence minOccurs="0">
- *           &lt;element name="top" type="{http://www.llview.de}pane_type"/>
- *           &lt;element name="bottom" type="{http://www.llview.de}pane_type"/>
- *         &lt;/sequence>
- *       &lt;/sequence>
- *       &lt;attribute name="gid" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="divpos" type="{http://www.llview.de}divpos_type" default="0.5" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "pane_type", propOrder = {
-    "left",
-    "right",
-    "top",
-    "bottom"
-})
-public class PaneType  implements Serializable {
-
-    protected PaneType left;
-    protected PaneType right;
-    protected PaneType top;
-    protected PaneType bottom;
-    @XmlAttribute
-    protected String gid;
-    @XmlAttribute
-    protected Double divpos;
-
-    /**
-     * Gets the value of the left property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link PaneType }
-     *     
-     */
-    public PaneType getLeft() {
-        return left;
-    }
-
-    /**
-     * Sets the value of the left property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link PaneType }
-     *     
-     */
-    public void setLeft(PaneType value) {
-        this.left = value;
-    }
-
-    /**
-     * Gets the value of the right property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link PaneType }
-     *     
-     */
-    public PaneType getRight() {
-        return right;
-    }
-
-    /**
-     * Sets the value of the right property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link PaneType }
-     *     
-     */
-    public void setRight(PaneType value) {
-        this.right = value;
-    }
-
-    /**
-     * Gets the value of the top property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link PaneType }
-     *     
-     */
-    public PaneType getTop() {
-        return top;
-    }
-
-    /**
-     * Sets the value of the top property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link PaneType }
-     *     
-     */
-    public void setTop(PaneType value) {
-        this.top = value;
-    }
-
-    /**
-     * Gets the value of the bottom property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link PaneType }
-     *     
-     */
-    public PaneType getBottom() {
-        return bottom;
-    }
-
-    /**
-     * Sets the value of the bottom property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link PaneType }
-     *     
-     */
-    public void setBottom(PaneType value) {
-        this.bottom = value;
-    }
-
-    /**
-     * Gets the value of the gid property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getGid() {
-        return gid;
-    }
-
-    /**
-     * Sets the value of the gid property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setGid(String value) {
-        this.gid = value;
-    }
-
-    /**
-     * Gets the value of the divpos property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Double }
-     *     
-     */
-    public double getDivpos() {
-        if (divpos == null) {
-            return  0.5D;
-        } else {
-            return divpos;
-        }
-    }
-
-    /**
-     * Sets the value of the divpos property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Double }
-     *     
-     */
-    public void setDivpos(Double value) {
-        this.divpos = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/PictureType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/PictureType.java
deleted file mode 100644
index 81ce883..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/PictureType.java
+++ /dev/null
@@ -1,198 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			describes a picture, which can be aligned
- *     		
- * 
- * <p>Java class for picture_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="picture_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="src" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
- *       &lt;attribute name="align" type="{http://www.llview.de}align_type" default="CENTER" />
- *       &lt;attribute name="width" type="{http://www.llview.de}percent_type" default="0.1" />
- *       &lt;attribute name="height" type="{http://www.llview.de}percent_type" default="0.1" />
- *       &lt;attribute name="inneralign" type="{http://www.llview.de}align_type" default="CENTER" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "picture_type")
-public class PictureType  implements Serializable {
-
-    @XmlAttribute(required = true)
-    @XmlSchemaType(name = "anyURI")
-    protected String src;
-    @XmlAttribute
-    protected AlignType align;
-    @XmlAttribute
-    protected Double width;
-    @XmlAttribute
-    protected Double height;
-    @XmlAttribute
-    protected AlignType inneralign;
-
-    /**
-     * Gets the value of the src property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getSrc() {
-        return src;
-    }
-
-    /**
-     * Sets the value of the src property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setSrc(String value) {
-        this.src = value;
-    }
-
-    /**
-     * Gets the value of the align property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link AlignType }
-     *     
-     */
-    public AlignType getAlign() {
-        if (align == null) {
-            return AlignType.CENTER;
-        } else {
-            return align;
-        }
-    }
-
-    /**
-     * Sets the value of the align property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link AlignType }
-     *     
-     */
-    public void setAlign(AlignType value) {
-        this.align = value;
-    }
-
-    /**
-     * Gets the value of the width property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Double }
-     *     
-     */
-    public double getWidth() {
-        if (width == null) {
-            return  0.1D;
-        } else {
-            return width;
-        }
-    }
-
-    /**
-     * Sets the value of the width property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Double }
-     *     
-     */
-    public void setWidth(Double value) {
-        this.width = value;
-    }
-
-    /**
-     * Gets the value of the height property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Double }
-     *     
-     */
-    public double getHeight() {
-        if (height == null) {
-            return  0.1D;
-        } else {
-            return height;
-        }
-    }
-
-    /**
-     * Sets the value of the height property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Double }
-     *     
-     */
-    public void setHeight(Double value) {
-        this.height = value;
-    }
-
-    /**
-     * Gets the value of the inneralign property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link AlignType }
-     *     
-     */
-    public AlignType getInneralign() {
-        if (inneralign == null) {
-            return AlignType.CENTER;
-        } else {
-            return inneralign;
-        }
-    }
-
-    /**
-     * Sets the value of the inneralign property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link AlignType }
-     *     
-     */
-    public void setInneralign(AlignType value) {
-        this.inneralign = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/RelationElementType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/RelationElementType.java
deleted file mode 100644
index ec6c75f..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/RelationElementType.java
+++ /dev/null
@@ -1,73 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-
-/**
- * <p>Java class for relation_element_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="relation_element_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="refid" type="{http://www.w3.org/2001/XMLSchema}NCName" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "relation_element_type")
-public class RelationElementType  implements Serializable {
-
-    @XmlAttribute
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String refid;
-
-    /**
-     * Gets the value of the refid property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getRefid() {
-        return refid;
-    }
-
-    /**
-     * Sets the value of the refid property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setRefid(String value) {
-        this.refid = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/RelationType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/RelationType.java
deleted file mode 100644
index 1398783..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/RelationType.java
+++ /dev/null
@@ -1,173 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-
-/**
- * 
- *     			A set of objects, which are related to each other. Could
- *     			contain a list of jobs of one user. If any job in the
- *     			relation is focused, every job in this set will be
- *     			highlighted. keyid can be used to define objects which are connected to all added objects in this relation_type. If keyid is not defined, all elements in this tag will be used as keys.
- *     		
- * 
- * <p>Java class for relation_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="relation_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="el" type="{http://www.llview.de}relation_element_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}NCName" />
- *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       &lt;attribute name="keyid" type="{http://www.w3.org/2001/XMLSchema}NCName" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "relation_type", propOrder = {
-    "el"
-})
-public class RelationType  implements Serializable {
-
-    protected List<RelationElementType> el;
-    @XmlAttribute(required = true)
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String id;
-    @XmlAttribute
-    protected String name;
-    @XmlAttribute
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String keyid;
-
-    /**
-     * Gets the value of the el property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link RelationElementType }
-     * 
-     * 
-     */
-    public List<RelationElementType> getEl() {
-        if (el == null) {
-            el = new ArrayList<RelationElementType>();
-        }
-        return this.el;
-    }
-
-    /**
-     * Gets the value of the id property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * Sets the value of the id property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setId(String value) {
-        this.id = value;
-    }
-
-    /**
-     * Gets the value of the name property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Sets the value of the name property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setName(String value) {
-        this.name = value;
-    }
-
-    /**
-     * Gets the value of the keyid property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getKeyid() {
-        return keyid;
-    }
-
-    /**
-     * Sets the value of the keyid property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setKeyid(String value) {
-        this.keyid = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/RelationsType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/RelationsType.java
deleted file mode 100644
index c4eb25a..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/RelationsType.java
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for relations_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="relations_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="rel" type="{http://www.llview.de}relation_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "relations_type", propOrder = {
-    "rel"
-})
-public class RelationsType  implements Serializable {
-
-    protected List<RelationType> rel;
-
-    /**
-     * Gets the value of the rel property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the rel property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getRel().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link RelationType }
-     * 
-     * 
-     */
-    public List<RelationType> getRel() {
-        if (rel == null) {
-            rel = new ArrayList<RelationType>();
-        }
-        return this.rel;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/RowType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/RowType.java
deleted file mode 100644
index 3d0cb48..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/RowType.java
+++ /dev/null
@@ -1,112 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-
-/**
- * One row in final table.
- * 
- * <p>Java class for row_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="row_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="cell" type="{http://www.llview.de}cell_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="oid" type="{http://www.w3.org/2001/XMLSchema}NCName" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "row_type", propOrder = {
-    "cell"
-})
-public class RowType  implements Serializable {
-
-    protected List<CellType> cell;
-    @XmlAttribute
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String oid;
-
-    /**
-     * Gets the value of the cell property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the cell property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getCell().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link CellType }
-     * 
-     * 
-     */
-    public List<CellType> getCell() {
-        if (cell == null) {
-            cell = new ArrayList<CellType>();
-        }
-        return this.cell;
-    }
-
-    /**
-     * Gets the value of the oid property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getOid() {
-        return oid;
-    }
-
-    /**
-     * Sets the value of the oid property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setOid(String value) {
-        this.oid = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement.java
deleted file mode 100644
index fbc38bf..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement.java
+++ /dev/null
@@ -1,191 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.math.BigInteger;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-
-/**
- * 
- *     			All el?-tags will be subtypes of this type. Tagname has
- *     			to be defined here. Data-elements must not repeat this
- *     			tagname.
- *     		
- * 
- * <p>Java class for scheme_element complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="scheme_element">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}element_type">
- *       &lt;attribute name="tagname" type="{http://www.w3.org/2001/XMLSchema}NCName" />
- *       &lt;attribute name="mask" default="%d-">
- *         &lt;simpleType>
- *           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
- *             &lt;pattern value="(([^%])*%(\-|\+|\s|\#)*0(\-|\+|\s|\#)*(\d)+d([^%])*)|(([^%])*%(\-|\+|\s|\#)*d([^%\d])+)|(([^%])*%(\-|\+|\s|\#)*1d([^%])*)"/>
- *           &lt;/restriction>
- *         &lt;/simpleType>
- *       &lt;/attribute>
- *       &lt;attribute name="step" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" default="1" />
- *       &lt;attribute name="map" type="{http://www.llview.de}namemapping_type" />
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "scheme_element")
-@XmlSeeAlso({
-    SchemeElement1 .class,
-    SchemeElement9 .class,
-    SchemeElement8 .class,
-    SchemeElement7 .class,
-    SchemeElement6 .class,
-    SchemeElement5 .class,
-    SchemeElement4 .class,
-    SchemeElement3 .class,
-    SchemeElement2 .class,
-    SchemeElement10 .class
-})
-public class SchemeElement
-    extends ElementType
- implements Serializable {
-
-    @XmlAttribute
-    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
-    @XmlSchemaType(name = "NCName")
-    protected String tagname;
-    @XmlAttribute
-    protected String mask;
-    @XmlAttribute
-    @XmlSchemaType(name = "positiveInteger")
-    protected BigInteger step;
-    @XmlAttribute
-    protected String map;
-
-    /**
-     * Gets the value of the tagname property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getTagname() {
-        return tagname;
-    }
-
-    /**
-     * Sets the value of the tagname property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setTagname(String value) {
-        this.tagname = value;
-    }
-
-    /**
-     * Gets the value of the mask property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getMask() {
-        if (mask == null) {
-            return "%d-";
-        } else {
-            return mask;
-        }
-    }
-
-    /**
-     * Sets the value of the mask property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setMask(String value) {
-        this.mask = value;
-    }
-
-    /**
-     * Gets the value of the step property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getStep() {
-        if (step == null) {
-            return new BigInteger("1");
-        } else {
-            return step;
-        }
-    }
-
-    /**
-     * Sets the value of the step property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setStep(BigInteger value) {
-        this.step = value;
-    }
-
-    /**
-     * Gets the value of the map property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getMap() {
-        return map;
-    }
-
-    /**
-     * Sets the value of the map property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setMap(String value) {
-        this.map = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement1.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement1.java
deleted file mode 100644
index 90bde44..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement1.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for scheme_element1 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="scheme_element1">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}scheme_element">
- *       &lt;sequence>
- *         &lt;element name="el2" type="{http://www.llview.de}scheme_element2" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "scheme_element1", propOrder = {
-    "el2"
-})
-public class SchemeElement1
-    extends SchemeElement
- implements Serializable {
-
-    protected List<SchemeElement2> el2;
-
-    /**
-     * Gets the value of the el2 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el2 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl2().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link SchemeElement2 }
-     * 
-     * 
-     */
-    public List<SchemeElement2> getEl2() {
-        if (el2 == null) {
-            el2 = new ArrayList<SchemeElement2>();
-        }
-        return this.el2;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement10.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement10.java
deleted file mode 100644
index 08e4b66..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement10.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for scheme_element10 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="scheme_element10">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}scheme_element">
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "scheme_element10")
-public class SchemeElement10
-    extends SchemeElement
- implements Serializable {
-
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement2.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement2.java
deleted file mode 100644
index 3bc2ec1..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement2.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for scheme_element2 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="scheme_element2">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}scheme_element">
- *       &lt;sequence>
- *         &lt;element name="el3" type="{http://www.llview.de}scheme_element3" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "scheme_element2", propOrder = {
-    "el3"
-})
-public class SchemeElement2
-    extends SchemeElement
- implements Serializable {
-
-    protected List<SchemeElement3> el3;
-
-    /**
-     * Gets the value of the el3 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el3 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl3().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link SchemeElement3 }
-     * 
-     * 
-     */
-    public List<SchemeElement3> getEl3() {
-        if (el3 == null) {
-            el3 = new ArrayList<SchemeElement3>();
-        }
-        return this.el3;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement3.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement3.java
deleted file mode 100644
index 6e4a818..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement3.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for scheme_element3 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="scheme_element3">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}scheme_element">
- *       &lt;sequence>
- *         &lt;element name="el4" type="{http://www.llview.de}scheme_element4" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "scheme_element3", propOrder = {
-    "el4"
-})
-public class SchemeElement3
-    extends SchemeElement
- implements Serializable {
-
-    protected List<SchemeElement4> el4;
-
-    /**
-     * Gets the value of the el4 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el4 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl4().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link SchemeElement4 }
-     * 
-     * 
-     */
-    public List<SchemeElement4> getEl4() {
-        if (el4 == null) {
-            el4 = new ArrayList<SchemeElement4>();
-        }
-        return this.el4;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement4.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement4.java
deleted file mode 100644
index 51caabf..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement4.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for scheme_element4 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="scheme_element4">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}scheme_element">
- *       &lt;sequence>
- *         &lt;element name="el5" type="{http://www.llview.de}scheme_element5" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "scheme_element4", propOrder = {
-    "el5"
-})
-public class SchemeElement4
-    extends SchemeElement
- implements Serializable {
-
-    protected List<SchemeElement5> el5;
-
-    /**
-     * Gets the value of the el5 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el5 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl5().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link SchemeElement5 }
-     * 
-     * 
-     */
-    public List<SchemeElement5> getEl5() {
-        if (el5 == null) {
-            el5 = new ArrayList<SchemeElement5>();
-        }
-        return this.el5;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement5.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement5.java
deleted file mode 100644
index f416508..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement5.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for scheme_element5 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="scheme_element5">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}scheme_element">
- *       &lt;sequence>
- *         &lt;element name="el6" type="{http://www.llview.de}scheme_element6" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "scheme_element5", propOrder = {
-    "el6"
-})
-public class SchemeElement5
-    extends SchemeElement
- implements Serializable {
-
-    protected List<SchemeElement6> el6;
-
-    /**
-     * Gets the value of the el6 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el6 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl6().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link SchemeElement6 }
-     * 
-     * 
-     */
-    public List<SchemeElement6> getEl6() {
-        if (el6 == null) {
-            el6 = new ArrayList<SchemeElement6>();
-        }
-        return this.el6;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement6.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement6.java
deleted file mode 100644
index 4bddb6a..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement6.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for scheme_element6 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="scheme_element6">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}scheme_element">
- *       &lt;sequence>
- *         &lt;element name="el7" type="{http://www.llview.de}scheme_element7" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "scheme_element6", propOrder = {
-    "el7"
-})
-public class SchemeElement6
-    extends SchemeElement
- implements Serializable {
-
-    protected List<SchemeElement7> el7;
-
-    /**
-     * Gets the value of the el7 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el7 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl7().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link SchemeElement7 }
-     * 
-     * 
-     */
-    public List<SchemeElement7> getEl7() {
-        if (el7 == null) {
-            el7 = new ArrayList<SchemeElement7>();
-        }
-        return this.el7;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement7.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement7.java
deleted file mode 100644
index 1271ccd..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement7.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for scheme_element7 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="scheme_element7">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}scheme_element">
- *       &lt;sequence>
- *         &lt;element name="el8" type="{http://www.llview.de}scheme_element8" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "scheme_element7", propOrder = {
-    "el8"
-})
-public class SchemeElement7
-    extends SchemeElement
- implements Serializable {
-
-    protected List<SchemeElement8> el8;
-
-    /**
-     * Gets the value of the el8 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el8 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl8().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link SchemeElement8 }
-     * 
-     * 
-     */
-    public List<SchemeElement8> getEl8() {
-        if (el8 == null) {
-            el8 = new ArrayList<SchemeElement8>();
-        }
-        return this.el8;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement8.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement8.java
deleted file mode 100644
index b65729e..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement8.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for scheme_element8 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="scheme_element8">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}scheme_element">
- *       &lt;sequence>
- *         &lt;element name="el9" type="{http://www.llview.de}scheme_element9" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "scheme_element8", propOrder = {
-    "el9"
-})
-public class SchemeElement8
-    extends SchemeElement
- implements Serializable {
-
-    protected List<SchemeElement9> el9;
-
-    /**
-     * Gets the value of the el9 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el9 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl9().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link SchemeElement9 }
-     * 
-     * 
-     */
-    public List<SchemeElement9> getEl9() {
-        if (el9 == null) {
-            el9 = new ArrayList<SchemeElement9>();
-        }
-        return this.el9;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement9.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement9.java
deleted file mode 100644
index 8ef5a05..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeElement9.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for scheme_element9 complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="scheme_element9">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}scheme_element">
- *       &lt;sequence>
- *         &lt;element name="el10" type="{http://www.llview.de}scheme_element10" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "scheme_element9", propOrder = {
-    "el10"
-})
-public class SchemeElement9
-    extends SchemeElement
- implements Serializable {
-
-    protected List<SchemeElement10> el10;
-
-    /**
-     * Gets the value of the el10 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el10 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl10().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link SchemeElement10 }
-     * 
-     * 
-     */
-    public List<SchemeElement10> getEl10() {
-        if (el10 == null) {
-            el10 = new ArrayList<SchemeElement10>();
-        }
-        return this.el10;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeType.java
deleted file mode 100644
index 164e885..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SchemeType.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Scheme description of batch-system. Describes an empty instance of the actual batch system.
- * 
- * <p>Java class for scheme_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="scheme_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="el1" type="{http://www.llview.de}scheme_element1" maxOccurs="unbounded"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "scheme_type", propOrder = {
-    "el1"
-})
-public class SchemeType  implements Serializable {
-
-    @XmlElement(required = true)
-    protected List<SchemeElement1> el1;
-
-    /**
-     * Gets the value of the el1 property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the el1 property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getEl1().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link SchemeElement1 }
-     * 
-     * 
-     */
-    public List<SchemeElement1> getEl1() {
-        if (el1 == null) {
-            el1 = new ArrayList<SchemeElement1>();
-        }
-        return this.el1;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SortingType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SortingType.java
deleted file mode 100644
index 412ac76..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SortingType.java
+++ /dev/null
@@ -1,61 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for sorting_type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * <p>
- * <pre>
- * &lt;simpleType name="sorting_type">
- *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
- *     &lt;enumeration value="numeric"/>
- *     &lt;enumeration value="alpha"/>
- *     &lt;enumeration value="date"/>
- *   &lt;/restriction>
- * &lt;/simpleType>
- * </pre>
- * 
- */
-@XmlType(name = "sorting_type")
-@XmlEnum
-public enum SortingType {
-
-    @XmlEnumValue("numeric")
-    NUMERIC("numeric"),
-    @XmlEnumValue("alpha")
-    ALPHA("alpha"),
-    @XmlEnumValue("date")
-    DATE("date");
-    private final String value;
-
-    SortingType(String v) {
-        value = v;
-    }
-
-    public String value() {
-        return value;
-    }
-
-    public static SortingType fromValue(String v) {
-        for (SortingType c: SortingType.values()) {
-            if (c.value.equals(v)) {
-                return c;
-            }
-        }
-        throw new IllegalArgumentException(v);
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SplitlayoutType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SplitlayoutType.java
deleted file mode 100644
index d126098..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/SplitlayoutType.java
+++ /dev/null
@@ -1,189 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for splitlayout_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="splitlayout_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}layout_type">
- *       &lt;choice>
- *         &lt;sequence>
- *           &lt;element name="left" type="{http://www.llview.de}pane_type"/>
- *           &lt;element name="right" type="{http://www.llview.de}pane_type"/>
- *         &lt;/sequence>
- *         &lt;sequence>
- *           &lt;element name="top" type="{http://www.llview.de}pane_type"/>
- *           &lt;element name="bottom" type="{http://www.llview.de}pane_type"/>
- *         &lt;/sequence>
- *       &lt;/choice>
- *       &lt;attribute name="divpos" type="{http://www.llview.de}divpos_type" default="0.5" />
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "splitlayout_type", propOrder = {
-    "left",
-    "right",
-    "top",
-    "bottom"
-})
-public class SplitlayoutType
-    extends LayoutType
- implements Serializable {
-
-    protected PaneType left;
-    protected PaneType right;
-    protected PaneType top;
-    protected PaneType bottom;
-    @XmlAttribute
-    protected Double divpos;
-
-    /**
-     * Gets the value of the left property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link PaneType }
-     *     
-     */
-    public PaneType getLeft() {
-        return left;
-    }
-
-    /**
-     * Sets the value of the left property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link PaneType }
-     *     
-     */
-    public void setLeft(PaneType value) {
-        this.left = value;
-    }
-
-    /**
-     * Gets the value of the right property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link PaneType }
-     *     
-     */
-    public PaneType getRight() {
-        return right;
-    }
-
-    /**
-     * Sets the value of the right property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link PaneType }
-     *     
-     */
-    public void setRight(PaneType value) {
-        this.right = value;
-    }
-
-    /**
-     * Gets the value of the top property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link PaneType }
-     *     
-     */
-    public PaneType getTop() {
-        return top;
-    }
-
-    /**
-     * Sets the value of the top property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link PaneType }
-     *     
-     */
-    public void setTop(PaneType value) {
-        this.top = value;
-    }
-
-    /**
-     * Gets the value of the bottom property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link PaneType }
-     *     
-     */
-    public PaneType getBottom() {
-        return bottom;
-    }
-
-    /**
-     * Sets the value of the bottom property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link PaneType }
-     *     
-     */
-    public void setBottom(PaneType value) {
-        this.bottom = value;
-    }
-
-    /**
-     * Gets the value of the divpos property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link Double }
-     *     
-     */
-    public double getDivpos() {
-        if (divpos == null) {
-            return  0.5D;
-        } else {
-            return divpos;
-        }
-    }
-
-    /**
-     * Sets the value of the divpos property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link Double }
-     *     
-     */
-    public void setDivpos(Double value) {
-        this.divpos = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TableType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TableType.java
deleted file mode 100644
index 0a21b7a..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TableType.java
+++ /dev/null
@@ -1,117 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			An abstract table. Defines several columns, which can be
- *     			sorted by different datatypes. Then data is defined in
- *     			row-tags, which can be linked with object-tags.
- *     		
- * 
- * <p>Java class for table_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="table_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}gobject_type">
- *       &lt;sequence>
- *         &lt;element name="column" type="{http://www.llview.de}column_type" maxOccurs="unbounded" minOccurs="0"/>
- *         &lt;element name="row" type="{http://www.llview.de}row_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "table_type", propOrder = {
-    "column",
-    "row"
-})
-public class TableType
-    extends GobjectType
- implements Serializable {
-
-    protected List<ColumnType> column;
-    protected List<RowType> row;
-
-    /**
-     * Gets the value of the column property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the column property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getColumn().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link ColumnType }
-     * 
-     * 
-     */
-    public List<ColumnType> getColumn() {
-        if (column == null) {
-            column = new ArrayList<ColumnType>();
-        }
-        return this.column;
-    }
-
-    /**
-     * Gets the value of the row property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the row property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getRow().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link RowType }
-     * 
-     * 
-     */
-    public List<RowType> getRow() {
-        if (row == null) {
-            row = new ArrayList<RowType>();
-        }
-        return this.row;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TablelayoutType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TablelayoutType.java
deleted file mode 100644
index 4bfdb6c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TablelayoutType.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Layout for a table
- * 
- * <p>Java class for tablelayout_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="tablelayout_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}componentlayout_type">
- *       &lt;sequence>
- *         &lt;element name="column" type="{http://www.llview.de}columnlayout_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "tablelayout_type", propOrder = {
-    "column"
-})
-public class TablelayoutType
-    extends ComponentlayoutType
- implements Serializable {
-
-    protected List<ColumnlayoutType> column;
-
-    /**
-     * Gets the value of the column property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the column property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getColumn().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link ColumnlayoutType }
-     * 
-     * 
-     */
-    public List<ColumnlayoutType> getColumn() {
-        if (column == null) {
-            column = new ArrayList<ColumnlayoutType>();
-        }
-        return this.column;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TextboxType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TextboxType.java
deleted file mode 100644
index 8b098e3..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TextboxType.java
+++ /dev/null
@@ -1,99 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for textbox_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="textbox_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}gobject_type">
- *       &lt;choice>
- *         &lt;element name="text" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         &lt;element name="info" type="{http://www.llview.de}textinfo_type"/>
- *       &lt;/choice>
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "textbox_type", propOrder = {
-    "text",
-    "info"
-})
-public class TextboxType
-    extends GobjectType
- implements Serializable {
-
-    protected String text;
-    protected TextinfoType info;
-
-    /**
-     * Gets the value of the text property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getText() {
-        return text;
-    }
-
-    /**
-     * Sets the value of the text property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setText(String value) {
-        this.text = value;
-    }
-
-    /**
-     * Gets the value of the info property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link TextinfoType }
-     *     
-     */
-    public TextinfoType getInfo() {
-        return info;
-    }
-
-    /**
-     * Sets the value of the info property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link TextinfoType }
-     *     
-     */
-    public void setInfo(TextinfoType value) {
-        this.info = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TextinfoType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TextinfoType.java
deleted file mode 100644
index 7cad1d3..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TextinfoType.java
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * <p>Java class for textinfo_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="textinfo_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="data" type="{http://www.llview.de}infodata_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "textinfo_type", propOrder = {
-    "data"
-})
-public class TextinfoType  implements Serializable {
-
-    protected List<InfodataType> data;
-
-    /**
-     * Gets the value of the data property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the data property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getData().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link InfodataType }
-     * 
-     * 
-     */
-    public List<InfodataType> getData() {
-        if (data == null) {
-            data = new ArrayList<InfodataType>();
-        }
-        return this.data;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TiclabelType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TiclabelType.java
deleted file mode 100644
index 706882d..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TiclabelType.java
+++ /dev/null
@@ -1,89 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * One ticlabel is one name or string, that is shown on an axis instead of a numerical value. The tic-labels will be shown in addition to normal tic-labels given by inserting ticcount-times a numerical value into the axis.
- * 
- * <p>Java class for ticlabel_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="ticlabel_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;attribute name="pos" use="required" type="{http://www.w3.org/2001/XMLSchema}double" />
- *       &lt;attribute name="text" type="{http://www.w3.org/2001/XMLSchema}string" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "ticlabel_type")
-public class TiclabelType  implements Serializable {
-
-    @XmlAttribute(required = true)
-    protected double pos;
-    @XmlAttribute
-    protected String text;
-
-    /**
-     * Gets the value of the pos property.
-     * 
-     */
-    public double getPos() {
-        return pos;
-    }
-
-    /**
-     * Sets the value of the pos property.
-     * 
-     */
-    public void setPos(double value) {
-        this.pos = value;
-    }
-
-    /**
-     * Gets the value of the text property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getText() {
-        return text;
-    }
-
-    /**
-     * Sets the value of the text property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setText(String value) {
-        this.text = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TiclabelsType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TiclabelsType.java
deleted file mode 100644
index bc77816..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/TiclabelsType.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Collects a list of ticlabels.
- * 
- * <p>Java class for ticlabels_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="ticlabels_type">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="label" type="{http://www.llview.de}ticlabel_type" maxOccurs="unbounded"/>
- *       &lt;/sequence>
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "ticlabels_type", propOrder = {
-    "label"
-})
-public class TiclabelsType  implements Serializable {
-
-    @XmlElement(required = true)
-    protected List<TiclabelType> label;
-
-    /**
-     * Gets the value of the label property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the label property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getLabel().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link TiclabelType }
-     * 
-     * 
-     */
-    public List<TiclabelType> getLabel() {
-        if (label == null) {
-            label = new ArrayList<TiclabelType>();
-        }
-        return this.label;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/UsagebarType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/UsagebarType.java
deleted file mode 100644
index 029841e..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/UsagebarType.java
+++ /dev/null
@@ -1,148 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			Defines several jobs, that are now running on the
- *     			system. CpuCount can be computed by adding all
- *     			cpuCount-attributes of the defined job-tags.
- *     		
- * 
- * <p>Java class for usagebar_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="usagebar_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}gobject_type">
- *       &lt;sequence>
- *         &lt;element name="job" type="{http://www.llview.de}job_type" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="cpucount" use="required" type="{http://www.w3.org/2001/XMLSchema}nonNegativeInteger" />
- *       &lt;attribute name="cpupernode" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" default="1" />
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "usagebar_type", propOrder = {
-    "job"
-})
-public class UsagebarType
-    extends GobjectType
- implements Serializable {
-
-    protected List<JobType> job;
-    @XmlAttribute(required = true)
-    @XmlSchemaType(name = "nonNegativeInteger")
-    protected BigInteger cpucount;
-    @XmlAttribute
-    @XmlSchemaType(name = "positiveInteger")
-    protected BigInteger cpupernode;
-
-    /**
-     * Gets the value of the job property.
-     * 
-     * <p>
-     * This accessor method returns a reference to the live list,
-     * not a snapshot. Therefore any modification you make to the
-     * returned list will be present inside the JAXB object.
-     * This is why there is not a <CODE>set</CODE> method for the job property.
-     * 
-     * <p>
-     * For example, to add a new item, do as follows:
-     * <pre>
-     *    getJob().add(newItem);
-     * </pre>
-     * 
-     * 
-     * <p>
-     * Objects of the following type(s) are allowed in the list
-     * {@link JobType }
-     * 
-     * 
-     */
-    public List<JobType> getJob() {
-        if (job == null) {
-            job = new ArrayList<JobType>();
-        }
-        return this.job;
-    }
-
-    /**
-     * Gets the value of the cpucount property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getCpucount() {
-        return cpucount;
-    }
-
-    /**
-     * Sets the value of the cpucount property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setCpucount(BigInteger value) {
-        this.cpucount = value;
-    }
-
-    /**
-     * Gets the value of the cpupernode property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getCpupernode() {
-        if (cpupernode == null) {
-            return new BigInteger("1");
-        } else {
-            return cpupernode;
-        }
-    }
-
-    /**
-     * Sets the value of the cpupernode property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setCpupernode(BigInteger value) {
-        this.cpupernode = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/UsagebarlayoutType.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/UsagebarlayoutType.java
deleted file mode 100644
index 6527330..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/UsagebarlayoutType.java
+++ /dev/null
@@ -1,119 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-
-package org.eclipse.ptp.rm.lml.internal.core.elements;
-
-import java.io.Serializable;
-
-
-import java.math.BigInteger;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * 
- *     			Define special layout-options for a usagebar
- *     		
- * 
- * <p>Java class for usagebarlayout_type complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
- * <pre>
- * &lt;complexType name="usagebarlayout_type">
- *   &lt;complexContent>
- *     &lt;extension base="{http://www.llview.de}componentlayout_type">
- *       &lt;attribute name="scale" default="nodes">
- *         &lt;simpleType>
- *           &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string">
- *             &lt;enumeration value="nodes"/>
- *             &lt;enumeration value="cpus"/>
- *           &lt;/restriction>
- *         &lt;/simpleType>
- *       &lt;/attribute>
- *       &lt;attribute name="interval" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" default="4" />
- *     &lt;/extension>
- *   &lt;/complexContent>
- * &lt;/complexType>
- * </pre>
- * 
- * 
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "usagebarlayout_type")
-public class UsagebarlayoutType
-    extends ComponentlayoutType
- implements Serializable {
-
-    @XmlAttribute
-    protected String scale;
-    @XmlAttribute
-    @XmlSchemaType(name = "positiveInteger")
-    protected BigInteger interval;
-
-    /**
-     * Gets the value of the scale property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link String }
-     *     
-     */
-    public String getScale() {
-        if (scale == null) {
-            return "nodes";
-        } else {
-            return scale;
-        }
-    }
-
-    /**
-     * Sets the value of the scale property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *     
-     */
-    public void setScale(String value) {
-        this.scale = value;
-    }
-
-    /**
-     * Gets the value of the interval property.
-     * 
-     * @return
-     *     possible object is
-     *     {@link BigInteger }
-     *     
-     */
-    public BigInteger getInterval() {
-        if (interval == null) {
-            return new BigInteger("4");
-        } else {
-            return interval;
-        }
-    }
-
-    /**
-     * Sets the value of the interval property.
-     * 
-     * @param value
-     *     allowed object is
-     *     {@link BigInteger }
-     *     
-     */
-    public void setInterval(BigInteger value) {
-        this.interval = value;
-    }
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/package-info.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/package-info.java
deleted file mode 100644
index d5a1685..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/elements/package-info.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//
-// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
-// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
-// Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2011.02.15 at 04:31:32 PM CET 
-//
-
-@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.llview.de")
-package org.eclipse.ptp.rm.lml.internal.core.elements;
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/JobListSortedEvent.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/JobListSortedEvent.java
deleted file mode 100644
index c3314d1..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/JobListSortedEvent.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
-
- * Copyright (c) 2005, 2006, 2007 Los Alamos National Security, LLC.
- * This material was produced under U.S. Government contract DE-AC52-06NA25396
- * for Los Alamos National Laboratory (LANL), which is operated by the Los Alamos
- * National Security, LLC (LANS) for the U.S. Department of Energy.  The U.S. Government has
- * rights to use, reproduce, and distribute this software. NEITHER THE
- * GOVERNMENT NOR LANS 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.internal.core.events;
-
-import org.eclipse.ptp.rm.lml.core.ILMLManager;
-import org.eclipse.ptp.rm.lml.core.events.IJobListSortedEvent;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-
-/**
- * Class of the interface IJobListSortedEvent.
- * @author Claudia Knobloch
- */
-public class JobListSortedEvent implements IJobListSortedEvent{
-	
-	/*
-	 * The associated LMLManager
-	 */
-	private final ILMLManager lmlManager;
-	
-	/*
-	 * The associated ILguiItem
-	 */
-	private final ILguiItem lguiItem;
-	
-	/**
-	 * Constructor
-	 * @param lmlManager the associated LMLManager
-	 * @param lguiItem the associated ILguiItem
-	 */
-	public JobListSortedEvent(ILMLManager lmlManager, ILguiItem lguiItem) {
-		this.lmlManager = lmlManager;
-		this.lguiItem = lguiItem;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.IJobListSortedEvent#getLgui()
-	 */
-	public ILguiItem getLguiItem() {
-		return lguiItem;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.IJobListSortedEvent#getLMLManager()
-	 */
-	public ILMLManager getLMLManager() {
-		return lmlManager;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/LguiAddedEvent.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/LguiAddedEvent.java
deleted file mode 100644
index 7c64c2c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/LguiAddedEvent.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
-
- * Copyright (c) 2005, 2006, 2007 Los Alamos National Security, LLC.
- * This material was produced under U.S. Government contract DE-AC52-06NA25396
- * for Los Alamos National Laboratory (LANL), which is operated by the Los Alamos
- * National Security, LLC (LANS) for the U.S. Department of Energy.  The U.S. Government has
- * rights to use, reproduce, and distribute this software. NEITHER THE
- * GOVERNMENT NOR LANS 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.internal.core.events;
-
-import org.eclipse.ptp.rm.lml.core.ILMLManager;
-import org.eclipse.ptp.rm.lml.core.events.ILguiAddedEvent;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-
-/**
- * Class of the interface ILguiAddedEvent.
- * @author Claudia Knobloch
- */
-public class LguiAddedEvent implements ILguiAddedEvent{
-	
-	/*
-	 * The associated LMLManager
-	 */
-	private final ILMLManager lmlManager;
-	
-	/*
-	 * The associated ILguiItem
-	 */
-	private final ILguiItem lguiItem;
-	
-	/**
-	 * Constructor
-	 * @param lmlManager the associated LMLManager
-	 * @param lguiItem the associated ILguiItem
-	 */
-	public LguiAddedEvent(ILMLManager lmlManager, ILguiItem lguiItem) {
-		this.lmlManager = lmlManager;
-		this.lguiItem = lguiItem;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiAddedEvent#getLgui()
-	 */
-	public ILguiItem getLguiItem() {
-		return lguiItem;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiAddedEvent#getLMLManager()
-	 */
-	public ILMLManager getLMLManager() {
-		return lmlManager;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/LguiRemovedEvent.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/LguiRemovedEvent.java
deleted file mode 100644
index 8c51d72..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/LguiRemovedEvent.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006, 2007 Los Alamos National Security, LLC.
- * This material was produced under U.S. Government contract DE-AC52-06NA25396
- * for Los Alamos National Laboratory (LANL), which is operated by the Los Alamos
- * National Security, LLC (LANS) for the U.S. Department of Energy.  The U.S. Government has
- * rights to use, reproduce, and distribute this software. NEITHER THE
- * GOVERNMENT NOR LANS 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.internal.core.events;
-
-import org.eclipse.ptp.rm.lml.core.ILMLManager;
-import org.eclipse.ptp.rm.lml.core.events.ILguiRemovedEvent;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-
-/**
- * Class of the interface ILguiRemovedEvent.
- * @author Claudia Knobloch
- */
-public class LguiRemovedEvent implements ILguiRemovedEvent{
-	
-	/*
-	 * The associated LMLManager
-	 */
-	private final ILMLManager lmlManager;
-	
-	/*
-	 * The associated ILguiItem
-	 */
-	private final ILguiItem lguiItem;
-	
-	/**
-	 * Constructor
-	 * @param lmlManager the associated LMLManager
-	 * @param lguiItem the associated ILguiItem
-	 */
-	public LguiRemovedEvent(ILMLManager lmlManager, ILguiItem lguiItem) {
-		this.lmlManager = lmlManager;
-		this.lguiItem = lguiItem;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiRemovedEvent#getLgui()
-	 */
-	public ILguiItem getLguiItem() {
-		return lguiItem;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiRemovedEvent#getLMLManager()
-	 */
-	public ILMLManager getLMLManager() {
-		return lmlManager;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/LguiSelectedEvent.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/LguiSelectedEvent.java
deleted file mode 100644
index 60bbfe8..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/LguiSelectedEvent.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006, 2007 Los Alamos National Security, LLC.
- * This material was produced under U.S. Government contract DE-AC52-06NA25396
- * for Los Alamos National Laboratory (LANL), which is operated by the Los Alamos
- * National Security, LLC (LANS) for the U.S. Department of Energy.  The U.S. Government has
- * rights to use, reproduce, and distribute this software. NEITHER THE
- * GOVERNMENT NOR LANS 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.internal.core.events;
-
-import org.eclipse.ptp.rm.lml.core.ILMLManager;
-import org.eclipse.ptp.rm.lml.core.events.ILguiSelectedEvent;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-
-public class LguiSelectedEvent implements ILguiSelectedEvent {
-	/*
-	 * The associated LMLManager
-	 */
-	private final ILMLManager lmlManager;
-	
-	/*
-	 * The associated ILguiItem
-	 */
-	private final ILguiItem lguiItem;
-	
-	/**
-	 * Constructor
-	 * @param lmlManager the associated LMLManager
-	 * @param lguiItem the associated ILguiItem
-	 */
-	public LguiSelectedEvent(ILMLManager lmlManager, ILguiItem lguiItem) {
-		this.lmlManager = lmlManager;
-		this.lguiItem = lguiItem;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiRemovedEvent#getLgui()
-	 */
-	public ILguiItem getLguiItem() {
-		return lguiItem;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiRemovedEvent#getLMLManager()
-	 */
-	public ILMLManager getLMLManager() {
-		return lmlManager;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/LguiUpdatedEvent.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/LguiUpdatedEvent.java
deleted file mode 100644
index d0e1df3..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/events/LguiUpdatedEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006, 2007 Los Alamos National Security, LLC.
- * This material was produced under U.S. Government contract DE-AC52-06NA25396
- * for Los Alamos National Laboratory (LANL), which is operated by the Los Alamos
- * National Security, LLC (LANS) for the U.S. Department of Energy.  The U.S. Government has
- * rights to use, reproduce, and distribute this software. NEITHER THE
- * GOVERNMENT NOR LANS 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.internal.core.events;
-
-import org.eclipse.ptp.rm.lml.core.events.ILguiUpdatedEvent;
-import org.eclipse.ptp.rm.lml.internal.core.model.LguiItem;
-
-public class LguiUpdatedEvent implements ILguiUpdatedEvent{
-
-	private final LguiItem lguiItem;
-	
-	public LguiUpdatedEvent(LguiItem lguiItem) {
-		this.lguiItem = lguiItem;
-	}
-	
-	public LguiItem getLguiItem() {
-		return lguiItem;
-	}	
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/LMLColor.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/LMLColor.java
deleted file mode 100644
index 457d528..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/LMLColor.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.internal.core.model;
-
-/**
- * Simple color class collecting values for red, green and blue color intensity.
- * This class is independent from AWT or SWT-implementation and can easily be
- * converted into corresponding instances.
- */
-public class LMLColor {
-	
-	/**
-	 * color intensity of red. values from 0 to 255
-	 */
-	protected int r;
-	/**
-	 * color intensity of green. values from 0 to 255
-	 */
-	protected int g;
-	/**
-	 * color intensity of blue. values from 0 to 255
-	 */
-	protected int b;
-	
-	/**
-     * The color white.  In the default sRGB space.
-     */
-    public final static LMLColor white = new LMLColor(255, 255, 255);
-
-    /**
-     * The color white.  In the default sRGB space.
-     * @since 1.4
-     */
-    public final static LMLColor WHITE = white;
-
-    /**
-     * The color light gray.  In the default sRGB space.
-     */
-    public final static LMLColor lightGray = new LMLColor(192, 192, 192);
-
-    /**
-     * The color light gray.  In the default sRGB space.
-     * @since 1.4
-     */
-    public final static LMLColor LIGHT_GRAY = lightGray;
-
-    /**
-     * The color gray.  In the default sRGB space.
-     */
-    public final static LMLColor gray      = new LMLColor(128, 128, 128);
-
-    /**
-     * The color gray.  In the default sRGB space.
-     * @since 1.4
-     */
-    public final static LMLColor GRAY = gray;
-
-    /**
-     * The color dark gray.  In the default sRGB space.
-     */
-    public final static LMLColor darkGray  = new LMLColor(64, 64, 64);
-
-    /**
-     * The color dark gray.  In the default sRGB space.
-     * @since 1.4
-     */
-    public final static LMLColor DARK_GRAY = darkGray;
-
-    /**
-     * The color black.  In the default sRGB space.
-     */
-    public final static LMLColor black 	= new LMLColor(0, 0, 0);
-    
-    /**
-     * The color black.  In the default sRGB space.
-     * @since 1.4
-     */
-    public final static LMLColor BLACK = black;
-    
-    /**
-     * The color red.  In the default sRGB space.
-     */
-    public final static LMLColor red       = new LMLColor(255, 0, 0);
-
-    /**
-     * The color red.  In the default sRGB space.
-     * @since 1.4
-     */
-    public final static LMLColor RED = red;
-
-    /**
-     * The color pink.  In the default sRGB space.
-     */
-    public final static LMLColor pink      = new LMLColor(255, 175, 175);
-
-    /**
-     * The color pink.  In the default sRGB space.
-     * @since 1.4
-     */
-    public final static LMLColor PINK = pink;
-
-    /**
-     * The color orange.  In the default sRGB space.
-     */
-    public final static LMLColor orange 	= new LMLColor(255, 200, 0);
-
-    /**
-     * The color orange.  In the default sRGB space.
-     * @since 1.4
-     */
-    public final static LMLColor ORANGE = orange;
-
-    /**
-     * The color yellow.  In the default sRGB space.
-     */
-    public final static LMLColor yellow 	= new LMLColor(255, 255, 0);
-
-    /**
-     * The color yellow.  In the default sRGB space.
-     * @since 1.4
-     */
-    public final static LMLColor YELLOW = yellow;
-
-    /**
-     * The color green.  In the default sRGB space.
-     */
-    public final static LMLColor green 	= new LMLColor(0, 255, 0);
-
-    /**
-     * The color green.  In the default sRGB space.
-     * @since 1.4
-     */
-    public final static LMLColor GREEN = green;
-
-    /**
-     * The color magenta.  In the default sRGB space.
-     */
-    public final static LMLColor magenta	= new LMLColor(255, 0, 255);
-
-    /**
-     * The color magenta.  In the default sRGB space.
-     * @since 1.4
-     */
-    public final static LMLColor MAGENTA = magenta;
-
-    /**
-     * The color cyan.  In the default sRGB space.
-     */
-    public final static LMLColor cyan 	= new LMLColor(0, 255, 255);
-
-    /**
-     * The color cyan.  In the default sRGB space.
-     * @since 1.4
-     */
-    public final static LMLColor CYAN = cyan;
-
-    /**
-     * The color blue.  In the default sRGB space.
-     */
-    public final static LMLColor blue 	= new LMLColor(0, 0, 255);
-
-    /**
-     * The color blue.  In the default sRGB space.
-     * @since 1.4
-     */
-    public final static LMLColor BLUE = blue;
-    
-	
-	/**
-	 * Create a color-instance by passing RGB-values
-	 * @param red red-intensity 0..255
-	 * @param green green-intensity 0..255
-	 * @param blue blue-intensity 0..255
-	 */
-	public LMLColor(int red, int green, int blue){
-		this.r=red;
-		this.g=green;
-		this.b=blue;
-	}
-	
-	/**
-	 * Create a color from a string. The RGB-values are parsed from the string.
-	 * The color is specified like in HTML. The values are concatinated as 
-	 * hexadecimal values. The # at the beginning is optional.
-	 * @param colorstring Allowed strings: #FFF #0000FF ffeeff cef ...
-	 */
-	public LMLColor(String colorstring){
-		LMLColor color=stringToColor(colorstring);
-		
-		this.r=color.r;
-		this.g=color.g;
-		this.b=color.b;
-	}
-	
-	/**
-	 * @return intensity of red
-	 */
-	public int getRed(){
-		return r;
-	}
-	
-	/**
-	 * @return intensity of green
-	 */
-	public int getGreen(){
-		return g;
-	}
-	
-	/**
-	 * @return intensity of blue
-	 */
-	public int getBlue(){
-		return b;
-	}
-	
-	/**
-	 * Convert a colorstring into an Color-Object
-	 * 
-	 * Allowed strings: #FFF #0000FF ffeeff cef ...
-	 * 
-	 * @param colorstring
-	 * @return LMLColor-instance containing the values for red, green and blue
-	 */
-	public static LMLColor stringToColor(String colorstring){
-
-		if(colorstring==null || colorstring.length()==0){
-			return LMLColor.white;
-		}
-
-		if(colorstring.charAt(0)=='#'){
-			colorstring=colorstring.substring(1);
-		}
-
-		int red=0;
-		int green=0;
-		int blue=0;
-
-
-		if(colorstring.length()==3){
-			red=Integer.parseInt(colorstring.substring(0,1), 16);
-			green=Integer.parseInt(colorstring.substring(1,2), 16);
-			blue=Integer.parseInt(colorstring.substring(2,3), 16);
-
-			red=red+16*red;
-			green=green+16*green;
-			blue=blue+16*blue;
-		}
-		else
-			if(colorstring.length()==6){
-				red=Integer.parseInt(colorstring.substring(0,2), 16);
-				green=Integer.parseInt(colorstring.substring(2,4), 16);
-				blue=Integer.parseInt(colorstring.substring(4,6), 16);
-			}
-			else{
-				return LMLColor.black;
-			}
-
-		return new LMLColor(red, green, blue);	
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/LayoutAccess.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/LayoutAccess.java
deleted file mode 100644
index 0aafb72..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/LayoutAccess.java
+++ /dev/null
@@ -1,731 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, Claudia Knobloch, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.internal.core.model;
-
-import java.io.OutputStream;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.namespace.QName;
-
-import org.eclipse.ptp.rm.lml.core.events.ILguiUpdatedEvent;
-import org.eclipse.ptp.rm.lml.core.listeners.ILguiListener;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.internal.core.elements.AbslayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ChartType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ChartgroupType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ChartlayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ColumnlayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ComponentType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ComponentlayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.GobjectType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.InfoboxType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.InfoboxlayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.LayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.LguiType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplay;
-import org.eclipse.ptp.rm.lml.internal.core.elements.NodedisplaylayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ObjectFactory;
-import org.eclipse.ptp.rm.lml.internal.core.elements.PaneType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SplitlayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.TableType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.TablelayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.TextboxType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.UsagebarType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.UsagebarlayoutType;
-
-/**
- * This class provides access to component-layout-definitions.
- * Returns layout-objects for standard-lml-objects
- * 
- * Moreover with this class one is able to manipulate layout definitions
- * LML-Models can be transformed into layout-only definitions
- * There are functions, which allow to merge layouts to one lml-model
- *  
- *  
- * @author karbach
- *
- */
-public class LayoutAccess extends LguiHandler{	
-	//DefaultLayouts
-	private UsagebarlayoutType defaultUsagebar;
-	private ChartlayoutType defaultChart;
-	private TablelayoutType defaultTable;
-	private InfoboxlayoutType defaultInfobox;
-	
-	private static ObjectFactory objectFactory = new ObjectFactory();//create a objectfactory for all functions in this class
-	
-	/**
-	 * @param lguiItem LML-data-handler, which groups this handler and others to a set
-	 * of LMLHandler. This instance is needed to notify all LMLHandler, if any data of
-	 * the LguiType-instance was changed.
-	 */
-	public LayoutAccess(ILguiItem lguiItem, LguiType lgui){
-		super(lguiItem, lgui);
-		defaultUsagebar = objectFactory.createUsagebarlayoutType();
-		defaultChart = objectFactory.createChartlayoutType();
-		defaultTable = objectFactory.createTablelayoutType();
-		defaultInfobox = objectFactory.createInfoboxlayoutType();
-		
-		this.lguiItem.addListener(new ILguiListener() {
-			public void handleEvent(ILguiUpdatedEvent e) {
-				update(e.getLguiItem().getLguiType());
-			}
-		});
-	}
-	
-	/**
-	 * Replace all componentlayouts for a graphical object with given gid through newlayout.getGid()
-	 * with newlayout
-	 * @param newLayout new layout, which is placed into the positions of old layouts
-	 */
-	public void replaceComponentLayout(ComponentlayoutType newlayout){
-		if(newlayout==null) return;
-		String gid=newlayout.getGid();
-		
-		List<JAXBElement<?>> allobjects=lgui.getObjectsAndRelationsAndInformation();
-		
-		boolean replaced=false;
-		
-		//Over all objects in lml-file
-		for(JAXBElement<?> aobj: allobjects){
-			//Over all Componentlayouts
-			if(aobj.getValue() instanceof ComponentlayoutType){
-				
-				ComponentlayoutType alayout=(ComponentlayoutType)aobj.getValue();
-				
-				if( alayout.getGid()!=null && alayout.getGid().equals(gid) ){
-					((JAXBElement<ComponentlayoutType>)aobj).setValue(newlayout);
-					replaced=true;
-				}
-				
-			}
-		}
-		
-		if(!replaced){//Insert new layout, if there was nothing to replace
-			//Takes any componentlayout
-			JAXBElement<?> newel=null;
-			
-			//Differ between several layouts, create different JAXBElements
-			if(newlayout instanceof TablelayoutType){
-				newel=new JAXBElement<TablelayoutType>( new QName("tablelayout"), 
-											   TablelayoutType.class, (TablelayoutType)newlayout );
-			}
-			else if(newlayout instanceof NodedisplaylayoutType){
-				newel=new JAXBElement<NodedisplaylayoutType>( new QName("nodedisplaylayout"), 
-						   NodedisplaylayoutType.class, (NodedisplaylayoutType)newlayout );
-			}
-			
-			if(newel!=null)
-				lgui.getObjectsAndRelationsAndInformation().add(newel);
-		}
-		
-	}
-	
-	/**
-	 * Simply returns the first layout found for a usagebar with the given id
-	 * or a default-layout
-	 * @param usagebarID
-	 * @return defaultlayout for a usagebar or first layout for usagebar with id usagebarid given by lml-file
-	 */
-	public UsagebarlayoutType getUsagebarLayout(String usagebarID) {
-		List<UsagebarlayoutType> usagebarLayouts = getUsagebarLayouts();
-		//Over all objects in lml-file
-		for (UsagebarlayoutType usagebarLayout : usagebarLayouts) {
-			if (usagebarLayout.getGid().equals(usagebarID))
-				return usagebarLayout;
-		}
-		return defaultUsagebar;		
-	}
-	
-
-	/**
-	 * Simply returns the first layout found for a chart with the given id
-	 * or a default-layout
-	 * @param chartID
-	 * @return defaultlayout for a chart or first layout for chart with id chartid given by lml-file
-	 */
-	public ChartlayoutType getChartLayout(String chartID) {
-		List<ChartlayoutType> chartLayouts = getChartLayouts();
-		for (ChartlayoutType chartLayout : chartLayouts){
-			if (chartLayout.getGid().equals(chartID))
-				return chartLayout;
-		}
-		return defaultChart;		
-	}
-	
-	
-	/**
-	 * Simply returns the first layout found for a infobox with the given id
-	 * or a default-layout
-	 * @param infoID
-	 * @return defaultlayout for a table or first layout for table with id tableid given by lml-file
-	 */
-	public InfoboxlayoutType getInfoboxLayout(String infoID){
-		List<InfoboxlayoutType> infoboxLayouts = getInfoboxLayout();
-		for (InfoboxlayoutType infoboxLayout : infoboxLayouts) {
-			if (infoboxLayout.getGid().equals(infoID) )
-				return infoboxLayout;
-		}
-		return defaultInfobox;		
-	}
-	
-	private List<InfoboxlayoutType> getInfoboxLayout() {
-		List<InfoboxlayoutType> infoboxLayouts = new LinkedList<InfoboxlayoutType>();
-		for (ComponentlayoutType tag : getComponentLayouts()) {
-			if (tag instanceof InfoboxlayoutType) {
-				infoboxLayouts.add((InfoboxlayoutType) tag);
-			}
-		}
-		return infoboxLayouts;
-	}
-
-	/**
-	 * This function is only for easier understanding this class
-	 * Textboxlayouts are identical to infoboxlayouts, so you could
-	 * call getInfoboxLayout(textid) and would get the same result.
-	 * 
-	 * @param textID id of a textbox
-	 * @return layout for a textbox with an info-tag in it
-	 */
-	public InfoboxlayoutType getTextboxLayout(String textID){
-		return getInfoboxLayout(textID);
-	}
-	
-	/**
-	 * @param data model of lml-data, contingently with layout-information, this object will be modified and returned 
-	 * @param layout more important layout-data, overwrite componentlayouts of data-model, but add additional abs/-splitlayouts
-	 * @return merged lml-model
-	 */
-	public static LguiType mergeLayouts(LguiType data, LguiType layout){
-		
-		if(data==null || layout==null) return data;
-		LguiItem lgui = new LguiItem(data);
-		LayoutAccess la=new LayoutAccess(lgui, lgui.getLguiType());
-		//Replace component-layouts
-		for(JAXBElement<?> el:layout.getObjectsAndRelationsAndInformation()){
-			if(el.getValue() instanceof ComponentlayoutType){
-				la.replaceComponentLayout((ComponentlayoutType)el.getValue());
-			}
-		}
-		
-		/** really merge layouts, do not overwrite
-		//Collect existing layout-ids
-		HashSet<String> layoutids=new HashSet<String>();
-		
-		for(JAXBElement<?> el:data.getObjectsAndRelationsAndInformation()){
-			if(el.getValue() instanceof LayoutType){
-				LayoutType lay=(LayoutType) el.getValue();
-				layoutids.add(lay.getId());
-			}
-		}
-		
-		//Generate new ids if layout-ids already exist in data, then add new layout to data
-		for(JAXBElement<?> el:layout.getObjectsAndRelationsAndInformation()){
-			if(el.getValue() instanceof LayoutType){
-				LayoutType lay=(LayoutType) el.getValue();
-				
-				String newid=lay.getId();
-				while(layoutids.contains( newid )){
-					newid=newid+"'";
-				}
-				
-				lay.setId(newid);
-				layoutids.add(newid);
-				//Add this layout with new id to data-instance
-				data.getObjectsAndRelationsAndInformation().add(el);
-			}
-		}
-		**/
-		
-		//Overwrite layouts with the same name
-		for(JAXBElement<?> el:layout.getObjectsAndRelationsAndInformation()){
-			if(el.getValue() instanceof LayoutType){
-				if( ! replaceGlobalLayout( (LayoutType)el.getValue(), data) ){//If not replaced, insert it
-					data.getObjectsAndRelationsAndInformation().add(el);
-				}
-			}
-		}
-		
-		return data;
-	}
-	
-	/**
-	 * Replace a global layout within the lml-model by a new one
-	 * @param newlayout new layout, which replaces the old in model with the same id
-	 * @param model lgui-instance, which is changed
-	 */
-	public static boolean replaceGlobalLayout(LayoutType newlayout, LguiType model){
-		
-		List<JAXBElement<?>> all=model.getObjectsAndRelationsAndInformation();
-		
-		//Go through all objects, search for layouttypes with newlayout.getId as id and replace them with this layout
-		for(int i=0; i<all.size(); i++){
-			JAXBElement<?> aobj=all.get(i);
-			if(aobj.getValue() instanceof LayoutType){
-				LayoutType old=(LayoutType) aobj.getValue();
-				if(old.getId().equals(newlayout.getId())){
-					( (JAXBElement<LayoutType>)aobj).setValue( newlayout );
-					return true;
-				}
-			}
-		}
-		
-		return false;
-	}
-	
-	
-	
-	/**
-	 * Search for gid-attributes of a pane and put it into neededComponents
-	 * Recursively search all graphical objects referenced by this pane
-	 * 
-	 * @param p part of SplitLayout, which is scanned for gid-attributes
-	 * @param neededComponents resulting Hashset
-	 */
-	private static void collectComponents(PaneType p, HashSet<String> neededComponents){
-		
-		if(p.getGid()!=null)
-			neededComponents.add(p.getGid());
-		else{
-			//top and bottom components?
-			if(p.getBottom()!=null){
-				collectComponents(p.getBottom(), neededComponents);
-				collectComponents(p.getTop(), neededComponents);
-			}
-			else{//Left and right
-				collectComponents(p.getLeft(), neededComponents);
-				collectComponents(p.getRight(), neededComponents);
-			}
-		}
-		
-	}
-	
-	/**
-	 * @param gobj
-	 * @return a copy of gobj with minimal size, only attributes in GobjectType are copied 
-	 * 			 and lower special elements which are needed to make lml-model valid
-	 */
-	private static JAXBElement<GobjectType> minimizeGobjectType(GobjectType gobj){
-		
-		String qname="table";
-		Class<GobjectType> c=(Class<GobjectType>)gobj.getClass();		
-		
-		GobjectType value=objectFactory.createGobjectType();
-		
-		if( gobj instanceof TableType ){
-			TableType tt=objectFactory.createTableType();
-			
-			value=tt;
-			
-			qname="table";
-		}
-		else if(gobj instanceof UsagebarType){
-			UsagebarType ut=objectFactory.createUsagebarType();
-			
-			value=ut;
-			
-			qname="usagebar";
-		}
-		else if(gobj instanceof TextboxType){
-			TextboxType ut=objectFactory.createTextboxType();
-			
-			value=ut;
-			
-			qname="text";
-		}
-		else if(gobj instanceof InfoboxType){
-			InfoboxType ut=objectFactory.createInfoboxType();
-			
-			value=ut;
-			
-			qname="infobox";
-		}
-		else if(gobj instanceof Nodedisplay){//Create minimal nodedisplay
-			Nodedisplay ut=objectFactory.createNodedisplay();
-			
-			value=ut;
-			SchemeType scheme=objectFactory.createSchemeType();
-			scheme.getEl1().add(objectFactory.createSchemeElement1());
-			ut.setScheme(scheme);
-			
-			DataType dat=objectFactory.createDataType();
-			dat.getEl1().add(objectFactory.createDataElement1());
-			ut.setData(dat);
-			
-			qname="nodedisplay";
-		}
-		else if(gobj instanceof ChartType){
-			ChartType ut=objectFactory.createChartType();
-			
-			value=ut;
-			
-			qname="chart";
-		}
-		else if(gobj instanceof ChartgroupType){
-			ChartgroupType ut=objectFactory.createChartgroupType();
-			
-			value=ut;
-			
-			qname="chartgroup";
-		}
-		
-		value.setDescription(gobj.getDescription());
-		value.setId(gobj.getId());
-		value.setTitle(gobj.getTitle());
-		
-		
-		JAXBElement<GobjectType> res=new JAXBElement<GobjectType>(new QName(qname), c, value  );
-		
-		return res;
-	}
-	
-	
-	/**
-	 * Remove all important data from modell
-	 * return only layout-information and data, which is needed to make 
-	 * lml-model valid
-	 * @param modell lml-modell with data and layout-information
-	 * @return
-	 */
-	public static LguiType getLayoutFromModell(LguiType modell){
-		
-		LguiType res=objectFactory.createLguiType();
-		
-		HashSet<String> neededComponents=new HashSet<String>();
-		
-		for(JAXBElement<?> tag: modell.getObjectsAndRelationsAndInformation()){
-			
-			Object value=tag.getValue();
-			
-			//add normal global layouts 
-			if(value instanceof LayoutType){
-				res.getObjectsAndRelationsAndInformation().add(tag);
-				
-				if(value instanceof SplitlayoutType){
-					SplitlayoutType splitlayout=(SplitlayoutType)value;
-					//Collect needed components from layout recursively
-					if(splitlayout.getLeft()!=null){
-						collectComponents(splitlayout.getLeft(), neededComponents);
-						collectComponents(splitlayout.getRight(), neededComponents);
-					}
-				}
-				else if(value instanceof AbslayoutType){
-					
-					AbslayoutType abslayout=(AbslayoutType)value;
-					//Just traverse comp-list for gid-attributes
-					for(ComponentType comp: abslayout.getComp()){
-						neededComponents.add(comp.getGid());
-					}
-					
-				}
-				
-			}
-			else if(value instanceof ComponentlayoutType){
-				res.getObjectsAndRelationsAndInformation().add(tag);
-				
-				ComponentlayoutType complayout=(ComponentlayoutType)value;
-				neededComponents.add(complayout.getGid());
-			}
-			
-		}
-		
-		HashMap<String, GobjectType> idtoGobject=new HashMap<String, GobjectType>();
-		//Search needed components in data-tag to discover, which type the needed components have
-		for(JAXBElement<?> tag: modell.getObjectsAndRelationsAndInformation()){
-			
-			Object value=tag.getValue();
-			//is it a graphical object?
-			if(value instanceof GobjectType){
-				GobjectType gobj=(GobjectType)value;
-				if(neededComponents.contains(gobj.getId())){
-					idtoGobject.put(gobj.getId(), gobj);
-				}
-			}
-		}
-		
-		//Add all gobjects in idtoGobject to the result, so that lml-modell is valid
-		for(GobjectType gobj: idtoGobject.values()){
-			JAXBElement<GobjectType> min=minimizeGobjectType(gobj);
-			res.getObjectsAndRelationsAndInformation().add(min);
-		}
-		
-		//Set layout-attribute
-		res.setLayout(true);
-		
-		return res;
-	}
-	
-	/**
-	 * @param obj LguiType-instance
-	 * @param output OutputStream to save xml-representation of obj in
-	 * @throws JAXBException 
-	 */
-	public static void objToLML(LguiType obj, OutputStream output) throws JAXBException {
-
-		JAXBContext jc = JAXBContext.newInstance("lml");
-		
-		Marshaller mar=jc.createMarshaller();
-		
-		mar.setProperty("jaxb.schemaLocation", "http://www.llview.de lgui.xsd");
-		
-		QName tagname=new QName("http://www.llview.de", "lgui", "lml");
-		
-		JAXBElement<LguiType> rootel=new JAXBElement<LguiType>(tagname, LguiType.class, obj);
-		
-		mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-		
-		mar.marshal(rootel, output);
-	}	
-
-	/**
-	 * Search in component-layouts for layout for the graphical object with id gid.
-	 * @param gid id of corresponding graphical object, for which layouts are searched
-	 * @return list of componentlayouts corresponding to the graphical object id gid
-	 */
-	public List<ComponentlayoutType> getComponentLayoutByGID(String gid){
-		
-		List<ComponentlayoutType> complayouts= getComponentLayouts();
-		
-		ArrayList<ComponentlayoutType> res=new ArrayList<ComponentlayoutType>();
-		
-		for(ComponentlayoutType alayout: complayouts){
-				
-				if( alayout.getGid()!=null && alayout.getGid().equals(gid) ){
-					
-					res.add(alayout);					
-				}
-		}
-		
-		return res;
-	}
-	
-	/**
-	 * Add a new created layout to the model
-	 * @param layout absolute or splitlayout
-	 */
-	public void addLayoutTag(LayoutType layout){
-		
-		if(layout.getId()==null){
-			layout.setId("");
-		}
-		
-		JAXBElement<? extends LayoutType> jaxbel=null;
-		//Create jaxbelement corresponding to the class-type
-		if(layout instanceof AbslayoutType){
-			
-			AbslayoutType abslayout=(AbslayoutType)layout;
-			
-			jaxbel=new JAXBElement<AbslayoutType>(new QName("abslayout"), AbslayoutType.class, abslayout);
-			
-		}
-		else
-		if(layout instanceof SplitlayoutType){
-			
-			SplitlayoutType splitlayout=(SplitlayoutType)layout;
-			
-			jaxbel=new JAXBElement<SplitlayoutType>(new QName("splitlayout"), SplitlayoutType.class, splitlayout);
-			
-		}
-		else
-			return;
-			
-		this.lgui.getObjectsAndRelationsAndInformation().add( jaxbel );
-		
-		if( lguiItem instanceof LguiItem){
-			LguiItem internal=(LguiItem) lguiItem;
-			
-			internal.updateData(lgui);
-		}
-			
-	}
-	
-	/**
-	 * Generates an absolute layout without needing a layout tag. Active components
-	 * are placed in a grid on the screen. Use this function, if no layout was specified
-	 * by the lml-file.
-	 * @param width width in pixels of the area, on which this layout is shown
-	 * @param height height in pixels of the area, on which this layout is shown
-	 * @return default absolute layout with all active components in it
-	 */
-	public AbslayoutType generateDefaultAbsoluteLayout(int width, int height){
-		
-		//Collect active components
-		List<GobjectType> gobjects=lguiItem.getOverviewAccess().getGraphicalObjects();
-		
-		ArrayList<GobjectType> activeobjects=new ArrayList<GobjectType>();
-		//Go through all graphical objects
-		for(GobjectType gobj: gobjects){
-			//Get layouts for this object, normally there is only one
-			List<ComponentlayoutType> layouts=getComponentLayoutByGID(gobj.getId());
-			
-			if(layouts.size()==0){//assume gobj to be active if there is no componentlayout
-				activeobjects.add(gobj);
-			}
-			
-			//Search for a componentlayout which declares gobj to be active
-			for(ComponentlayoutType complayout: layouts){
-				if( complayout.isActive() ){
-					activeobjects.add(gobj);
-				}					
-			}
-		}
-		
-		//Now activeobjects contains all active graphical objects, which have to be arranged on the screen
-		
-		AbslayoutType res=objectFactory.createAbslayoutType();
-		
-		res.setId("abs_default");
-		
-		//Try to create as many columns as rows
-		int columns=(int)Math.round( Math.sqrt( activeobjects.size() ) );
-		
-		if(columns==0)
-			columns=1;
-		
-		int rows=(int)Math.ceil( (double)activeobjects.size()/columns );
-		
-		if(rows==0)
-			rows=1;
-		//Calculate width and height of graphical objects
-		int index=0;
-		int rectwidth=width/columns;
-		int rectheight=height/rows;
-		
-		for(GobjectType gobj:activeobjects){
-			
-			ComponentType pos=objectFactory.createComponentType();
-			pos.setGid(gobj.getId());
-			//Positioning the component
-			pos.setW(BigInteger.valueOf(rectwidth));
-			pos.setH(BigInteger.valueOf(rectheight));
-
-			pos.setX( BigInteger.valueOf( (index%columns)*rectwidth )) ;
-			pos.setY( BigInteger.valueOf( (index/columns)*rectheight )) ;
-			
-			//Add this component position to the layout
-			res.getComp().add(pos);
-			
-			index++;
-		}
-		
-		return res;
-	}
-	
-	public TablelayoutType getDefaultTableLayout(TableType table) {
-		String id = table.getId();
-		if (getTableLayout(id) == null || getTableLayout(id).getColumn().size() <= 0) {
-			getTableLayout(id).setId(table.getId()+"_layout");
-			getTableLayout(id).setGid(table.getId());
-			for (int i = 0; i < table.getColumn().size(); i++) {
-				ColumnlayoutType column = new ColumnlayoutType();
-				column.setCid(BigInteger.valueOf(i + 1));
-				column.setPos(BigInteger.valueOf(i));
-				column.setWidth(Double.valueOf(1));
-				column.setActive(true);
-				column.setKey(table.getColumn().get(i).getName());
-				getTableLayout(id).getColumn().add(column);
-			}
-		}
-		return getTableLayout(id);
-	}
-	
-	/**
-	 * Getting a list of all elements of type ComponentlayoutType from LguiType.
-	 * @return list of elements(ComponentlayoutType)
-	 */
-	List<ComponentlayoutType> getComponentLayouts() {
-		List<ComponentlayoutType> layouts = new LinkedList<ComponentlayoutType>();
-		for (JAXBElement<?> tag : lgui.getObjectsAndRelationsAndInformation()) {
-			if (tag.getValue() instanceof ComponentlayoutType) {
-				layouts.add((ComponentlayoutType) tag.getValue());
-			}
-		}
-		return layouts;
-	}
-	
-	/**
-	 * Getting a list of elements of type NodedisplaylayoutType.
-	 * @return list of elements(NodedisplaylayoutType)
-	 */
-	List<NodedisplaylayoutType> getNodedisplayLayouts() {
-		List<NodedisplaylayoutType> nodedisplayLayouts = new LinkedList<NodedisplaylayoutType>();
-		for (ComponentlayoutType tag : getComponentLayouts()) {
-			if (tag instanceof NodedisplaylayoutType) {
-				nodedisplayLayouts.add((NodedisplaylayoutType) tag);
-			}
-		}
-		return nodedisplayLayouts;
-	}
-	
-
-	/**
-	 * Getting a list of all elements of type TablelayoutType.
-	 * @return list of elements(TablelayoutType)
-	 */
-	List<TablelayoutType> getTableLayouts() {
-		List<TablelayoutType> tableLayouts = new LinkedList<TablelayoutType>();
-		for (ComponentlayoutType tag : getComponentLayouts()) {
-			if (tag instanceof TablelayoutType) {
-				tableLayouts.add((TablelayoutType) tag);
-			}
-		}
-		return tableLayouts;
-	}
-	
-	/**
-	 * Getting the layout of a given table, the identifier of the layout is the shared ID of table and layout.
-	 * @param tablelayoutID ID of the desired tablelayout
-	 * @return Corresponding layout of a table
-	 */
-	public TablelayoutType getTableLayout(String tablelayoutID) {
-		for (TablelayoutType tag : getTableLayouts()) {
-			if (tag.getGid().equals(tablelayoutID)) {
-				return tag;
-			}
-		}
-		return defaultTable;
-	}
-	
-
-	List<UsagebarlayoutType> getUsagebarLayouts() {
-		List<UsagebarlayoutType> usagebarLayouts = new LinkedList<UsagebarlayoutType>();
-		for (ComponentlayoutType tag : getComponentLayouts()) {
-			if (tag instanceof UsagebarlayoutType) {
-				usagebarLayouts.add((UsagebarlayoutType) tag);
-			}
-		}
-		return usagebarLayouts;
-	}
-	
-
-	List<ChartlayoutType> getChartLayouts() {
-		List<ChartlayoutType> chartLayouts = new LinkedList<ChartlayoutType>();
-		for (ComponentlayoutType tag : chartLayouts) {
-			if (tag instanceof ChartlayoutType) {
-				chartLayouts.add((ChartlayoutType) tag);
-			}
-		}
-		return chartLayouts;
-	}
-	
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/LguiHandler.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/LguiHandler.java
deleted file mode 100644
index 65572c4..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/LguiHandler.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, Claudia Knobloch, FZ Juelich
- */
-package org.eclipse.ptp.rm.lml.internal.core.model;
-
-import org.eclipse.ptp.rm.lml.core.model.ILguiHandler;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.internal.core.elements.LguiType;
-
-/**
- * The LML-Manager in class LML administrates different encapsulated classes,
- * which manage special parts of the lml-object-hierarchy. These classes, which
- * get information from the lml-tree, sort parts of the information or add 
- * extra-information to the mostly redundant-free lml-tree, have some
- * functions in common. These functions are collected in this interface.
- * So every module, which handles the LML-datamodel within the LML-class
- * should extend this class.
- * 
- */
-public class LguiHandler implements ILguiHandler{
-
-	/**
-	 * instance of LML, which is the surrounding handler of this
-	 * 
-	 * This instance is needed to notify all LMLHandler, if any data of
-	 * the LguiType-instance was changed.
-	 */
-	protected ILguiItem lguiItem;
-	
-	/**
-	 * saves current lml-model, which is partly managed by this class
-	 */
-	protected LguiType lgui;
-	
-	/**
-	 * @param lguiItem surrounding lml-manager needed to fire events, if this handler changed data
-	 */
-	public LguiHandler(ILguiItem lguiItem, LguiType lgui){
-		this.lguiItem = lguiItem;
-		this.lgui = lgui;
-	}
-	
-	public void update(LguiType lgui) {
-		this.lgui = lgui;
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/LguiItem.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/LguiItem.java
deleted file mode 100644
index 4720441..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/LguiItem.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, Carsten Karbach, FZ Juelich
- */
-package org.eclipse.ptp.rm.lml.internal.core.model;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-
-import org.eclipse.ptp.rm.lml.core.LMLCorePlugin;
-import org.eclipse.ptp.rm.lml.core.events.ILguiUpdatedEvent;
-import org.eclipse.ptp.rm.lml.core.listeners.ILguiListener;
-import org.eclipse.ptp.rm.lml.core.model.ILguiHandler;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.internal.core.elements.LguiType;
-import org.eclipse.ptp.rm.lml.internal.core.events.LguiUpdatedEvent;
-
-/**
- * Class of the interface ILguiItem
- */
-public class LguiItem implements ILguiItem {
-	
-	/*
-	 * Source of the XML-file from which the LguiType was generated.
-	 */
-	private URL xmlFile;
-	
-	/*
-	 * The generated LguiType 
-	 */
-	private LguiType lgui;
-	
-	/**
-	 * collects listeners, which listen for changes in model
-	 */
-	private List<ILguiListener> listeners = new LinkedList<ILguiListener>();
-	
-	/**
-	 * List of encapsulated classes, which handle parts of the lml-hierarchy
-	 */
-	private HashMap< Class<? extends ILguiHandler>, ILguiHandler > lguiHandlers = new HashMap< Class<? extends ILguiHandler>, ILguiHandler >();
-	
-	
-//	private ListenerList listeners = new ListenerList();
-	/**
-	 * Create a manager for a LguiType-instance.
-	 * @param pmodel LML-data-model, which is managed by this class
-	 */
-	public LguiItem(LguiType pmodel){
-		
-		lgui=pmodel;
-		
-		//globally accessible libraries, they encapsulate modules, which manage lml-datamodels
-		
-		createLguiHandlers();
-	}
-	
-	/**
-	 * Constructor with one argument, an URL.
-	 * Within the constructor the method for parsing an XML-file into LguiItem is called.
-	 * @param xmlFile the source of the XML file.
-	 */
-	public LguiItem(URL xmlFile) {
-		
-		this.xmlFile = xmlFile;
-		try {
-			lgui = parseLML(xmlFile);
-		} catch (MalformedURLException e) {
-			e.printStackTrace();
-		}
-		
-		createLguiHandlers();
-		
-	}
-	
-	/**
-	 * The instance lgui is filled with a new data-model. This method
-	 * creates all modules, which handle the data. These modules can
-	 * then be accessed by corresponding getter-functions.
-	 */
-	private void createLguiHandlers(){
-		lguiHandlers.put(OverviewAccess.class, new OverviewAccess(this, lgui));
-		lguiHandlers.put(LayoutAccess.class, new LayoutAccess(this, lgui));//component-id => component-layout
-		lguiHandlers.put(OIDToObject.class, new OIDToObject(this, lgui));//get object-instance for object-ids and colors for ids
-		lguiHandlers.put(ObjectStatus.class, new ObjectStatus(this, lgui));//get current interaction status for objects
-		lguiHandlers.put(OIDToInformation.class, new OIDToInformation(this, lgui));//Get infos for objects
-		lguiHandlers.put(TableHandler.class, new TableHandler(this, lgui));
-		lguiHandlers.put(NodedisplayAccess.class, new NodedisplayAccess(this, lgui));//access to layouts of nodedisplays
-		
-	}
-
-	/*
-	 * Methods for operating with the system
-	 */
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiItem#getXMLFile()
-	 */
-	public URL getXmlFile() {
-		return xmlFile;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiItem#toString
-	 */
-	public String toString() {
-		if (getXmlFile().getPath() == null) {
-			return "es gibt hier nix";
-		}
-		return getXmlFile().getPath();
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiItem#getVersion()
-	 */
-	public String getVersion() {
-		return lgui.getVersion();
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiItem#isLayout()
-	 */
-	public boolean isLayout() {
-		return lgui.isLayout();
-	}
-	
-	public LguiType getLguiType() {
-		return lgui;
-	}
-	
-	
-	
-	/**
-	 * Parsing an XML file.
-	 * The method generates from an XML file an instance of LguiType.
-	 * @param xml the URL source of the XML file
-	 * @return sthe generated LguiType
-	 * @throws MalformedURLException 
-	 * @throws JAXBException
-	 */
-	private static LguiType parseLML(URL xml) throws MalformedURLException{
-		LguiType lml = null;
-		try {
-			Unmarshaller unmarshaller = LMLCorePlugin.getDefault().getUnmarshaller();
-			
-			JAXBElement<LguiType> doc = (JAXBElement<LguiType>)unmarshaller.unmarshal(xml);
-			
-			lml = doc.getValue();
-		} catch (JAXBException e) {
-			e.printStackTrace();
-		}
-		
-		return lml;
-		
-	}
-	
-	public OverviewAccess getOverviewAccess() {
-		if (lguiHandlers.get(OverviewAccess.class) == null) {
-			return null;
-		}
-		return (OverviewAccess) lguiHandlers.get(OverviewAccess.class);
-	}
-	
-	public TableHandler getTableHandler() {
-		if(lguiHandlers.get( TableHandler.class)==null)
-			return null;
-		return (TableHandler) lguiHandlers.get(TableHandler.class);
-	}
-	
-	/**
-	 * Add a lml-data-listener. It listens for data-changes.
-	 * @param listener new listening instance
-	 */
-	public void addListener( ILguiListener listener ) 
-	{ 
-		listeners.add( listener ); 
-	} 
-	
-	/**
-	 * Remove a lml-data-listener.
-	 * @param listener listening instance
-	 */
-	public void removeListener( ILguiListener listener ) 
-	{ 
-		listeners.remove( listener ); 
-	}
-	
-	/**
-	 * @return a class, which provides an index for fast access
-     * to objects within the objects tag of LML. You can pass
-     * the id of the objects to the returned object. It then returns
-     * the corresponding objects.
-	 */
-	public OIDToObject getOIDToObject(){
-		if(lguiHandlers.get( OIDToObject.class)==null)
-			return null;
-		return (OIDToObject)lguiHandlers.get( OIDToObject.class);
-	}
-	
-	/**
-	 * @return a object, which saves which object has to be highlighted. All
-	 * user interactions are saved globally for all components in this object.
-	 */
-	public ObjectStatus getObjectStatus(){
-		if(lguiHandlers.get( ObjectStatus.class)==null)
-			return null;
-		return (ObjectStatus)lguiHandlers.get( ObjectStatus.class);
-	}
-	
-	/**
-	 * @return object for getting infos for objects
-	 */
-	public OIDToInformation getOIDToInformation(){
-		if(lguiHandlers.get( OIDToInformation.class)==null)
-			return null;
-		return (OIDToInformation)lguiHandlers.get( OIDToInformation.class);
-	}
-	
-	/**
-	 * @return NodedisplayAccess-instance for accessing layouts of nodedisplays
-	 */
-	public NodedisplayAccess getNodedisplayAccess(){
-		if(lguiHandlers.get( NodedisplayAccess.class)==null)
-			return null;
-		return (NodedisplayAccess)lguiHandlers.get( NodedisplayAccess.class);
-	}
-	
-	/**
-	 * @return object to map component-ids to corresponding layout definitions 
-	 */
-	public LayoutAccess getLayoutAccess(){
-		if(lguiHandlers.get( LayoutAccess.class)==null)
-			return null;
-		return (LayoutAccess)lguiHandlers.get( LayoutAccess.class);
-	}
-
-	/**
-	 * Call this method, if lml-model changed. The new model is passed
-	 * to the listening handlers. All getter-functions accessing the handler will
-	 * then return data, which is collected from this new model
-	 * @param model new lml-data-model
-	 */
-	public void updateData(LguiType pmodel) {
-		
-		lgui=pmodel;
-		
-		LguiUpdatedEvent event = new LguiUpdatedEvent(this);
-		
-		//Inform all listener
-		for ( ILguiListener l : listeners ) 
-		      l.handleEvent(event);
-	}
-	
-	public void update() {
-		for (ILguiListener listener : listeners) {
-			ILguiUpdatedEvent e = new LguiUpdatedEvent(this);
-			listener.handleEvent(e);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/NodedisplayAccess.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/NodedisplayAccess.java
deleted file mode 100644
index 3ece0bf..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/NodedisplayAccess.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, FZ JUelich
- */
-
-package org.eclipse.ptp.rm.lml.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.ptp.rm.lml.core.events.ILguiUpdatedEvent;
-import org.eclipse.ptp.rm.lml.core.listeners.ILguiListener;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.internal.core.elements.GobjectType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.LguiType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplay;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplayelement;
-import org.eclipse.ptp.rm.lml.internal.core.elements.NodedisplaylayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ObjectFactory;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeType;
-import org.eclipse.ptp.rm.lml.internal.core.nodedisplay.LMLCheck;
-import org.eclipse.ptp.rm.lml.internal.core.nodedisplay.Mask;
-
-/**
- * Fast access functions for getting tagnames of nodedisplays by their id.
- * Also fast access to mask-attributes
- */
-public class NodedisplayAccess extends LguiHandler{
-	
-	private HashMap<String, HashMap<Integer, String>> oidToTagNames;
-	private HashMap<String, HashMap<Integer, Mask>> oidToMasks;
-	private HashMap<String, ArrayList<NodedisplaylayoutType>> oidToLayouts;//saves all layouts for nodedisplays, key is index of nodedisplay
-	
-	private static Nodedisplayelement defaultlayout;
-	
-	/**
-	 * @param lguiItem LML-data-handler, which groups this handler and others to a set
-	 * of LMLHandler. This instance is needed to notify all LMLHandler, if any data of
-	 * the LguiType-instance was changed.
-	 */
-	public NodedisplayAccess(ILguiItem lguiItem, LguiType model) {
-		super(lguiItem, model);
-		updateData();
-		
-		this.lguiItem.addListener(new ILguiListener() {
-
-			@Override
-			public void handleEvent(ILguiUpdatedEvent e) {
-				update(e.getLguiItem().getLguiType());
-				updateData();
-			}
-		});
-	}
-	
-	public int getNodedisplayNumbers() {
-		return getNodedisplays().size();
-	}
-	
-	public String toString() {
-		return getNodedisplays().get(0).getTitle();
-	}
-	
-	/**
-	 * @param id identification of nodedisplay
-	 * @return Hashmap of masks, keys are level-nrs or null if no nodedisplay found for this id
-	 */
-	public HashMap<Integer, Mask> getMasks(String id){
-		return oidToMasks.get(id);
-	}
-	
-	/**
-	 * @param id identification of nodedisplay
-	 * @return Hashmap of tagnames, keys are level-nrs or null if no nodedisplay found for this id
-	 */
-	public HashMap<Integer, String> getTagnames(String id){
-		return oidToTagNames.get(id);
-	}
-
-	/**
-	 * @param id identification of nodedisplay
-	 * @param level level in tree, for which a tagname is needed
-	 * @return tagname for nodedisplay in given level
-	 */
-	public String getTagname(String id, int level){
-		HashMap<Integer, String> tagnames=getTagnames(id);
-		
-		if(tagnames==null) return null;
-		
-		return tagnames.get(level);
-	}
-	
-	/**
-	 * @param id identification of nodedisplay
-	 * @param level level in tree, for which a mask is needed
-	 * @return mask-object for nodedisplay in given level
-	 */
-	public Mask getMask(String id, int level){
-		HashMap<Integer, Mask> masks=getMasks(id);
-		
-		if(masks==null) return null;
-		
-		return masks.get(level);
-	}
-	
-	/**
-	 * @param id identification of nodedisplay
-	 * @return all defined nodedisplaylayouts for this object
-	 */
-	public ArrayList<NodedisplaylayoutType> getLayouts(String id){
-		return oidToLayouts.get(id);
-	}
-	
-	//Used to not create new masks every time a mask for a scheme is needed
-	private static HashMap<SchemeElement, Mask> fastmasks;//is mainly used in getImplicitName
-	
-	/**
-	 * Get implicit name of physical element with given ids per level
-	 * Parameter ids is copied, so no changes will be made within this list through calling this function
-	 * @param scheme scheme of a nodedisplay
-	 * @param ids id of physical element on every level
-	 * @return implicit name defined by masks and map-attributes
-	 */
-	public static String getImplicitName(SchemeType scheme, ArrayList<Integer> ids){
-		if(ids==null || ids.size()==0) return "";
-		
-		ArrayList<Integer> copy=LMLCheck.copyArrayList(ids);
-		return rekImplicitName(scheme, copy);
-	}
-	
-	/**
-	 * go through scheme-tree, find corresponding masks for ids and return whole implicit name
-	 * @param scheme might be SchemeType or SchemeElement
-	 * @param ids rest of ids in lower levels
-	 * @return implicit name of rest of ids in lower levels
-	 */
-	private static String rekImplicitName(Object scheme, ArrayList<Integer> ids){
-		
-		if(ids==null || ids.size()==0) return "";
-		
-		int anum=ids.get(0);
-		
-		ids.remove(0);
-		
-		ArrayList<Integer> anumlist=new ArrayList<Integer>();
-		anumlist.add(anum);
-		//Find scheme for this level
-		SchemeElement current=LMLCheck.getSchemeByLevels(anumlist, scheme);
-		
-		//Get Mask
-		Mask mask=null;
-		if(fastmasks.containsKey(current)){
-			mask=fastmasks.get(current);
-		}
-		else{
-			mask=new Mask(current);
-			fastmasks.put(current, mask);
-		}
-		
-		return mask.getImplicitLevelname(anum)+rekImplicitName(current, ids);
-	}
-	
-	/**
-	 * if no layout is found for a level, it needs default values anyhow
-	 * just creates a default nodedsiplayelement, default values are given by default values from lml-scheme
-	 * @return default Nodedisplayelement for layout definitions
-	 */
-	public static Nodedisplayelement getDefaultLayout(){
-		return defaultlayout;
-	}
-	
-	/**
-	 * Searches for tagnames and masks within scheme-tag and saves them in tagnames-object
-	 * 
-	 * @param schemeelement current scheme-model
-	 * @param level current level in tree for putting mask and tagname at the right index into hashmap
-	 * @param tagnames hashmap for tagnames key=level of tree, value=tagname
-	 * @param masks hashmap for masks key=level of tree, value=mask-object
-	 */
-	private void findtagNamesAndMasks(Object schemeelement, int level, HashMap<Integer, String> tagnames, HashMap<Integer, Mask> masks){
-		
-		List els=LMLCheck.getLowerSchemeElements(schemeelement);
-		
-		for(Object el:els){
-			
-			SchemeElement asel=(SchemeElement) el;
-			
-			if( ! tagnames.containsKey(level) && asel.getTagname()!=null){
-				tagnames.put(level, asel.getTagname());
-			}
-			
-			if(! masks.containsKey(level) && asel.getMask()!=null){
-				masks.put(level, new Mask(asel) );
-			}
-			
-			findtagNamesAndMasks(asel, level+1, tagnames, masks);
-		}
-		
-	}
-	
-	
-
-	
-	/**
-	 * Getting a list of all elements of type Nodedisplay from LguiType.
-	 * @return list of elements(Nodedisplay)
-	 */
-	public List<Nodedisplay> getNodedisplays() {
-		List<Nodedisplay> nodedisplays = new ArrayList<Nodedisplay>();
-		for (GobjectType tag : lguiItem.getOverviewAccess().getGraphicalObjects()) {
-			if (tag instanceof Nodedisplay) {
-				nodedisplays.add((Nodedisplay) tag);
-			}
-		}
-		return nodedisplays;
-	}
-
-	/**
-	 * Call this method, if lml-model changed. The new model is passed
-	 * to this handler. All getter-functions accessing the handler will
-	 * then return data, which is collected from this new model
-	 * @param model new lml-data-model
-	 */
-	public void updateData() {
-		
-		oidToTagNames=new HashMap<String, HashMap<Integer,String>>();
-		oidToMasks=new HashMap<String, HashMap<Integer,Mask>>();
-		oidToLayouts=new HashMap<String, ArrayList<NodedisplaylayoutType>>();
-
-		List<Nodedisplay> nodedisplays = getNodedisplays();
-		for(Nodedisplay nodedisplay: nodedisplays){
-			HashMap<Integer, String> atagnames=new HashMap<Integer, String>();
-			HashMap<Integer, Mask> amasks=new HashMap<Integer, Mask>();
-				
-			findtagNamesAndMasks(nodedisplay.getScheme(), 1, atagnames, amasks);
-			//Save them for every id
-			oidToTagNames.put(nodedisplay.getId(), atagnames);
-			oidToMasks.put(nodedisplay.getId(), amasks);
-		}
-		List<NodedisplaylayoutType> nodedisplayLayouts = lguiItem.getLayoutAccess().getNodedisplayLayouts();
-		for (NodedisplaylayoutType nodedisplayLayout : nodedisplayLayouts) {
-			if (oidToLayouts.containsKey(nodedisplayLayout.getGid())) {//Already layout found for referenced nodedisplay
-				ArrayList<NodedisplaylayoutType> old = oidToLayouts.get(nodedisplayLayout.getGid());
-				old.add(nodedisplayLayout);
-			}
-			else{//Create new layout-list
-				ArrayList<NodedisplaylayoutType> layouts=new ArrayList<NodedisplaylayoutType>();
-				layouts.add(nodedisplayLayout);
-				oidToLayouts.put(nodedisplayLayout.getGid(), layouts);
-			}
-			
-		}
-		
-		ObjectFactory objf=new ObjectFactory();
-		defaultlayout=objf.createNodedisplayelement();
-		
-		fastmasks=new HashMap<SchemeElement, Mask>();
-		
-	}
-	
-	public String getNodedisplayTitel(int i) {
-		return getNodedisplays().get(i).getTitle();
-	}
-	
-	public Object getNodedisplayData(int i) {
-		return getNodedisplays().get(i).getData();
-	}
-	
-	public Object getNodedisplayScheme(int i) {
-		return getNodedisplays().get(i).getScheme();
-	}
-	
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/OIDToInformation.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/OIDToInformation.java
deleted file mode 100644
index 42a2817..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/OIDToInformation.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import javax.xml.bind.JAXBElement;
-
-import org.eclipse.ptp.rm.lml.core.events.ILguiUpdatedEvent;
-import org.eclipse.ptp.rm.lml.core.listeners.ILguiListener;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.internal.core.elements.InfoType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.InformationType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.LguiType;
-
-/**
- * This class provides access to information-objects within a lml-model.
- * It can be used for fast and simple access to information filtered by
- * the information-type or the object-id.  
- * 
- * @author karbach
- *
- */
-public class OIDToInformation extends LguiHandler{
-
-	//Hashmap, keys are oid-references, values are lists of InfoType
-	private HashMap<String, List<InfoType>> oidtoinfo;
-	
-	/**
-	 * @param psuperHandler LML-data-handler, which groups this handler and others to a set
-	 * of LMLHandler. This instance is needed to notify all LMLHandler, if any data of
-	 * the LguiType-instance was changed.
-	 */
-	public OIDToInformation(ILguiItem psuperHandler, LguiType model){
-		super(psuperHandler, model);
-		
-		updateData(model);
-		
-		lguiItem.addListener(new ILguiListener() {
-			
-			@Override
-			public void handleEvent(ILguiUpdatedEvent e) {
-				updateData(e.getLguiItem().getLguiType());
-			}
-		});
-	}
-	
-	/**
-	 * Extracts all info-tags from lml-model
-	 */
-	public void getInformationFromModel(){
-		
-		oidtoinfo=new HashMap<String, List<InfoType>>();
-		
-		List<JAXBElement<?>> alltags=lgui.getObjectsAndRelationsAndInformation();
-		
-		for( JAXBElement<?> jaxbtag: alltags ){//over all information-tags
-			
-			Object tag=jaxbtag.getValue();
-			
-			if(! (tag instanceof InformationType) ) continue;
-			
-			InformationType ainfos=(InformationType) tag;
-			
-			List<InfoType> realinfos=ainfos.getInfo();
-			
-			for(InfoType ainfo: realinfos){ // over all info-tags (information/info)
-				
-				String oid=ainfo.getOid();
-				
-				if(oidtoinfo.containsKey(oid)){//Already list existent
-					List<InfoType> oldlist=oidtoinfo.get(oid);
-					oldlist.add(ainfo);
-				}
-				else{//new list for oid
-					ArrayList<InfoType> newlist=new ArrayList<InfoType>();
-					newlist.add(ainfo);
-					oidtoinfo.put(oid, newlist);
-				}
-			}
-			
-		}
-		
-	}
-	
-	
-	/**
-	 * @param id identification for an object 
-	 * @param type type of information
-	 * @return all infos of a type for object with given id, null if no infos there, empty list if no infos with this type exist
-	 */
-	public List<InfoType> getInfosByType(String id, String type){
-		
-		List<InfoType> allinfos=getInfosById(id);
-		if(allinfos==null) return null;
-		
-		List<InfoType> res=new ArrayList<InfoType>();
-		//Get only infos with specific type
-		for(InfoType ainfo: allinfos){
-			if(ainfo.getType().equals(type)){
-				res.add(ainfo);
-			}
-		}
-		
-		return res;
-	}
-	
-	/**
-	 * @param id ID-name of an object defined in objects-tag
-	 * @return all info-elements for this object, null if no info exists for this id
-	 */
-	public List<InfoType> getInfosById(String id){
-		return oidtoinfo.get(id);
-	}
-	
-	public static void main(String[] args) {
-		for(int r=0; r<=8; r++){
-			for(int ra=0; ra<=7; ra++){
-				for(int m=0; m<=1; m++){
-					System.out.println("<object id=\"R"+String.valueOf(r)+String.valueOf(ra)+"-M"+m+"\" type=\"node\"/>") ;
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Call this method, if lml-model changed. The new model is passed
-	 * to this handler. All getter-functions accessing the handler will
-	 * then return data, which is collected from this new model
-	 * @param model new lml-data-model
-	 */
-	public void updateData(LguiType pmodel) {
-		lgui=pmodel;
-		
-		getInformationFromModel();
-	}
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/OIDToObject.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/OIDToObject.java
deleted file mode 100644
index 7a8a883..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/OIDToObject.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, Claudia Knobloch, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.internal.core.model;
-
-import java.awt.Color;
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.ptp.rm.lml.core.events.ILguiUpdatedEvent;
-import org.eclipse.ptp.rm.lml.core.listeners.ILguiListener;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.internal.core.elements.LguiType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ObjectName;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ObjectType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ObjectsType;
-
-
-/**
- * This class provides an index for fast access
- * to objects within the objects tag. You can pass
- * the id of the objects. This class then returns
- * the corresponding objects.
- */
-public class OIDToObject extends LguiHandler{
-
-	/*
-	 * Color which is returned, if an id as parameter is not connected
-	 */
-	private static final LMLColor notConnectedColor = LMLColor.lightGray;
-
-	private HashMap<String, ObjectType> oidToObject;
-	private HashMap<String, LMLColor> oidToColor;
-
-	private String systemId=null;//Id of an object with type system, there should only be one
-
-	/**
-	 * @param lguiItem LML-data-handler, which groups this handler and others to a set
-	 * of LMLHandler. This instance is needed to notify all LMLHandler, if any data of
-	 * the LguiType-instance was changed.
-	 */
-	public OIDToObject(ILguiItem lguiItem, LguiType lgui){
-		super(lguiItem, lgui);		
-		
-		updateData();	
-		
-		this.lguiItem.addListener(new ILguiListener() {
-			
-			@Override
-			public void handleEvent(ILguiUpdatedEvent e) {
-				update(e.getLguiItem().getLguiType());
-				updateData();
-			}
-		});
-	}
-
-	/**
-	 * Call this method, if lml-model changed. 
-	 * All getter-functions accessing the handler will
-	 * then return data, which is collected from this new model
-	 */
-	public void updateData(){
-
-		List<ObjectsType> allobjs = lguiItem.getOverviewAccess().getObjects();
-
-		for(ObjectsType frame: allobjs){
-
-			List<ObjectType> objects=frame.getObject();
-
-			oidToObject=new HashMap<String, ObjectType>();
-
-			oidToColor=new HashMap<String, LMLColor>();
-
-			for(ObjectType obj: objects){
-				oidToObject.put(obj.getId(), obj);
-				oidToColor.put(obj.getId(), LMLColor.stringToColor(obj.getColor()));
-
-				if(obj.getType()==ObjectName.SYSTEM){
-					systemId=obj.getId();
-				}
-			}
-
-		}
-	}
-
-	/**
-	 * get an object by an Id of this object
-	 * @param id
-	 * @return
-	 */
-	public ObjectType getObjectById(String id){
-		return oidToObject.get(id);		
-	}
-
-	/**
-	 * Get a color-object for a objects-id
-	 * @param id
-	 * @return
-	 */
-	public LMLColor getColorById(String id){		
-		if(id==null) 
-			return notConnectedColor;
-		LMLColor res=oidToColor.get(id);
-
-		if(res==null) return notConnectedColor;
-		else return res;
-	}
-	
-	/**
-	 * Convert a colorstring into an Color-Object
-	 * 
-	 * Allowed strings: #FFF #0000FF ffeeff cef ...
-	 * 
-	 * @param colorstring
-	 * @return
-	 */
-	public static Color stringToColor(String colorstring){
-
-		if(colorstring==null || colorstring.length()==0){
-			return Color.white;
-		}
-
-		if(colorstring.charAt(0)=='#'){
-			colorstring=colorstring.substring(1);
-		}
-
-		int red=0;
-		int green=0;
-		int blue=0;
-
-
-		if(colorstring.length()==3){
-			red=Integer.parseInt(colorstring.substring(0,1), 16);
-			green=Integer.parseInt(colorstring.substring(1,2), 16);
-			blue=Integer.parseInt(colorstring.substring(2,3), 16);
-
-			red=red+16*red;
-			green=green+16*green;
-			blue=blue+16*blue;
-		}
-		else
-			if(colorstring.length()==6){
-				red=Integer.parseInt(colorstring.substring(0,2), 16);
-				green=Integer.parseInt(colorstring.substring(2,4), 16);
-				blue=Integer.parseInt(colorstring.substring(4,6), 16);
-			}
-			else{
-				System.err.println("Not allowed color specified: "+colorstring);
-			}
-
-		return new Color(red, green, blue);	
-	}
-
-	/**
-	 * search for an object of type "system", return its id
-	 * Searching will only be done once for every model
-	 * @return id of system-object
-	 */
-	public String getSystemObjectId(){
-
-		return systemId;	
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/ObjectStatus.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/ObjectStatus.java
deleted file mode 100644
index f8206dc..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/ObjectStatus.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.eclipse.ptp.rm.lml.core.events.ILguiUpdatedEvent;
-import org.eclipse.ptp.rm.lml.core.listeners.ILguiListener;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.internal.core.elements.LguiType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ObjectType;
-
-
-/**
- * Saves which object has to be highlighted
- */
-public class ObjectStatus extends LguiHandler{
-
-	/**
-	 * 
-	 * All graphical components of the applet have to implement this interface.
-	 * It contains a callback-function, which is called for every registered
-	 * component. So every component is informed, if the status of highlighted
-	 * objects has changed. 
-	 * 
-	 * @author karbach
-	 *
-	 */
-	public static interface Updatable{
-		/**
-		 * @param j job, which was changed
-		 * @param mouseover true= mouse is over this object
-		 * @param mousedown true= mouse is pressed on this object
-		 */
-		public void updateStatus(ObjectType j, boolean mouseover, boolean mousedown);
-	}
-	
-	
-	/**
-	 * Saves all state-attributes, which can be changed by the user via
-	 * mouse-interaction.
-	 * 
-	 * @author karbach
-	 */
-	private static class State{
-		
-		public boolean mousedown, mouseover;
-		
-		public State(){
-			mousedown=false;
-			mouseover=false;
-		}	
-	}
-	
-	//lastmouseover and lastmousedown might be null at sturtup
-	private ObjectType lastmouseover;//saves the last object, which was touched by the mouse-cursor
-	private ObjectType lastmousedown;//saves the last object, on which the mouse clicked 
-	
-	private HashMap<ObjectType, State> mapping;
-	
-	private ArrayList<Updatable> components;//registered components, whose call-back-functions are called
-	
-	
-	/**
-	 * Initialise object-status attributes.
-	 * @param psuperHandler LML-data-handler, which groups this handler and others to a set
-	 * of LMLHandler. This instance is needed to notify all LMLHandler, if any data of
-	 * the LguiType-instance was changed.
-	 */
-	public ObjectStatus(ILguiItem psuperHandler, LguiType model){
-		super(psuperHandler, model);
-		
-		mapping=new HashMap<ObjectType, State>();
-		components=new ArrayList<Updatable>();
-		
-		lguiItem.addListener(new ILguiListener() {
-			
-			@Override
-			public void handleEvent(ILguiUpdatedEvent e) {
-				updateData(e.getLguiItem().getLguiType());
-			}
-		});
-	}
-	
-	/**
-	 * @return last and current object, which was touched by the mouse-cursor or null
-	 */
-	public ObjectType getLastMouseOver(){
-		return lastmouseover;
-	}
-	
-	/**
-	 * @return last and current object, on which the user is pressing the mouse
-	 */
-	public ObjectType getLastMouseDown(){
-		return lastmousedown;
-	}
-	
-	/**
-	 * Reset all object states.
-	 */
-	private void reset(){
-		mapping=new HashMap<ObjectType, State>();
-		lastmouseover=null;
-		lastmousedown=null;
-	}
-	
-	/**
-	 * 
-	 * Add component to internal memory. The component is then registered for call-back.
-	 * @param up
-	 */
-	public void addComponent(Updatable up){
-		if(!components.contains(up))
-			components.add(up);
-	}
-	
-	/**
-	 * Remove a component from updater-list.
-	 * This component's update-function wont be called after calling this function.
-	 * @param up updatable Component, which should not be updated any more
-	 */
-	public void removeComponent(Updatable up){
-		if(components.contains(up)){
-			components.remove(up);
-		}
-	}
-	
-	
-	/**
-	 * Inform all components when an object-state updates
-	 */
-	private void informAll(ObjectType obj, boolean mouseover, boolean mousedown){
-		for(int i=0; i<components.size(); i++){
-			components.get(i).updateStatus(obj, mouseover, mousedown);
-		}
-	}
-	
-	/**
-	 * @param obj 
-	 * @return true, if the connected object is currently touched by the cursor
-	 */
-	public boolean isMouseover(ObjectType obj){
-		if(obj==null) return false;
-		
-		if(mapping.containsKey(obj)){
-			return mapping.get(obj).mouseover;
-		}
-		else{//Otherwise insert new pair into mapping-instance
-			mapping.put(obj, new State());
-			return false;
-		}
-	}
-	
-	/**
-	 * @return true <=> at least one job has mouseover=true
-	 */
-	public boolean isAnyMouseover(){
-		return lastmouseover!=null;
-	}
-	
-	/**
-	 * @param obj
-	 * @return true, if mouse is pressed on this object 
-	 */
-	public boolean isMousedown(ObjectType obj){
-		if(obj==null) return false;
-		
-		if(mapping.containsKey(obj)){
-			return mapping.get(obj).mousedown;
-		}
-		else{//Otherwise insert new pair into mapping-instance
-			mapping.put(obj, new State());
-			return false;
-		}
-	}
-	
-	/**
-	 * @return true <=> at least one job has mousedown=true
-	 */
-	public boolean isAnyMousedown(){
-		return lastmousedown!=null;
-	}
-	
-	/**
-	 * Set the mouseover-property for object obj to true
-	 * Use this method, if the mouse moves over an object.
-	 * @param obj
-	 */
-	private void justMouseover(ObjectType obj){
-		
-		if(obj==null) return ;
-		
-		if(! mapping.containsKey(obj)){
-			mapping.put(obj, new State());
-		}
-		
-		State az=mapping.get(obj);
-		
-		if(! az.mouseover){
-			az.mouseover=true;
-			informAll(obj, true, az.mousedown);
-		}
-	}
-	
-	/**
-	 * Call this function, if the object obj is focussed by mouse-over.
-	 * Does Mouseexit for jobs, which were focussed before, does normal
-	 * mouse-over-action. Finally calls a mouseup for the last pressed job,
-	 * except the last job is equal to obj.
-	 * 
-	 * @param obj
-	 */
-	public void mouseover(ObjectType obj){
-		if(obj==null) return ;
-		
-		if(obj==lastmouseover) return;
-		
-		if(obj!=lastmouseover)
-			mouseExitLast();		
-		if(obj!=lastmousedown){
-			mouseup(lastmousedown);		
-		}
-		
-		lastmouseover=obj;
-		justMouseover(obj);		
-	}
-	
-	/**
-	 * Sets mousedown-property for object obj.
-	 * Should be called, if mouse is pressed on the
-	 * obj object.
-	 * @param obj
-	 */
-	public void mousedown(ObjectType obj){
-		if(obj==null) return ;
-		
-		if(! mapping.containsKey(obj)){
-			mapping.put(obj, new State());
-		}
-		
-		State az=mapping.get(obj);
-		
-		if(! az.mousedown){
-			az.mousedown=true;
-			lastmousedown=obj;
-			informAll(obj, az.mouseover, true);			
-		}
-	}
-	
-	/**
-	 * Sets mouse-over-property for obj to false.
-	 * This method is used, if the mouse exits the object obj.
-	 * @param obj
-	 */
-	public void mouseexit(ObjectType obj){
-		if(obj==null) return ;
-		
-		if(! mapping.containsKey(obj)){
-			mapping.put(obj, new State());
-		}
-		
-		State az=mapping.get(obj);
-		
-		if(az.mouseover){
-			az.mouseover=false;
-			lastmouseover=null;
-			informAll(obj, false, az.mousedown);			
-		}
-	}
-	
-	/**
-	 * If it is not known, which was the last focused job, call this function.
-	 * Last focused objects are set to unfocused.
-	 */
-	public void mouseExitLast(){
-		mouseexit(lastmouseover);
-		mouseup(lastmousedown);
-	}
-	
-	/**
-	 * Call this function, if mouse releases on this object.
-	 * 
-	 * @param obj
-	 */
-	public void mouseup(ObjectType obj){
-		if(obj==null) return ;
-		
-		//Release the last object, on which the mouse pressed 
-		if(lastmousedown!=obj){
-			mouseup(lastmousedown);
-			mouseExitLast();
-			mouseover(obj);
-		}
-		
-		if(! mapping.containsKey(obj)){
-			mapping.put(obj, new State());
-		}
-		State az=mapping.get(obj);
-		
-		if(az.mousedown){
-			az.mousedown=false;
-			lastmousedown=null;
-			informAll(obj, az.mouseover, false);			
-		}
-	}
-
-	/**
-	 * Call this method, if lml-model changed. The new model is passed
-	 * to this handler. All getter-functions accessing the handler will
-	 * then return data, which is collected from this new model
-	 * @param model new lml-data-model
-	 */
-	public void updateData(LguiType model) {
-		reset();
-	}
-	
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/OverviewAccess.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/OverviewAccess.java
deleted file mode 100644
index c03435d..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/OverviewAccess.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, Claudia Knobloch, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.internal.core.model;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.xml.bind.JAXBElement;
-
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.internal.core.elements.GobjectType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.InformationType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.LayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.LguiType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ObjectsType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SplitlayoutType;
-
-public class OverviewAccess extends LguiHandler{
-	
-	public OverviewAccess(ILguiItem lguiItem, LguiType model) {
-		super(lguiItem, model);
-	}
-	
-	/**
-	 * Getting a list with all elements of type ObjectsType from LguiType.
-	 * @return list of elements(ObjectsType)
-	 */
-	List<ObjectsType> getObjects() {
-		List<ObjectsType> objects = new LinkedList<ObjectsType>();
-		for (JAXBElement<?> tag : lgui.getObjectsAndRelationsAndInformation()) {
-			if (tag.getValue() instanceof ObjectsType) {
-				objects.add((ObjectsType) tag.getValue());
-			}
-		}
-		return objects;
-	}
-	
-	/**
-	 * Getting a list of all elements of type InformationsType from LguiType.
-	 * @return list of elements(InfomationsType)
-	 */
-	List<InformationType> getInformations() {
-		List<InformationType> informations = new LinkedList<InformationType>();
-		for (JAXBElement<?> tag : lgui.getObjectsAndRelationsAndInformation()) {
-			if (tag.getValue() instanceof InformationType) {
-				informations.add((InformationType) tag.getValue());
-			}
-		}
-		return informations;
-	}
-	
-	/**
-	 * Getting a list of all elements of type GobjectType from LguiType.
-	 * @return list of elements(GobjectsType)
-	 */
-	List<GobjectType> getGraphicalObjects() {
-		List<GobjectType> objects = new LinkedList<GobjectType>();
-		for (JAXBElement<?> tag : lgui.getObjectsAndRelationsAndInformation()) {
-			if (tag.getValue() instanceof GobjectType) {
-				objects.add((GobjectType) tag.getValue());
-			}
-		}
-		return objects;
-	}
-
-	
-	/**
-	 * Getting a list of all elements of type LayoutType.
-	 * @return list of elements(LayoutType)
-	 */
-	List<LayoutType> getLayouts() {
-		List<LayoutType> layouts = new LinkedList<LayoutType>();
-		for (JAXBElement<?> tag : lgui.getObjectsAndRelationsAndInformation()) {
-			if (tag.getValue() instanceof LayoutType) {
-				layouts.add((LayoutType) tag.getValue());
-			}
-		}
-		return layouts;
-	}
-	
-	/**
-	 * Getting a list of all elements of type Splitlayout.
-	 * @return list of elements(Splitlayout)
-	 */
-	List<SplitlayoutType> getSplitlayouts() {
-		List<SplitlayoutType> tables = new LinkedList<SplitlayoutType>();
-		for (LayoutType tag : getLayouts()) {
-			if (tag instanceof SplitlayoutType) {
-				tables.add((SplitlayoutType) tag);
-			}
-		}
-		return tables;
-	}
-	
-	
-	
-	
-
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/TableColumnLayout.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/TableColumnLayout.java
deleted file mode 100644
index 3a74345..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/TableColumnLayout.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-
-
-package org.eclipse.ptp.rm.lml.internal.core.model;
-
-import org.eclipse.ptp.rm.lml.core.model.ITableColumnLayout;
-
-/**
- * Class of the interface ITableColumnLayout
- */
-public class TableColumnLayout implements ITableColumnLayout {
-	
-	/*
-	 * Title of the column
-	 */
-	private String title;
-	
-	/*
-	 * Width of the column
-	 */
-	private int width;
-	
-	/*
-	 * Style of the column 
-	 */
-	private String style;
-	
-	/**
-	 * Constructor
-	 * @param title title of the column
-	 * @param size width of the column
-	 * @param width style of the column
-	 */
-	public TableColumnLayout(String title, int size, String width) {
-		this.title = title;
-		this.width = size;
-		this.style = width;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.IJobTableColumnLayout#getTitle()
-	 */
-	public String getTitle() {
-		return title;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.IJobTableColumnLayout#getWidth()
-	 */
-	public int getWidth() {
-		return width;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.IJobTableColumnLayout#getStyle()
-	 */
-	public String getStyle() {
-		return style;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/TableHandler.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/TableHandler.java
deleted file mode 100644
index 074386d..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/TableHandler.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.ptp.rm.lml.core.events.ILguiUpdatedEvent;
-import org.eclipse.ptp.rm.lml.core.listeners.ILguiListener;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.core.model.ITableColumnLayout;
-import org.eclipse.ptp.rm.lml.internal.core.elements.GobjectType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.LguiType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.RowType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.TableType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.TablelayoutType;
-
-public class TableHandler extends LguiHandler {
-	
-	public class TableListener implements ILguiListener {
-
-		@Override
-		public void handleEvent(ILguiUpdatedEvent e) {
-			
-		}
-		
-	}
-	
-	private TableListener tableListener = new TableListener();
-	
-
-	/**
-	 * Getting a list of all elements of type TableType from LguiType.
-	 * @return list of elements(TableType)
-	 */
-	List<TableType> getTables() {
-		List<TableType> tables = new LinkedList<TableType>();
-		for (GobjectType tag : lguiItem.getOverviewAccess().getGraphicalObjects()) {
-			if (tag instanceof TableType) {
-				tables.add((TableType) tag);
-			}
-		}
-		return tables;
-	}
-	
-	public void changeTableColumnsWidth(Double[] widths, String tableType) {
-		TableType table = getTable(tableType);
-		TablelayoutType layout = lguiItem.getLayoutAccess().getTableLayout(table.getId());
-		for (int i = 0; i < widths.length; i++) {
-			layout.getColumn().get(i).setWidth(widths[i]);
-		}
-	}
-	
-	/**
-	 * Getting an element(Table Type) which has an equal title to the argument tableType.
-	 * @param tableType Title of the desired table
-	 * @return Corresponding table to the desired table title
-	 */
-	TableType getTable(String tableType) {
-		for (TableType tag : getTables()) {
-			if (tag.getTitle().equals(tableType)) {
-				return tag;
-			}
-		}
-		return null;
-	}
-	
-	public TableHandler(ILguiItem lguiItem, LguiType lgui) {
-		super(lguiItem, lgui);
-		lguiItem.addListener(tableListener);
-	}
-	
-	
-	public int getNumberOfTables() {
-		return getTables().size();
-	}
-	
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiItem#getTableColumnsNumber(String tableType)
-	 */
-	public int getTableColumnNumber(String tableType) {
-		TableType table = getTable(tableType);
-		if (table != null) {
-			return table.getColumn().size();
-		}
-		return 0;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiItem#getTableColumnsNames(String tableType)
-	 */
-	public String[] getTableColumnsName(String tableType) {
-		TableType table = getTable(tableType);
-		String[] names = new String[table.getColumn().size()];
-		for (int i = 0; i < names.length; i ++) {
-			names[i] = table.getColumn().get(i).getName();
-		}
-		return names;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiItem#getTableColumnsWidth(String tableType, int widthTable)
-	 */
-	public int[] getTableColumnsWidth(String tableType, int widthTable) {
-		TableType table = getTable(tableType);
-		TablelayoutType tablelayout = lguiItem.getLayoutAccess().getTableLayout(table.getId());
-		int[] widthInt = new int[table.getColumn().size()];
-		
-		double sumWidthColumns = 0;
-		
-		for(int i = 0; i < table.getColumn().size(); i++) {
-			sumWidthColumns += tablelayout.getColumn().get(i).getWidth();		
-		}
-		
-		
-		for (int i = 0; i < widthInt.length; i ++) {
-			widthInt[i] = (int) (tablelayout.getColumn().get(i).getWidth() * widthTable / sumWidthColumns);
-		}
-		return widthInt;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiItem#getTableColumnsStyle(String tableType)
-	 */
-	public String[] getTableColumnsStyle(String tableType) {
-		TableType table = getTable(tableType);
-		String[] style = new String[table.getColumn().size()];
-		for (int i = 0; i < style.length; i++) {
-			switch (table.getColumn().get(i).getSort().value().charAt(0)) {
-			case 'a' :
-			case 'd' :
-				style[i] = "LEFT";
-				break;
-			case 'n' :
-				style[i] = "RIGHT";
-				break;
-			default :
-			}
-		}
-		return style;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiItem#getJobTableColumnLayout(String tableType, int widthTable)
-	 */
-	public ITableColumnLayout[] getTableColumnLayout(String tableType,
-			int widthTable) {
-		TableType table = getTable(tableType);
-		TablelayoutType tableLayout = lguiItem.getLayoutAccess().getTableLayout(table.getId());
-		if (tableLayout.getColumn().size() <= 0) {
-			tableLayout = lguiItem.getLayoutAccess().getDefaultTableLayout(table);
-		}
-		ITableColumnLayout[] jobTableColumnLayouts = new ITableColumnLayout[table.getColumn().size()];
-		double sumWidthColumns = 0;
-		
-		for(int i = 0; i < table.getColumn().size(); i++) {
-			sumWidthColumns += tableLayout.getColumn().get(i).getWidth();		
-		}
-		
-		
-		for (int i = 0; i < jobTableColumnLayouts.length; i ++) {
-			String style;
-			switch (table.getColumn().get(i).getSort().value().charAt(0)) {
-			case 'a' :
-			case 'd' :
-				style = "LEFT";
-				break;
-			case 'n' :
-				style = "RIGHT";
-				break;
-			default :
-				style = "LEFT";
-			}
-			jobTableColumnLayouts[i] = new TableColumnLayout(
-					table.getColumn().get(i).getName(),
-					(int) (tableLayout.getColumn().get(i).getWidth() * widthTable / sumWidthColumns),
-					style);
-		}
-		return jobTableColumnLayouts;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiItem#getJobTableData(String tableType)
-	 */
-	public String[][] getTableData(String tableType) {
-		TableType table = getTable(tableType);
-		String[][] jobTableData = new String[table.getRow().size()][];
-		for (int i = 0; i < jobTableData.length; i++) {
-			String[] jobTableDataRow = new String[table.getRow().get(i).getCell().size()];
-			for (int j = 0; j < jobTableDataRow.length; j++) {
-				jobTableDataRow[j] = table.getRow().get(i).getCell().get(j).getValue();
-			}
-			jobTableData[i] = jobTableDataRow;
-		}
-		return jobTableData;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiItem#getTypeJobTableColumn(String tableType, int index)
-	 */
-	public String getTypeTableColumn(String tableType, int index) {
-		return getTable(tableType).getColumn().get(index).getSort().value();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rm.lml.core.elements.ILguiItem#sort(String tableType, int sortDirectionComparator, int sortIndex, int sortDirection)
-	 */
-	public void sort(String tableType, int sortDirectionComparator, int sortIndex, int sortDirection) {
-		RowType[] jobTableData = getTable(tableType).getRow().toArray(
-				new RowType[getTable(tableType).getRow().size()]);
-		Arrays.sort(jobTableData, new TableSorter(getTypeTableColumn(tableType, sortIndex), sortDirectionComparator, sortIndex, sortDirection));
-		getTable(tableType).getRow().clear();
-		for (int i = 0; i < jobTableData.length; i++) {
-			getTable(tableType).getRow().add(jobTableData[i]);
-		}
-	}
-	
-	public String getTableTitle(int i) {
-		return getTables().get(i).getTitle();
-	}
-
-	public String[] getTableColumnNonActive(String tableType) {
-		TablelayoutType tableLayout = lguiItem.getLayoutAccess().getTableLayout(getTable(tableType).getId());
-		ArrayList<String> tableColumnNonActive = new ArrayList<String>();
-		for (int i = 0; i < tableLayout.getColumn().size(); i++) {
-			if (!tableLayout.getColumn().get(i).isActive()) {
-				tableColumnNonActive.add(tableLayout.getColumn().get(i).getKey());
-			}
-		}
-		return tableColumnNonActive.toArray(new String[tableColumnNonActive.size()]);
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/TableSorter.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/TableSorter.java
deleted file mode 100644
index b3c6d94..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/model/TableSorter.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.internal.core.model;
-
-import java.text.ParseException;
-import java.util.Comparator;
-import java.util.Date;
-
-import org.eclipse.ptp.rm.lml.core.LMLCorePlugin;
-import org.eclipse.ptp.rm.lml.internal.core.elements.RowType;
-
-/**
- * Comparator for an array of elements of RowType.
- *
- */
-public class TableSorter implements Comparator<RowType>{
-	
-	/*
-	 * The comparison value
-	 */
-	private int up;
-	
-	/*
-	 * The index of the sort column
-	 */
-	private int sortIndex;
-	
-	/*
-	 * The direction of the sorting (UP or DOWN)
-	 */
-	private int sortDirection;
-	
-	/*
-	 * The type of the sorting (date, numerix or alpha)
-	 */
-	private String sortType;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param sortType type how the method should sort
-	 * @param up comparison value (value for sorting upwards)
-	 * @param sortIndex index of the to sorting column
-	 * @param sortDirection value of the to sorting direction
-	 */
-	public TableSorter(String sortType, int up, int sortIndex, int sortDirection) {
-		this.up = up;
-		this.sortIndex = sortIndex;
-		this.sortDirection = sortDirection;
-		this.sortType = sortType;
-	}
-	
-	/**
-	 * Compares two arguments of the RowType for order.
-	 * If their are equal, the method returns 0. Returns -1, 0 or 1 as the first argument is less than, equal to, or greater than the second.
-	 * @param a first element
-	 * @param b second element
-	 * @return integer which represents the result of the comparison
-	 */
-	public int compare(RowType a, RowType b) {
-		// The two elements are equal
-		if(a.getCell().get(sortIndex).getValue().equals(b.getCell().get(sortIndex).getValue())) {
-			return 0;
-		}
-		// The two elements are not equal
-		if (sortType.equals("date")) {
-			// The sort type is date
-			Date aDate = null;
-			Date bDate = null;
-			try {
-				aDate = LMLCorePlugin.getDefault().getSimpleDateFormat(a.getCell().get(sortIndex).getValue().length()).parse(a.getCell().get(sortIndex).getValue());
-				bDate = LMLCorePlugin.getDefault().getSimpleDateFormat(b.getCell().get(sortIndex).getValue().length()).parse(b.getCell().get(sortIndex).getValue());
-			} catch (ParseException e) {
-				return 0;
-			}
-
-			if (sortDirection == up) {
-				return aDate.compareTo(bDate) < 0 ? -1 : 1;
-			} else {
-				return aDate.compareTo(bDate) < 0 ? 1 : -1;
-			}
-			
-		} else if (sortType.equals("numeric")) {
-			// The sort type is a numeric one
-			if (sortDirection == up){
-				return Integer.parseInt(a.getCell().get(sortIndex).getValue()) < Integer.parseInt(b.getCell().get(sortIndex).getValue()) ? -1 : 1;
-			} else {
-				return Integer.parseInt(a.getCell().get(sortIndex).getValue()) < Integer.parseInt(b.getCell().get(sortIndex).getValue()) ? 1 : -1;
-			}
-		} else {
-			// The (default) sort type is a alphabetic one 
-			if (sortDirection == up) {
-				return a.getCell().get(sortIndex).getValue().compareTo(b.getCell().get(sortIndex).getValue()) < 0 ? -1 : 1;
-			} else {
-				return a.getCell().get(sortIndex).getValue().compareTo(b.getCell().get(sortIndex).getValue()) < 0 ? 1 : -1;
-			}
-		}
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/nodedisplay/ErrorList.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/nodedisplay/ErrorList.java
deleted file mode 100644
index a8df94c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/nodedisplay/ErrorList.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.internal.core.nodedisplay;
-
-import java.util.ArrayList;
-
-/**
- *This class collects errors, which occur while parsing
- *and checking lml-files
- * 
- * @author Carsten Karbach, FZ Juelich
- *
- *
- */
-public class ErrorList {
-	
-	
-	private ArrayList<String> errors;
-	
-	private boolean realerror;
-	
-	public ErrorList(){
-		errors = new ArrayList<String>();
-		realerror = false;
-	}
-	
-	/**
-	 * An error occurred. Add it to the list
-	 * @param errormsg
-	 */
-	public void addError(String errormsg) {
-		errors.add(errormsg);
-		realerror = true;
-	}
-	
-	public void addMessage(String msg) {
-		errors.add(msg);
-	}
-	
-	/**
-	 * @return true, if addError was used, else false
-	 */
-	public boolean isRealError() {
-		return realerror;
-	}
-	
-	public String toString() {
-		
-		String res = "";
-		
-		if (realerror) {
-			res = "Following errors occurred: \n";
-		}
-		else res = "No errors: \n";
-		
-		for (int i = 0; i < errors.size(); i++) {
-			res += errors.get(i) + "\n";
-		}
-		
-		return res;
-		
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/nodedisplay/FastImpCheck.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/nodedisplay/FastImpCheck.java
deleted file mode 100644
index 7585099..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/nodedisplay/FastImpCheck.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.internal.core.nodedisplay;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataElement;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplay;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeType;
-
-/**
- * This class is capable of checking implicit names given by refid-attributes
- * faster than by creating all implicit names and then look if refid-values were created
- * @author Carsten Karbach, FZ Juelich
- *
- */
-public class FastImpCheck {
-	
-	
-	private static ArrayList<ArrayList<Integer>> levels;
-	
-	public static ArrayList<ArrayList<Integer>> getAllImpNameLevels(String impname, Object scheme) {
-		
-		levels = new ArrayList<ArrayList<Integer>>();
-		
-		impnameToAllPossibleLevel(impname, scheme, new ArrayList<Integer>() );
-		
-		return levels;		
-	}
-	
-	/**
-	 * transform implicit name into level-nrs if possible,
-	 * otherwise return null
-	 * 
-	 * only lower elements of scheme are interesting
-	 * 
-	 * @param impname relative name, which might be defined in the given scheme
-	 * @param scheme any scheme-element on any level
-	 * @param nrs Level-Numbers till now
-	 * @return
-	 */
-	public static ArrayList<Integer> impnameToOneLevel(String impname, Object scheme, ArrayList<Integer> nrs) {
-		
-		List<SchemeElement> lower = LMLCheck.getLowerSchemeElements(scheme);
-		for (SchemeElement low : lower) {
-			
-			Mask amask = new Mask(low);
-			
-			int i = 1;
-			while (i <= impname.length() && ! amask.isOutputAllowed(impname.substring(0, i))) {
-				i++;
-			}
-			
-			if (i > impname.length()) {
-				//No part-string is allowed for this mask
-				continue;
-			}
-			
-			//Otherwise impname.substring(0, i) is allowed
-			while (i <= impname.length() && amask.isOutputAllowed(impname.substring(0, i))) {				
-				
-				int id = amask.getNumberOfLevelstring( impname.substring(0, i) );
-				nrs.add(id);//add current number
-				
-				if (i == impname.length()) {//Solution found
-					return nrs;
-				}
-				else {//Go deeper
-
-					ArrayList<Integer> res = impnameToOneLevel( impname.substring(i) , low, nrs);
-					if (res != null) {
-						return res;
-					}
-				}
-				
-				nrs.remove(nrs.size() -1 );//Remove number added on this recursion-level
-				i++;
-			}
-			
-		}
-		
-		return null;		
-	}
-	
-	/**
-	 * transform implicit name into level-nrs if possible,
-	 * generates all allowed solutions
-	 * 
-	 * only lower elements of scheme are interesting
-	 * 
-	 * @param impname relative name, which might be defined in the given scheme
-	 * @param scheme any scheme-element on any level
-	 * @param nrs Level-Numbers till now
-	 * @return
-	 */
-	public static void impnameToAllPossibleLevel(String impname, Object scheme, ArrayList<Integer> nrs) {
-		
-		List<SchemeElement> lower = LMLCheck.getLowerSchemeElements(scheme);
-		for(SchemeElement low: lower){
-			
-			Mask amask = new Mask(low);
-			
-			int i = 1;
-			while (i <= impname.length() && ! amask.isOutputAllowed(impname.substring(0, i))) {
-				i++;
-			}
-			
-			if (i>impname.length()) {
-				//No part-string is allowed for this mask
-				continue;
-			}
-				
-			
-			//Otherwise impname.substring(0, i) is allowed
-			while (i <= impname.length() && amask.isOutputAllowed(impname.substring(0, i))) {				
-				int id = amask.getNumberOfLevelstring( impname.substring(0, i));
-				nrs.add(id);//add current number
-				
-				if (i == impname.length() ) {//Solution found
-					ArrayList<Integer> copy = LMLCheck.copyArrayList(nrs);
-					levels.add(copy);
-				}
-				else {//Go deeper
-					impnameToAllPossibleLevel(impname.substring(i), low, nrs);
-				}
-				
-				nrs.remove(nrs.size() - 1);//Remove number added on this recursion-level
-				i++;
-			}
-			
-		}
-		
-	}
-	
-	
-	
-	/**
-	 * parses all coherent digits and puts them into a an arraylist
-	 * 
-	 * p100-13,  0009-0-012 is transformed into 100,13,9,0,12 in an arraylist
-	 * 
-	 * @param impname implicit name of a component of a parallel computer
-	 * @param scheme where the implicit object is defined by for masks-access
-	 * @return arraylist of level-numbers
-	 */
-	private static ArrayList<Integer> impnameToLevel(String impname, HashMap<Integer, Mask> pmasks) {
-		
-		ArrayList<Integer> res = new ArrayList<Integer>();
-		
-		int length = impname.length();
-		
-		int sumlength = 0;
-		
-		int level = 1;
-		
-		while (sumlength < length) {
-			
-			Mask amask = pmasks.get(level++);
-			
-			if (amask == null) {//No mask for this level => error in parsing
-//				System.err.println("No mask for level "+level);
-				return null;
-			}
-			
-			int alength = 0;//Length of the current mask-output
-			
-			if (amask.getOutputLength() >= 0) {//fixed length
-				alength = amask.getOutputLength();
-				
-				if (sumlength + alength > impname.length() ||
-						! amask.isOutputAllowed(impname.substring(sumlength, sumlength+alength))) {
-					return null;
-				}
-			}
-			else {
-				//Variable-length-mask
-				String rest = impname.substring(sumlength);
-				
-				int i = 1;
-				//Find first part that is allowed
-				while (i <= rest.length() && ! amask.isOutputAllowed(rest.substring(0, i)) ) {
-					i++;
-				}
-				
-				if (i <= rest.length()) {
-					//Find last part that is allowed
-					int j = i;
-					while (j <= rest.length() && amask.isOutputAllowed(rest.substring(0, j))){
-						j++;
-					}
-					
-					alength = j - 1;
-				}
-				else {
-					return null;//Given output is not allowed
-				}
-			}
-			
-			int nr = amask.getNumberOfLevelstring(impname.substring(sumlength, sumlength + alength));
-			res.add(nr);
-			
-			sumlength += alength;
-		}
-		
-		return res;
-	}
-	
-	/**
-	 * Has to be called for nodedisplayviews
-	 * begin level with 1
-	 * Searches all masks within the scheme-tag of the nodedisplay
-	 * @param sel schemeelement
-	 * @param level
-	 */
-	private static HashMap<Integer, Mask> findMasks(Object sel, int level, HashMap<Integer, Mask> masks){
-		
-		List els=LMLCheck.getLowerSchemeElements(sel);
-		
-		for(Object el:els){
-			
-			SchemeElement asel=(SchemeElement) el;
-			
-			if(! masks.containsKey(level) && asel.getMask()!=null){
-				masks.put(level, new Mask(asel) );
-			}
-			
-			findMasks(asel, level+1, masks);
-		}
-		
-		return masks;
-		
-	}
-	
-	/**
-	 * Runs through data-tree and searches for refid-attributes
-	 * Converts every refid into level-ids and searches given object
-	 * within the scheme-definition of base nodedisplay
-	 * adds errors to res, if refid-object does not exist within scheme
-	 * @param data Data-Element of referencing nodedisplay
-	 * @param masks mask-attributes of base nodedisplay 
-	 * @param scheme scheme-element of base nodedisplay
-	 * @param res errors
-	 * @return errorlist which occurred during checks
-	 */
-	private static ErrorList rekCheckRefids(Object data, SchemeType scheme, ErrorList res) {
-		
-		List els = LMLCheck.getLowerDataElements(data);
-		if (els == null) {
-			return res;//Keine Unterelemente gefunden
-		}
-		for (int i = 0; i < els.size(); i++){
-			
-			DataElement el = (DataElement) els.get(i);
-			
-			String refname = el.getRefid();
-			
-			if (refname != null) {
-//				ArrayList<Integer> level=impnameToLevel(refname, masks);
-				ArrayList<Integer> level = impnameToOneLevel(refname, scheme, new ArrayList<Integer>());
-				if (level == null) {
-					res.addError("\tError refid " + refname + " is not allowed corresponding to the scheme-tag");
-				}
-				else {
-					if (LMLCheck.getSchemeByLevels(level, scheme) == null) {
-
-						res.addError("\tError refid " + refname + " is not allowed corresponding to the scheme-tag");
-					}
-				}
-			}
-			
-			rekCheckRefids(el, scheme, res);
-		}
-		
-		return res;
-		
-	}
-	
-	/**
-	 * searches for refid within referencing nodedisplay and return errors if these
-	 * refids are not allowed concerning the scheme given by the base nodedisplay
-	 * @param base
-	 * @param ref
-	 * @return
-	 */
-	public static ErrorList checkRefids(Nodedisplay base, Nodedisplay ref, ErrorList pres) {
-		
-		ErrorList res;
-		if (pres == null) {
-			res = new ErrorList();
-		}
-		else {
-			res = pres;
-		}
-		
-		rekCheckRefids(ref.getData(), base.getScheme(), res);
-		
-		return res;
-	}
-
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/nodedisplay/LMLCheck.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/nodedisplay/LMLCheck.java
deleted file mode 100644
index 4e06289..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/nodedisplay/LMLCheck.java
+++ /dev/null
@@ -1,1161 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.internal.core.nodedisplay;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-
-import javax.xml.XMLConstants;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataElement;
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataElement1;
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataElement2;
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataElement3;
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataElement4;
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataElement5;
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataElement6;
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataElement7;
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataElement8;
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataElement9;
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.GobjectType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.LayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.LguiType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplay;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplayelement;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplayelement0;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplayelement1;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplayelement2;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplayelement3;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplayelement4;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplayelement5;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplayelement6;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplayelement7;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplayelement8;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplayelement9;
-import org.eclipse.ptp.rm.lml.internal.core.elements.NodedisplaylayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ObjectsType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement1;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement2;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement3;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement4;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement5;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement6;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement7;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement8;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement9;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeType;
-import org.xml.sax.SAXException;
-
-/**
- * This class is a copy of LMLCheck out of a lml-checking-tool
- * only function checkImplicitNames is missing
- * 
- * This class supports several view-classes by navigating through the nodedisplays
- * @author Carsten Karbach, FZ Juelich
- *
- */
-public class LMLCheck {
-	
-	
-	/**
-	 * @return Object of LguiType parsed out of an lml-File
-	 * @throws JAXBException
-	 */
-	public static LguiType parseLML(URL xml, URL xsd) throws JAXBException {
-		//Causes errors while used in applet
-		
-		JAXBContext jc = JAXBContext.newInstance("lml");
-		
-		Unmarshaller unmar = jc.createUnmarshaller();
-
-		
-		if(xsd!=null){
-			Schema mySchema;
-			SchemaFactory sf =
-				SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
-			try {
-				mySchema = sf.newSchema(xsd);
-			} catch( SAXException saxe ){
-				// ...(error handling)
-				mySchema = null;
-			}
-
-			//Connect schema to unmarshaller
-			unmar.setSchema(mySchema);
-		}
-		
-		//Validate lml-file and unmarshall in one step
-		JAXBElement<LguiType> doc = (JAXBElement<LguiType>) unmar.unmarshal( xml);
-		//Get root-element
-		LguiType lml = doc.getValue();
-		
-		return lml;
-	}
-	
-	/**
-	 * get all objects-Tags
-	 * @param model
-	 * @return
-	 */
-	public static List<ObjectsType> getObjects(LguiType model) {
-		
-		List<JAXBElement<?>> all = model.getObjectsAndRelationsAndInformation();
-		
-		List<ObjectsType> objects = new ArrayList<ObjectsType>();
-		
-		for (JAXBElement<?> aobj: all) {
-			if (aobj.getValue() instanceof ObjectsType) {
-				objects.add((ObjectsType) aobj.getValue());
-			}
-		}
-		
-		return objects;	
-		
-	}
-	
-	/**
-	 * Get all Layout-Definitions out of the lml-file
-	 * @param pmodell
-	 * @return
-	 */
-	public static List<LayoutType> getLayouts(LguiType pmodell) {
-		
-		List<JAXBElement<?>> all = pmodell.getObjectsAndRelationsAndInformation();
-		
-		List<LayoutType> layouts = new ArrayList<LayoutType>();
-		
-		for (JAXBElement<?> aobj: all) {
-			if (aobj.getValue() instanceof LayoutType) {
-				layouts.add((LayoutType) aobj.getValue());
-			}
-		}
-		
-		return layouts;		
-	}
-	
-	/**
-	 * Get all graphical objects out of the lml-file
-	 * @param pmodell
-	 * @return
-	 */
-	public static List<GobjectType> getGraphicalObjects(LguiType pmodell)  {
-		
-		List<JAXBElement<?>> all = pmodell.getObjectsAndRelationsAndInformation();
-		
-		List<GobjectType> gobj = new ArrayList<GobjectType>();
-		
-		for (JAXBElement<?> aobj: all) {
-			if (aobj.getValue() instanceof GobjectType) {
-				gobj.add((GobjectType) aobj.getValue());
-			}
-		}
-		
-		return gobj;	
-	}
-	
-	/**
-	 * @param el
-	 * @return in which level this dataelement is placed, 0 for DataType, 10 for DataElement (unspecific)
-	 */
-	public static int getDataLevel(Object el) {
-		if (el instanceof DataType) {
-			return 0;
-		}		
-		if (el instanceof DataElement1) {
-			return 1;
-		}
-		if (el instanceof DataElement2) {
-			return 2;
-		}
-		if (el instanceof DataElement3) {
-			return 3;
-		}
-		if (el instanceof DataElement4) {
-			return 4;
-		}
-		if (el instanceof DataElement5) {
-			return 5;
-		}
-		if (el instanceof DataElement6) {
-			return 6;
-		}
-		if (el instanceof DataElement7) {
-			return 7;
-		}
-		if (el instanceof DataElement8) {
-			return 8;
-		}
-		if (el instanceof DataElement9) {
-			return 9;
-		}
-		if (el instanceof DataElement) {
-			return 10;
-		}
-		
-		return -1;
-	}
-	
-	/**
-	 * Returns a List of lower data-elements for a data-element or a dataType-instance
-	 * within a data-section of a nodedisplay
-	 * 
-	 * @param el
-	 * @return
-	 */
-	public static List getLowerDataElements(Object el) {
-		
-		if (el instanceof DataType) {
-			return ((DataType) el).getEl1();
-		}		
-		if (el instanceof DataElement1) {
-			return ((DataElement1)el).getEl2();
-		}
-		if (el instanceof DataElement2) {
-			return ((DataElement2)el).getEl3();
-		}
-		if (el instanceof DataElement3) {
-			return ((DataElement3)el).getEl4();
-		}
-		if (el instanceof DataElement4) {
-			return ((DataElement4)el).getEl5();
-		}
-		if (el instanceof DataElement5) {
-			return ((DataElement5)el).getEl6();
-		}
-		if (el instanceof DataElement6) {
-			return ((DataElement6)el).getEl7();
-		}
-		if (el instanceof DataElement7) {
-			return ((DataElement7)el).getEl8();
-		}
-		if (el instanceof DataElement8) {
-			return ((DataElement8)el).getEl9();
-		}
-		if (el instanceof DataElement9) {
-			return ((DataElement9)el).getEl10();
-		}		
-		
-		return new ArrayList();
-	}
-	
-	/**
-	 * @param el
-	 * @return in which level this schemeelement is placed, 0 for SchemeType, 10 for SchemeElement (unspecific)
-	 */
-	public static int getSchemeLevel(Object el){
-		
-		if (el instanceof SchemeType) {
-			return 0;
-		}		
-		if (el instanceof SchemeElement1) {
-			return 1;
-		}
-		if (el instanceof SchemeElement2) {
-			return 2;
-		}
-		if (el instanceof SchemeElement3) {
-			return 3;
-		}
-		if (el instanceof SchemeElement4) {
-			return 4;
-		}
-		if (el instanceof SchemeElement5) {
-			return 5;
-		}
-		if (el instanceof SchemeElement6) {
-			return 6;
-		}
-		if (el instanceof SchemeElement7) {
-			return 7;
-		}
-		if (el instanceof SchemeElement8) {
-			return 8;
-		}
-		if (el instanceof SchemeElement9) {
-			return 9;
-		}
-		if (el instanceof SchemeElement) {
-			return 10;
-		}
-		
-		return -1;
-	}
-	
-	/**
-	 * Returns a List of lower scheme elements for a scheme-element or a SchemeType-instance
-	 * 
-	 * @param el
-	 * @return
-	 */
-	public static List getLowerSchemeElements(Object el) {
-		
-		if (el instanceof SchemeType) {
-			return ((SchemeType) el).getEl1();
-		}		
-		if (el instanceof SchemeElement1) {
-			return ((SchemeElement1)el).getEl2();
-		}
-		if (el instanceof SchemeElement2) {
-			return ((SchemeElement2)el).getEl3();
-		}
-		if (el instanceof SchemeElement3) {
-			return ((SchemeElement3)el).getEl4();
-		}
-		if (el instanceof SchemeElement4) {
-			return ((SchemeElement4)el).getEl5();
-		}
-		if (el instanceof SchemeElement5) {
-			return ((SchemeElement5)el).getEl6();
-		}
-		if (el instanceof SchemeElement6) {
-			return ((SchemeElement6)el).getEl7();
-		}
-		if (el instanceof SchemeElement7) {
-			return ((SchemeElement7)el).getEl8();
-		}
-		if (el instanceof SchemeElement8) {
-			return ((SchemeElement8)el).getEl9();
-		}
-		if (el instanceof SchemeElement9) {
-			return ((SchemeElement9)el).getEl10();
-		}		
-		
-		return new ArrayList();
-	}
-	
-	/**
-	 * Returns a List of lower nodedisplayelements for a NodedisplayelementX or a NodedisplaylayoutType
-	 * 
-	 * @param el
-	 * @return
-	 */
-	public static List getLowerNodedisplayElements(Object el) {
-		
-		if (el instanceof NodedisplaylayoutType) {
-			ArrayList<Nodedisplayelement0> justonelement = new ArrayList<Nodedisplayelement0>();
-			justonelement.add( ((NodedisplaylayoutType) el).getEl0() );
-			return justonelement;
-		}		
-		if (el instanceof Nodedisplayelement0) {
-			return ((Nodedisplayelement0)el).getEl1();
-		}
-		if (el instanceof Nodedisplayelement1) {
-			return ((Nodedisplayelement1)el).getEl2();
-		}
-		if (el instanceof Nodedisplayelement2) {
-			return ((Nodedisplayelement2)el).getEl3();
-		}
-		if (el instanceof Nodedisplayelement3) {
-			return ((Nodedisplayelement3)el).getEl4();
-		}
-		if (el instanceof Nodedisplayelement4) {
-			return ((Nodedisplayelement4)el).getEl5();
-		}
-		if (el instanceof Nodedisplayelement5) {
-			return ((Nodedisplayelement5)el).getEl6();
-		}
-		if (el instanceof Nodedisplayelement6) {
-			return ((Nodedisplayelement6)el).getEl7();
-		}
-		if (el instanceof Nodedisplayelement7) {
-			return ((Nodedisplayelement7)el).getEl8();
-		}
-		if (el instanceof Nodedisplayelement8) {
-			return ((Nodedisplayelement8)el).getEl9();
-		}
-		if (el instanceof Nodedisplayelement9) {
-			return ((Nodedisplayelement9)el).getEl10();
-		}
-		
-		return new ArrayList();
-	}
-	
-	/**
-	 * Returns the height of the scheme-tree given by this schemeEl
-	 * @param schemeEl scheme elements or a SchemeType-instance
-	 * @return
-	 */
-	public static int getDeepestSchemeLevel(Object schemeEl) {
-		
-		if (schemeEl == null) {
-			return 0;
-		}
-		
-		List els = getLowerSchemeElements(schemeEl);
-		if (els == null) {
-			return 1;
-		}
-		
-		int max = 0;
-		
-		for (int i = 0; i < els.size(); i++) {
-			int aheight = getDeepestSchemeLevel(els.get(i));
-			
-			if (aheight > max) {
-				max = aheight;
-			}
-		}
-		
-		return max + (schemeEl instanceof SchemeType ? 0: 1);
-		
-	}
-	
-	/**
-	 * Parses numberlist (for example 1,2,16,2,100) and returns a list of integers like new int[]{1,2,16,2,100}
-	 * @param numberlist list of numbers separated by commas
-	 * @return integer list
-	 */
-	public static int[] getNumbersFromNumberlist(String numberlist) {
-		
-		String[] parts = numberlist.split(",");
-		
-		int[] res = new int[parts.length];
-		
-		int i = 0;
-		for (String part:parts) {
-			res[i++] = Integer.parseInt(part.trim());
-		}
-		
-		return res;		
-	}
-	
-	
-	/**
-	 * A class which combines a data-element and the defining scheme-element
-	 * @author karbach
-	 *
-	 */
-	public static class SchemeAndData {
-		
-		public DataElement data;
-		public SchemeElement scheme;
-		
-		public SchemeAndData(DataElement pdata, SchemeElement pscheme) {
-			data = pdata;
-			scheme = pscheme;
-		}
-		
-	}
-	
-	/**
-	 * Searches within the direct childs of dataEl for a tag
-	 * which includes the idnr number.
-	 * 
-	 * @param number number of this element in current level
-	 * @param dataEl data-object of the corresponding nodedisplay or a lower-level data-element
-	 * @return the DataElement in which this scheme-node is described, null if there is no explicitly defined data
-	 */
-	public static DataElement isSchemenodeInThisData(int number, Object dataEl) {
-		List els = getLowerDataElements(dataEl);
-		
-		if (els == null) {
-			return null;
-		}
-		
-		for (int i = 0; i < els.size(); i++) {
-			
-			DataElement ael = (DataElement) els.get(i);
-			
-			if(ael.getMin()!=null){ //ranges
-
-				int min = ael.getMin().intValue();
-				int max = min;
-
-				if (ael.getMax() != null) {
-					max = ael.getMax().intValue();
-				}
-
-				if (number >= min && number <= max) {
-					return ael;
-				}
-			}
-			else if (ael.getList() != null) {//list-attribute
-				
-				int[] listels = getNumbersFromNumberlist(ael.getList());//for example 1,2,16,23
-
-				for (int anum:listels) {
-					if (anum == number) {
-						return ael;
-					}
-				}
-				
-			}
-		}
-		
-		return null;
-	}
-	
-	/**
-	 * Traverses elements-tree of layout-section for a nodedisplay till all ids given by numbers are found
-	 * 
-	 * @param numbers contains level-ids
-	 * @param nodeel upper-level-el-tag
-	 * @return nodedisplayelement describing the object`s layout given by element-ids through numbers
-	 */
-	public static Nodedisplayelement getNodedisplayElementByLevels(ArrayList<Integer> numbers, Nodedisplayelement nodeel) {
-		
-		if (numbers == null || numbers.size() == 0) {
-			return null;
-		}
-
-		if (nodeel == null) {
-			return null;
-		}
-
-		int anum = numbers.get(0);
-
-		numbers.remove((int)0);//Remove the first element of the arraylist
-
-		List schemeEls = getLowerNodedisplayElements(nodeel);
-
-		Nodedisplayelement scheme = null;
-
-		//Find scheme-tag which contains element with id anum
-		for (int i = 0; i < schemeEls.size(); i++) {
-
-			Nodedisplayelement ascheme = (Nodedisplayelement)schemeEls.get(i);
-
-			if (ascheme.getMin() != null) {//Scheme-elements defined by range through min- max-attributes
-				int amin = ascheme.getMin().intValue();
-				int amax = amin;
-
-				if (ascheme.getMax() != null) {
-					amax = ascheme.getMax().intValue();
-				}
-
-				if (anum >= amin && anum <= amax) {
-					scheme = ascheme;
-
-					break;
-				}
-
-			}
-			else if (ascheme.getList() != null) {//Scheme defines list of elements
-
-				int[] listels = getNumbersFromNumberlist(ascheme.getList());//for example 1,2,16,23
-
-				for (int number:listels) {
-					if (number == anum) {
-						scheme = ascheme;		
-						break;
-					}
-				}
-				//if scheme found stop searching
-				if (scheme != null) {
-					break;
-				}
-
-			}
-		}
-
-		//No scheme found for anum
-		if (scheme == null) {
-			return null;
-		}
-
-		//Real solutions are always found in this part
-		
-		if (numbers.size() == 0) {
-			return scheme;//All numbers processed?
-		}
-		else{
-			//are the lower levels of the scheme-node allowed in the data-tag?
-			Nodedisplayelement res = getNodedisplayElementByLevels(numbers, scheme);
-			return res;
-		}
-
-	}
-	
-	
-	/**
-	 * Traverses scheme-tree till all ids given by numbers are found
-	 * 
-	 * @param numbers contains level-ids
-	 * @param schemeEl upper-level-scheme-tag
-	 * @return schemeelement describing the object given by element-ids through numbers
-	 */
-	public static SchemeElement getSchemeByLevels(ArrayList<Integer> numbers, Object schemeEl) {
-		
-		if (numbers == null || numbers.size() == 0) {
-			return null;
-		}
-
-		if (schemeEl == null) {
-			return null;
-		}
-
-		int anum = numbers.get(0);
-
-		numbers.remove((int)0);//Remove the first element of the arraylist
-
-		List schemeEls = getLowerSchemeElements(schemeEl);
-
-		SchemeElement scheme = null;
-
-		//Find scheme-tag which contains element with id anum
-		for (int i = 0; i < schemeEls.size(); i++) {
-
-			SchemeElement ascheme = (SchemeElement)schemeEls.get(i);
-
-			if (ascheme.getMin() != null) {//Scheme-elements defined by range through min- max-attributes
-				int amin = ascheme.getMin().intValue();
-				int amax = amin;
-
-				if (ascheme.getMax() != null) {
-					amax = ascheme.getMax().intValue();
-				}
-
-				int astep = ascheme.getStep().intValue();
-
-				if (anum >= amin && anum <= amax && (anum-amin) % astep == 0 ) {
-					scheme = ascheme;
-
-					break;
-				}
-
-			}
-			else if (ascheme.getList() != null) {//Scheme defines list of elements
-
-				int[] listels = getNumbersFromNumberlist(ascheme.getList());//for example 1,2,16,23
-
-				for (int number:listels) {
-					if (number == anum) {
-						scheme = ascheme;		
-						break;
-					}
-				}
-				//if scheme found stop searching
-				if (scheme != null) {
-					break;
-				}
-
-			}
-		}
-
-		//No scheme found for anum
-		if (scheme == null) {
-			return null;
-		}
-
-		//Real solutions are always found in this part
-		
-		if (numbers.size() == 0) {
-			return scheme;//All numbers processed?
-		}
-		else{
-			//are the lower levels of the scheme-node allowed in the data-tag?
-			SchemeElement res = getSchemeByLevels(numbers, scheme);
-			return res;
-		}
-
-	}
-	
-	
-	/**
-	 * Nice call for just one number, just creates an arraylist with one number and calls overloaded function
-	 * @param number one integer value with id for the element to be checked
-	 * @param dataEl upper-level data-element
-	 * @param schemeEl scheme-element on the same level as dataEl
-	 * @return Data- and Scheme which are connected to each other
-	 */
-	public static SchemeAndData getSchemeAndDataByLevels(int number, Object dataEl, Object schemeEl) {
-		
-		ArrayList<Integer> numbers = new ArrayList<Integer>();
-		numbers.add(number);
-		
-		return getSchemeAndDataByLevels(numbers, dataEl, schemeEl);
-		
-	}
-	
-	/**
-	 * 
-	 * Searches within the dataEl-tree for a data-element which describes the treenode
-	 * with the level-ids given by numbers.
-	 * 
-	 * Returns corresponding scheme-element if available
-	 * 
-	 * @param numbers level-ids, which has to be searched in lower elements, content might be changed by this function
-	 * @param dataEl root of the data-tags, which will be processed, dataEl itself is just used to get lower elements
-	 * @param schemeEl root of the scheme-tags, which will be processed, schemeEl itself is just used to get lower elements
-	 * @return data-element and corresponding scheme
-	 */
-	public static SchemeAndData getSchemeAndDataByLevels(ArrayList<Integer> numbers, Object dataEl, Object schemeEl) {
-		
-//		numbers=copyArrayList(numbers);
-		
-		if (numbers == null || numbers.size() == 0) {
-			return null;
-		}
-		
-		if (schemeEl == null) {
-			return null;
-		}
-		
-		int anum = numbers.get(0);
-		
-		numbers.remove((int)0);//Remove the first element of the arraylist
-		
-		List els = getLowerDataElements(dataEl);
-		
-		List schemeEls = getLowerSchemeElements(schemeEl);
-		
-		for (int i = 0; i < els.size(); i++) {
-			
-			DataElement ael = (DataElement) els.get(i);
-			
-			if (ael.getMin() != null) {//data-Element with ranges
-
-				int min = ael.getMin().intValue();
-				int max = min;
-
-				if (ael.getMax() != null) {
-					max = ael.getMax().intValue();
-				}
-
-				if (min>anum || max < anum) {
-					continue;
-				}
-				//else data-Element for anum found
-			}
-			else if (ael.getList() != null) {//check if anum in list
-				
-				boolean found = false;
-				
-				int[] listels = getNumbersFromNumberlist(ael.getList());//for example 1,2,16,23
-
-				for (int number : listels) {
-					if (number == anum) {
-						found = true;
-						break;
-					}
-				}
-				
-				//if anum not in list, search for another data-element
-				if (!found) {
-					continue;				
-				}
-			}
-
-			//Find corresponding scheme-element
-			SchemeElement scheme = null;
-			for (int j = 0; j < schemeEls.size(); j++) {
-
-				SchemeElement ascheme = (SchemeElement) schemeEls.get(j);
-
-				if (ascheme.getMin() != null) {//Scheme-elements defined by range through min- max-attributes
-					int amin = ascheme.getMin().intValue();
-					int amax = amin;
-
-					if (ascheme.getMax() != null) {
-						amax = ascheme.getMax().intValue();
-					}
-
-					int astep = ascheme.getStep().intValue();
-
-					if (anum >= amin && anum <= amax && (anum-amin) % astep == 0 ) {
-						scheme = ascheme;
-
-						break;
-					}
-
-				}
-				else if (ascheme.getList() != null) {//Scheme defines list of elements
-
-					int[] listels = getNumbersFromNumberlist(ascheme.getList());//for example 1,2,16,23
-
-					for (int number : listels) {
-						if (number == anum) {
-							scheme = ascheme;		
-							break;
-						}
-					}
-					//if scheme found stop searching
-					if (scheme != null) {
-						break;
-					}
-
-				}
-			}
-
-			//No scheme found for the current data-element
-			if (scheme == null) {
-				continue;
-			}
-
-			//Real solutions are always found in this part
-
-			if (numbers.size() == 0) {
-				return new SchemeAndData(ael, scheme);//All numbers processed?
-			}
-			else{
-				//are the lower levels of the scheme-node allowed in the data-tag?
-				SchemeAndData res = getSchemeAndDataByLevels(numbers, ael, scheme);
-				if (res != null) {
-					return res;
-				}
-			}
-			
-		}
-		
-		if(dataEl instanceof DataType){
-			return null;
-		}
-		else
-			return new SchemeAndData((DataElement) dataEl, (SchemeElement) schemeEl);
-		
-	}
-	
-	/**
-	 * @param levels
-	 * @return a string describing the levels of a node within a tree
-	 */
-	public static String getLevelString(ArrayList<Integer> levels) {
-		
-		String levelstring = "";
-		
-		for (int j = 1; j <= levels.size(); j++) {
-			levelstring += "el" + j + "=" + levels.get(j-1) + " ";
-		}
-		
-		return levelstring;		
-	}
-	
-	/**
-	 * Copy an Integer-ArrayList
-	 * @param orig
-	 * @return
-	 */
-	public static ArrayList<Integer> copyArrayList(ArrayList<Integer> orig) {
-		ArrayList<Integer> res = new ArrayList<Integer>();
-		
-		for (int i = 0; i < orig.size(); i++) {
-			res.add(orig.get(i));
-		}
-		
-		return res;
-	}
-		
-		
-	
-	/**
-	 * Check if all created data-nodes are allowed as described in the corresponding scheme
-	 * returns list of Errors containing messages about not-allowed nodes in Errorlist
-	 */
-	public static void checkDataNodesinScheme(ErrorList errl, Object datanode, ArrayList<Integer> upperlevelnumbers, Object scheme ) {
-		
-		if (datanode == null) {
-			return;
-		}
-		
-		List els = getLowerDataElements(datanode);
-		if (els == null) {
-			return;
-		}
-		
-		for (int i = 0; i < els.size(); i++) {
-			
-			DataElement dat = (DataElement) els.get(i);
-			
-			if (dat.getMin() != null) {//data-tag given by range => check every element in range
-				int min = dat.getMin().intValue();
-				int max = min;
-
-				if (dat.getMax() != null) {
-					max = dat.getMax().intValue();
-				}
-
-				upperlevelnumbers.add(min);
-
-				SchemeAndData first = getSchemeAndDataByLevels(min, datanode, scheme);
-//				SchemeElement first=isDatanodeInScheme(upperlevelnumbers, scheme);
-
-				if (first == null) {//Minimum of given data-node is not in scheme
-					String levelstring = getLevelString(upperlevelnumbers);
-
-					errl.addError("\tDatanode with tree-path " + levelstring + " is not allowed in scheme");
-				}
-				else{
-
-					//Check Lower-Level Data-Nodes
-					checkDataNodesinScheme(errl, dat, upperlevelnumbers, first.scheme);
-
-					int step = first.scheme.getStep().intValue();//default of step is one, even if scheme does not define min- max- attributes
-
-					for (int j = min + step; j <= max; j += step) {
-
-						upperlevelnumbers.set(upperlevelnumbers.size()-1, j);
-						
-						//get current schemeanddata
-						SchemeAndData asad = getSchemeAndDataByLevels(j, datanode, scheme);
-//						SchemeElement ascheme=isDatanodeInScheme(upperlevelnumbers, scheme);
-
-						if (asad == null) {//No scheme found for id j
-
-							String levelstring = getLevelString(upperlevelnumbers);
-
-							errl.addError("\tDatanode with tree-path " + levelstring + " is not allowed in scheme");
-						}
-						else{
-							//Check inner Nodes
-							checkDataNodesinScheme(errl, dat, upperlevelnumbers, asad.scheme);
-						}
-
-					}
-
-				}
-
-				upperlevelnumbers.remove((int)(upperlevelnumbers.size()-1));
-
-			} //end of range-checks
-			else if (dat.getList() != null) {//elements in data-tag defined with a list
-				
-				upperlevelnumbers.add(0);
-				
-				int[] elements = getNumbersFromNumberlist(dat.getList());
-				for (int number : elements) {
-					
-					upperlevelnumbers.set(upperlevelnumbers.size()-1, number);
-					
-					SchemeAndData asad = getSchemeAndDataByLevels(number, datanode, scheme);
-					
-					if (asad == null) {
-						String levelstring = getLevelString(upperlevelnumbers);
-
-						errl.addError("\tDatanode with tree-path " + levelstring + " is not allowed in scheme");
-					}
-					else{//current number is allowed, check lower elements
-						
-						checkDataNodesinScheme(errl, dat, upperlevelnumbers, asad.scheme);						
-					}
-					
-				}
-				
-				upperlevelnumbers.remove((int)(upperlevelnumbers.size()-1));
-				
-			}
-			
-		}//for-loop over subelements of datanode
-		
-	}
-	
-	/**
-	 * @param ids identifying numbers on every level
-	 * @param scheme upper-level scheme object
-	 * @return implicit name for this object by using masks and maps
-	 */
-	public static String getImplicitName(ArrayList<Integer> ids, Object scheme) {
-		
-		if (ids == null || ids.size() == 0 ) {
-			return "";
-		}
-		
-		ArrayList<Integer> id = new ArrayList<Integer>();
-		id.add(ids.get(0));
-		
-		SchemeElement subscheme = getSchemeByLevels(copyArrayList(id), scheme);
-		
-		if (subscheme == null) {
-			return "";
-		}
-		
-		String subname = getLevelName(subscheme, id.get(0));
-		
-		ids.remove(0);
-		
-		return subname + getImplicitName(ids, subscheme);
-	}
-	
-	/**
-	 * Uses mask-attribute to return formatted output of levelid
-	 * Exception is the definition of map-attribute, then names are explicitly given by map-attribute
-	 * @param scheme corresponding scheme-element
-	 * @param levelid id of the element, the name is searched for
-	 * @return implicit name of the element for this level
-	 */
-	public static String getLevelName(SchemeElement scheme, int levelid) {
-		
-		if (scheme.getMap() == null) {
-			return String.format(scheme.getMask(), levelid);
-		}
-		
-		String[] names = scheme.getMap().split(",");
-		if (scheme.getMin() != null) {//min-max-attributes
-			int min = scheme.getMin().intValue();
-			int max = min;
-
-			if (scheme.getMax() != null) {
-				max = scheme.getMax().intValue();
-			}
-
-			int step = scheme.getStep().intValue();
-			
-			int namespos = (levelid - min) / step;
-			
-			if (namespos < names.length) {
-				return names[namespos];
-			}
-		}
-		else {//List-attribute, map list-ids to map-names, in other words: find position of levelid in list-attribute and return corresponding positioned map-name
-			int[] nrs = getNumbersFromNumberlist(scheme.getList());
-			
-			for (int i = 0; i < nrs.length; i++) {
-				if (nrs[i] == levelid) {
-					return names[i];
-				}
-			}
-		}
-		
-		return "";
-	}
-	
-	/**
-	 * Searches for allowed implicitly defined names from a name schema.
-	 * Adds all names of elements, which are directly children of the schemeElement.
-	 * Then calls this method again for all children. 
-	 * 
-	 * @param errlist list of errors occuring while parsing
-	 * @param names allowed names
-	 * @param schemeElement actual node in scheme-tree
-	 * @param aname name of this element, can be extended by the names of children
-	 */
-	public static void addAllowedNames(ErrorList errlist, HashSet<String> names, Object schemeElement, String aname) {
-		
-		List els = getLowerSchemeElements(schemeElement);
-		if (els == null) {
-			return;//no sub-elements found
-		}
-		for (int i = 0; i < els.size(); i++) {
-			
-			SchemeElement el = (SchemeElement) els.get(i);
-			
-			if (el.getMin() != null) {//Lower elements through ranges
-				int min = el.getMin().intValue();
-				int max = min;
-
-				if (el.getMax() != null) {
-					max = el.getMax().intValue();
-				}
-
-				int step = el.getStep().intValue();
-
-				if (min > max) {
-					errlist.addError("A min-value is bigger then the appropriate max-value." + aname + " min= " + min + " max= " + max);
-				}
-
-				for (int j = min; j <= max; j += step) {
-
-					String thisname = aname + getLevelName(el, j);
-					names.add(thisname);
-
-					addAllowedNames(errlist, names, el, thisname);				
-				}
-			}
-			else if (el.getList() != null) {//Lower elements through list
-				
-				int[] numbers = getNumbersFromNumberlist(el.getList());
-				
-				for (int number : numbers) {
-					String thisname = aname+getLevelName(el, number);
-					names.add(thisname);
-
-					addAllowedNames(errlist, names, el, thisname);
-				}
-				
-			}
-			
-		}
-		
-	}
-	
-	/**
-	 * Traverses the data-tag-tree and searches for refid-Attributes.
-	 * Then checks whether these attributes have allowed values according to
-	 * name scheme of the corresponding nodedisplay.
-	 * Allowed names are passed as a set of names
-	 * 
-	 * Traverses all nodedisplay-references
-	 * 
-	 * @param errlist
-	 * @param names
-	 * @param schemeElement
-	 */
-	public static void checkNamesAllowed(ErrorList errlist, HashSet<String> names, Object datarefelement) {
-		
-		List els = getLowerDataElements(datarefelement);
-		if (els == null) {
-			return;//Keine Unterelemente gefunden
-		}
-		for (int i = 0; i < els.size(); i++) {
-			
-			DataElement el = (DataElement)els.get(i);
-			
-			String refname = el.getRefid();
-			
-			if (refname != null) {
-				if (!names.contains(refname)) {
-					errlist.addError("\t\tImplicit name " + refname + " is not allowed");
-				}
-			}
-			
-			checkNamesAllowed(errlist, names, el);
-		}
-		
-	}
-	
-	/**
-	 * Checks validity of nodedisplays.
-	 * Checks whether only allowed attributes where used for
-	 * base nodedisplays and nodedisplayrefs.
-	 * 
-	 * Also checks whether the defined data-nodes are allowed against the scheme of the corresponding nodedisplay
-	 * 
-	 * @param lgui
-	 * @return found errors
-	 */
-	public static ErrorList checkNodedisplays(LguiType lgui) {
-		
-		ErrorList res = new ErrorList();
-		
-		List<GobjectType> gobjects = getGraphicalObjects(lgui);
-		
-		//Search all nodedisplays and check their attributes
-		for (GobjectType gobj : gobjects) {
-			if (gobj instanceof Nodedisplay) {
-				
-				Nodedisplay dis = (Nodedisplay)gobj;
-				
-				res.addMessage("Errors for Nodedisplay " + dis.getId());
-				//This part is now done by xsl-file
-//				checkAttributesAllowedForNodedisplay(dis.getRefto()!=null, res, dis.getData(), new ArrayList<Integer>());
-				
-				checkDataNodesinScheme(res, dis.getData(), new ArrayList<Integer>(), dis.getScheme());
-				
-			}			
-		}
-		
-		return res;
-	}
-	
-	private static final String line="-----------------------------------";
-	
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/nodedisplay/Mask.java b/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/nodedisplay/Mask.java
deleted file mode 100644
index 499689f..0000000
--- a/rms/org.eclipse.ptp.rm.lml.core/src/org/eclipse/ptp/rm/lml/internal/core/nodedisplay/Mask.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.internal.core.nodedisplay;
-
-import java.math.BigInteger;
-
-import org.eclipse.ptp.rm.lml.internal.core.elements.ObjectFactory;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement;
-
-/**
- * Saves a mask for creating implicit names
- * calculates the length of the output, which this mask will print out 
- * @author Carsten Karbach
- *
- */
-public class Mask {
-
-	private static final String number = "\\s*(-|\\+)?(0x|0X)?([a-fA-F\\d]+)";//Regular expression for a printed integer
-	
-	private String maskstring;
-	
-	private String regularMask;//regular expression which printouts must match for this mask
-	
-	private int outputlength;
-	
-	private String pre, post;//text-pattern before and behind the printed digit
-	
-	private String[] names;//null, if no map-attribute specified, otherwise contains explicitly allowed names
-	
-	private SchemeElement scheme;//scheme-element which contains mask-definition
-	
-	private int[] numbers = null;//contains numbers of elements defined by scheme (list=1,17,2  => numbers={1,17,2})
-	
-	/**
-	 * @param pscheme scheme-element which contains the mask-definition
-	 */
-	public Mask(SchemeElement pscheme) {
-		
-		scheme = pscheme;
-		
-		if (pscheme.getMap() != null) {
-			names = pscheme.getMap().split(",");
-			
-			outputlength = -1;//variable, because name lengths can be variable
-			
-			regularMask = pscheme.getMap().replace(',', '|');
-			pre = "";
-			post = "";
-			maskstring = "";
-			
-		}
-		else {
-			names = null;
-			
-			maskstring = pscheme.getMask();
-			//regular expression in xsd (([^%])*%(\-|\+|\s|\#)*0(\-|\+|\s|\#)*(\d)+d([^%])*)|(([^%])*%(\-|\+|\s|\#)*d([^%])+)
-			if (maskstring.matches("([^%])*%(\\-|\\+|\\s|\\#)*d([^%])+")) {//length is unknown but there is a separator specified
-				outputlength = -1;
-			}
-			else {//there must be given a length within the mask
-				//Find length by printing out the number 1 with that mask
-				outputlength = String.format(maskstring, 1).length();
-			}
-
-			//create regular expression for this mask
-			int percent = maskstring.indexOf('%');
-			int dpos = maskstring.indexOf('d');
-			pre = maskstring.substring(0, percent);
-			post = maskstring.substring(dpos+1, maskstring.length());
-			regularMask = pre + number + post;
-		}
-		
-	}
-	
-	/**
-	 * Tests output against regular expression given by the mask
-	 * Moreover outputlength must match the length of this output
-	 * @param output number-output probably created through this mask
-	 * @return true if output is allowed, false otherwise
-	 */
-	public boolean isOutputAllowed(String output) {
-		if (names == null) {
-			return output.matches(regularMask) && (outputlength == -1 || outputlength == output.length());
-		}
-		//Just test if output is equal to one of the names
-		for (String name : names) {
-			if (name.equals(output)) {
-				return true;
-			}
-		}
-		
-		return false;
-	}
-	
-	/**
-	 * Input is the part of the implicit name printed by this mask
-	 * @param levelstring output part of implicit name
-	 * @return id-nr for current level or -1, if id could not be parsed
-	 */
-	public int getNumberOfLevelstring(String levelstring) {
-		
-		if (names == null) {
-
-			if (!isOutputAllowed(levelstring)) {
-				return -1;//For robustness of this function
-			}
-
-			levelstring = levelstring.substring(pre.length()); //cut pre-text from inception
-			levelstring = levelstring.substring(0, levelstring.length()-post.length()); //cut post-text from end of levelstring
-
-			char[] chars = levelstring.toCharArray();
-
-			int i = 0;
-			while (i < chars.length && chars[i] < '0' || chars[i] > '9') {
-				i++;
-			}
-
-			//No digit at all?
-			if (i == chars.length) {
-				return -1;
-			}
-
-			String number = String.valueOf(chars[i]);
-			i++;
-			while (i < chars.length && chars[i] >= '0' && chars[i] <= '9') {
-				number += chars[i];
-				i++;
-			}
-
-			return Integer.parseInt(number);
-
-		}
-		else{//special names defined, search position of levelstring within names, map position to id
-			int pos = 0;
-			for (String name : names) {
-				if (name.equals(levelstring)) {
-					
-					if (scheme.getList() != null) {
-
-						if (numbers == null) {
-							numbers = LMLCheck.getNumbersFromNumberlist(scheme.getList());
-						}
-						
-						return numbers[pos];
-					}
-					else {
-						int min = scheme.getMin().intValue();
-						int max = min;
-
-						if (scheme.getMax() != null) {
-							max = scheme.getMax().intValue();
-						}
-
-						int step = scheme.getStep().intValue();
-						
-						return min + step * pos;
-					}
-				}
-				pos++;
-			}
-		}
-		//No matches
-		return -1;
-	}
-	
-	/**
-	 * Inverse function of getNumberOfLevelstring, id is given and searched is the implicit name
-	 * of the component with that id on this level.
-	 * @param id
-	 * @return implicit name of element with given id
-	 */
-	public String getImplicitLevelname(int id) {
-		return LMLCheck.getLevelName(scheme, id);
-	}
-	
-	public int getOutputLength() {
-		return outputlength;
-	}
-	
-	public String getMask() {
-		return maskstring;
-	}
-	
-	public static void main(String[] args) {
-		
-		ObjectFactory objf = new ObjectFactory();
-		
-		SchemeElement scheme = objf.createSchemeElement();
-		scheme.setMin(BigInteger.valueOf(5));
-		scheme.setMax(BigInteger.valueOf(10));
-		scheme.setStep(BigInteger.valueOf(1));
-		scheme.setMap("hans,peter,jupp");
-		
-		Mask m = new Mask(scheme);
-		System.out.println(m.getNumberOfLevelstring("peter"));
-	}
-	
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.da/.classpath b/rms/org.eclipse.ptp.rm.lml.da/.classpath
deleted file mode 100644
index c835067..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/.classpath
+++ /dev/null
@@ -1,6 +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="output" path="bin"/>
-</classpath>
diff --git a/rms/org.eclipse.ptp.rm.lml.da/.project b/rms/org.eclipse.ptp.rm.lml.da/.project
deleted file mode 100644
index 61fbe2f..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rm.lml.da</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.lml.da/.settings/org.eclipse.jdt.core.prefs b/rms/org.eclipse.ptp.rm.lml.da/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 15c1fda..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Wed Mar 23 12:18:13 EDT 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.lml.da/LML2LML/LML2LML.pl b/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML2LML.pl
deleted file mode 100755
index 57265db..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML2LML.pl
+++ /dev/null
@@ -1,203 +0,0 @@
-#!/usr/bin/perl -w
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-use strict;
-use Getopt::Long;
-use Data::Dumper;
-use Storable qw(dclone); 
-
-use FindBin;
-use lib "$FindBin::RealBin/";
-use lib "$FindBin::RealBin/../lib";
-
-use LML_file_obj;
-use LML_gen_table;
-use LML_gen_nodedisplay;
-
-my $patint="([\\+\\-\\d]+)";   # Pattern for Integer number
-my $patfp ="([\\+\\-\\d.E]+)"; # Pattern for Floating Point number
-my $patwrd="([\^\\s]+)";       # Pattern for Work (all noblank characters)
-my $patbl ="\\s+";             # Pattern for blank space (variable length)
-
-#####################################################################
-# get user info / check system 
-#####################################################################
-my $UserID = getpwuid($<);
-my $Hostname = `hostname`;
-my $verbose=1;
-my ($filename);
-
-
-#####################################################################
-# get command line parameter
-#####################################################################
-
-# option handling
-my $opt_outfile="./test.xml";
-my $opt_verbose=0;
-my $opt_timings=0;
-my $opt_dump=0;
-my $opt_layout="./layout.xml";
-usage($0) if( ! GetOptions( 
-			    'verbose'          => \$opt_verbose,
-			    'timings'          => \$opt_timings,
-			    'dump'             => \$opt_dump,
-			    'layout=s'         => \$opt_layout,
-			    'output=s'         => \$opt_outfile
-			    ) );
-
-#print "@ARGV ($opt_outfile)\n";
-if ($#ARGV < 0) {
-    &usage($0);
-}
-my $LML_filename    = $ARGV[0];
-
-my $system_sysprio=-1;
-my $maxtopdogs=-1;
-my $filehandler_layout;
-my $filehandler_LML;
-my $filehandler_out;
-
-$filehandler_layout = LML_file_obj->new($opt_verbose,$opt_timings);
-$filehandler_LML    = LML_file_obj->new($opt_verbose,$opt_timings);
-
-$filehandler_out    = LML_file_obj->new($opt_verbose,$opt_timings);
-$filehandler_out->init_file_obj();
-
-print "reading file: $LML_filename  ...\n" if($opt_verbose); 
-$filehandler_LML->read_lml_fast($LML_filename);
-if($opt_verbose) {
-    print $filehandler_LML->get_stat();
-}
-
-print "reading file: $opt_layout  ...\n" if($opt_verbose); 
-$filehandler_layout->read_lml_fast($opt_layout);
-if($opt_verbose) {
-    print $filehandler_layout->get_stat();
-}
-
-# determine system type
-my $system_type = "unknown";
-{
-    my($key,$ref);
-    keys(%{$filehandler_LML->{DATA}->{OBJECT}}); # reset iterator
-    while(($key,$ref)=each(%{$filehandler_LML->{DATA}->{OBJECT}})) {
-	if($ref->{type} eq 'system') {
-	    $ref=$filehandler_LML->{DATA}->{INFODATA}->{$key};
-	    if($ref->{type}) {
-		$system_type=$ref->{type};
-		printf("scan system: type is %s\n",$system_type);
-	    }
-	    last; 
-	}
-    }
-}
-    
-    
-
-#########################
-# process table layout
-#########################
-my ($tid,$tlayoutref);
-#print Dumper($filehandler_layout->{DATA}->{TABLELAYOUT});
-foreach $tid (keys(%{$filehandler_layout->{DATA}->{TABLELAYOUT}})) {
-    my($table_handler,$numids,$idlistref,$cnt);
-    $tlayoutref=$filehandler_layout->{DATA}->{TABLELAYOUT}->{$tid};
-    $table_handler = LML_gen_table->new($opt_verbose,$opt_timings);
-    $numids=$table_handler->process($tlayoutref,$filehandler_LML);
-    $idlistref=$table_handler->get_ids();
-    print "Table Layout: $tid processed ($numids objects found)\n"  if($opt_verbose);
-    $cnt=&copy_objects_of_elements($filehandler_LML,$filehandler_out,$idlistref,"OBJECT");
-    print "Table Layout: objects           of $tid copied ($cnt new objects)\n"  if($opt_verbose);
-    $cnt=&copy_objects_of_elements($filehandler_LML,$filehandler_out,$idlistref,"INFO");
-    print "Table Layout: info objects      of $tid copied ($cnt new objects)\n"  if($opt_verbose);
-    $cnt=&copy_objects_of_elements($filehandler_LML,$filehandler_out,$idlistref,"INFODATA");
-    print "Table Layout: info data objects of $tid copied ($cnt new objects)\n"  if($opt_verbose);
-
-    $filehandler_out->{DATA}->{TABLE}->{$tid}=$table_handler->get_lml_table();
-    $filehandler_out->{DATA}->{TABLELAYOUT}->{$tid}=$table_handler->get_lml_tablelayout();
-   
-}
-
-############################
-# process nodedisplay layout
-############################
-#print Dumper($filehandler_layout->{DATA}->{NODEDISPLAYLAYOUT});
-my ($nid,$nlayoutref);
-foreach $nid (keys(%{$filehandler_layout->{DATA}->{NODEDISPLAYLAYOUT}})) {
-    my($nd_handler,$numids,$idlistref,$cnt);
-    $nd_handler = LML_gen_nodedisplay->new($opt_verbose,$opt_timings);
-    $nlayoutref=$filehandler_layout->{DATA}->{NODEDISPLAYLAYOUT}->{$nid};
-    $numids=$nd_handler->process($nlayoutref,$filehandler_LML);
-
-    $idlistref=$nd_handler->get_ids();
-    print "Nodedisplay Layout: $nid processed ($numids objects found)\n"  if($opt_verbose);
-    $cnt=&copy_objects_of_elements($filehandler_LML,$filehandler_out,$idlistref,"OBJECT");
-    print "Nodedisplay Layout: objects           of $nid copied ($cnt new objects)\n"  if($opt_verbose);
-    $cnt=&copy_objects_of_elements($filehandler_LML,$filehandler_out,$idlistref,"INFO");
-    print "Nodedisplay Layout: info objects      of $nid copied ($cnt new objects)\n"  if($opt_verbose);
-    $cnt=&copy_objects_of_elements($filehandler_LML,$filehandler_out,$idlistref,"INFODATA");
-    print "Nodedisplay Layout: info data objects of $nid copied ($cnt new objects)\n"  if($opt_verbose);
-
-    $filehandler_out->{DATA}->{NODEDISPLAY}->{$nid}=$nd_handler->get_lml_nodedisplay();
-    $filehandler_out->{DATA}->{NODEDISPLAYLAYOUT}->{$nid}=$nd_handler->get_lml_nodedisplaylayout();
-}
-
-# define defalut objects, like job 'empty'
-&define_default_objects($filehandler_out);
-
-print "Writing output: $opt_outfile\n";
-$filehandler_out->write_lml($opt_outfile);
-if($opt_verbose) {
-    print $filehandler_out->get_stat();
-}
-
-sub copy_objects_of_elements {
-    my $fh_in=shift;
-    my $fh_out=shift;
-    my $idlistref=shift;
-    my $element=shift;
-    my($id,$cnt);
-    
-    $cnt=0;
-    foreach $id (@{$idlistref}) {
-	if(exists($fh_in->{DATA}->{$element}->{$id})) {
-	    if(!exists($fh_out->{DATA}->{$element}->{$id})) {
-		$fh_out->{DATA}->{$element}->{$id}=dclone($fh_in->{DATA}->{$element}->{$id});
-		$cnt++;
-	    }
-	}
-    }
-    return($cnt);
-}
-
-sub define_default_objects  {
-    my $fh_out=shift;
-    my($id);
-
-    $id='empty';
-    $fh_out->{DATA}->{OBJECT}->{$id}->{type} = 'job';
-    $fh_out->{DATA}->{OBJECT}->{$id}->{id}   = $id;
-    $fh_out->{DATA}->{OBJECT}->{$id}->{color}= '#FFFFFF';
-    $fh_out->{DATA}->{OBJECT}->{$id}->{name} = "Empty job";
-
-    return(1);
-}
-
-
-sub usage {
-    die "Usage: $_[0] <options> <filenames> 
-                -output <file>           : LML output filename
-                -verbose                 : verbose
-";
-}
-
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_file_obj.pm b/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_file_obj.pm
deleted file mode 100644
index a32606c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_file_obj.pm
+++ /dev/null
@@ -1,450 +0,0 @@
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-package LML_file_obj;
-
-my $VERSION='$Revision: 1.00 $';
-my($debug)=0;
-
-use strict;
-use Data::Dumper;
-use Time::Local;
-use Time::HiRes qw ( time );
-
-use LML_ndtree;
-
-sub new {
-    my $self    = {};
-    my $proto   = shift;
-    my $class   = ref($proto) || $proto;
-    my $verbose = shift;
-    my $timings = shift;
-    printf("\t LML_file_obj: new %s\n",ref($proto)) if($debug>=3);
-    $self->{DATA}      = {};
-    $self->{VERBOSE}   = $verbose; 
-    $self->{TIMINGS}   = $timings; 
-    $self->{LASTINFOID} = undef;
-    bless $self, $class;
-    return $self;
-}
-
-# internal data structures:
-# $self->{DATA}->                                    # structure corresponds to LML scheme
-#                 {OBJECT}->{$id}->{id}    
-#                                ->{name}
-#                                ->{type}
-#                 {INFO}  ->{$oid}->{oid}  
-#                                 ->{type}
-#                 {INFODATA}->{$oid}->{$key}
-#
-#                 {TABLELAYOUT}->{$id}->{id}
-#                                     ->{gid}
-#                                     ->{column}->{$cid}->{cid}
-#                                                       ->{key}
-#                                                       ->{pos}
-#                                                       ->{width}
-#                                                       ->{active}
-#                 {TABLE}->{$id}->{id}
-#                               ->{title}
-#                               ->{column}->{$cid}->{id}
-#                                                ->{name}
-#                                                ->{sort}
-#                               ->{row}->{$id}->{cell}->[value,value,...]
-#
-#                 {NODEDISPLAYLAYOUT}->{$id}->{id}
-#                                           ->{gid}
-#                                           ->{elements}->[elref, elref, ...]
-#                                   ... elref->{elname}  
-#                                            ->{key}
-#                                            ->{elements}->[elref, elref, ...]
-#
-#
-# derived:
-#                 {INFOATTR}->{obj_type}->{$key}  # of occurrences
-# 
-sub get_data_ref {
-    my($self) = shift;
-    return($self->{DATA});
-} 
-
-
-sub init_file_obj {
-    my($self) = shift;
-    $self->{DATA}->{LMLLGUI}={
-	'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
-	'xmlns:lml' => 'http://www.llview.de',
-	'version' => '1.0',
-	'xsi:schemaLocation' => 'http://www.llview.de lgui.xsd '
-	};
-    return(1);
-} 
-
-sub get_stat {
-    my($self) = shift;
-    my($log,$type,%types,$id);
-    $log="";
-    
-    {
-	my($type,%types,$id);
-	$log.=sprintf("objects: total #%d\n",scalar keys(%{$self->{DATA}->{OBJECT}}));
-	foreach $id (keys %{$self->{DATA}->{OBJECT}}) {
-	    $type=$self->{DATA}->{OBJECT}->{$id}->{type};
-	    $types{$type}++;
-	}
-	foreach $type (sort keys %types) {
-	    $log.=sprintf("        |-- %10d (%s)\n",$types{$type},$type);
-	}
-    }
-
-    {
-	my($type,%types,$id);
-	if($self->{DATA}->{TABLELAYOUT}) {
-	    $log.=sprintf("tablelayout: total #%d\n",scalar keys(%{$self->{DATA}->{TABLELAYOUT}}));
-	    foreach $id (keys %{$self->{DATA}->{TABLELAYOUT}}) {
-		$log.=sprintf("        |--        1x%d (%s)\n",
-			      scalar keys(%{$self->{DATA}->{TABLELAYOUT}->{$id}->{column}}),
-			      $id);
-	    }
-	}
-    }
-
-    {
-	my($type,%types,$id);
-	if($self->{DATA}->{TABLE}) {
-	    $log.=sprintf("table: total #%d\n",scalar keys(%{$self->{DATA}->{TABLE}}));
-	    foreach $id (keys %{$self->{DATA}->{TABLE}}) {
-		$log.=sprintf("        |--     %4dx%d (%s)\n",
-			      scalar keys(%{$self->{DATA}->{TABLE}->{$id}->{row}}),
-			      scalar keys(%{$self->{DATA}->{TABLE}->{$id}->{column}}),
-			      $id);
-	    }
-	}
-    }
-    return($log);
-} 
-
-sub read_lml_fast {
-    my($self) = shift;
-    my $infile  = shift;
-    my $type    = shift;
-    my($xmlin);
-    my $rc=0;
-
-    my $tstart=time;
-    if(!open(IN,$infile)) {
-	print "could not open $infile, leaving ...\n";return(0);
-    }
-    while(<IN>) {
-	$xmlin.=$_;
-    }
-    close(IN);
-    my $tdiff=time-$tstart;
-    printf("LML_file_obj: read  XML in %6.4f sec\n",$tdiff) if($self->{VERBOSE});
-
-    $self->{DATA}->{SEARCHTYPE}=$type;
-    $tstart=time;
-
-    # light-weight self written xml parser, only working for simple XML files  
-    $xmlin=~s/\n/ /gs;
-    $xmlin=~s/\s\s+/ /gs;
-    my ($tag,$tagname,$rest,$ctag,$nrc);
-    foreach $tag (split(/\>\s*/,$xmlin)) {
-	$ctag.=$tag;
-	$nrc=($ctag=~ tr/\"/\"/);
-	if($nrc%2==0) {
-	    $tag=$ctag;
-	    $ctag="";
-	} else {
-	    next;
-	}
-	
-#	print "TAG: '$tag'\n";
-	if($tag=~/^<[\/\?](.*)[^\s\>]/) {
-	    $tagname=$1;
-	    $self->lml_end($self->{DATA},$tagname,());
-	} elsif($tag=~/<([^\s]+)\s*$/) {
-	    $tagname=$1;
-#	    print "TAG0: '$tagname'\n";
-	    $self->lml_start($self->{DATA},$tagname,());
-	} elsif($tag=~/<([^\s]+)(\s(.*)[^\/])$/) {
-	    $tagname=$1;
-	    $rest=$2;$rest=~s/^\s*//gs;$rest=~s/\s*$//gs;
-#	    print "TAG1: '$tagname' rest='$rest'\n";
-	    $self->lml_start($self->{DATA},$tagname,split(/=?\"\s*/,$rest));
-	} elsif($tag=~/<([^\s]+)(\s(.*)\s?)\/$/) {
-	    $tagname=$1;
-	    $rest=$2;$rest=~s/^\s*//gs;$rest=~s/\s*$//gs;
-#	    print "TAG2: '$tagname' rest='$rest' closed\n";
-	    $self->lml_start($self->{DATA},$tagname,split(/=?\"\s*/,$rest));
-	    $self->lml_end($self->{DATA},$tagname,());
-	}
-    }
-
-    $tdiff=time-$tstart;
-    printf("LML_file_obj: parse XML in %6.4f sec\n",$tdiff) if($self->{VERBOSE});
-
-#    print Dumper($self->{DATA});
-    return($rc);
-
-}
-
-
-# from lib/LLview_parse_xml.pm
-sub lml_start {
-    my $self=shift; # object reference
-    my $o   =shift;
-    my $name=shift;
-#    print "WF: >",ref($o),"< >$name<\n";
-    my($k,$v,$actnodename,$id,$cid,$oid);
-
-    if($name eq "!--") {
-	# a comment
-	return(1);
-    }
-    my %attr=(@_);
-
-    if($name eq "lml:lgui") {
-	foreach $k (sort keys %attr) {
-#	    print "$k: $attr{$k}\n";
-	    $o->{LMLLGUI}->{$k}=$attr{$k};
-	}
-	return(1);
-    }
-    # Objects
-    if($name eq "objects") {
-	return(1);
-    }
-    if($name eq "object") {
-	$id=$attr{id};
-	if(exists($o->{OBJECT}->{$id})) {
-	    print "LML_file_obj: WARNING objects with id >$id< exists, skipping\n";
-	    return(0);
-    	}
-	foreach $k (sort keys %attr) {
-#	    print "$k: $attr{$k}\n";
-	    $o->{OBJECT}->{$id}->{$k}=$attr{$k};
-	}
-	return(1);
-    }
-    # Information
-    if($name eq "information") {
-	return(1);
-    }
-    if($name eq "info") {
-	$oid=$attr{oid};
-	$o->{LASTINFOID}=$oid;
-	$o->{LASTINFOTYPE}=$o->{OBJECT}->{$oid}->{type};
-	if(exists($o->{INFO}->{$oid})) {
-	    print "LML_file_obj: WARNING info with id >$id< exists, skipping\n";
-	    return(0);
-    	}
-	foreach $k (sort keys %attr) {
-#	    print "$k: $attr{$k}\n";
-	    $o->{INFO}->{$oid}->{$k}=$attr{$k};
-	}
-	return(1);
-    }
-    if($name eq "data") {
-	$id=$o->{LASTINFOID};
-	$k=$attr{key};
-	$v=$attr{value};
-#	$o->{INFOATTR}->{$o->{LASTINFOTYPE}}->{$k}++;
-	if(exists($o->{INFODATA}->{$id}->{$k})) {
-	    print "LML_file_obj: WARNING infodata with id >$id< and key >$k< exists, skipping\n";
-	    return(0);
-    	}
-	$o->{INFODATA}->{$id}->{$k}=$v;
-	return(1);
-    }
-    # Tablelayout
-    if($name eq "tablelayout") {
-	$id=$attr{id};
-	$o->{LASTTABLELAYOUTID}=$id;
-	if(exists($o->{TABLELAYOUT}->{$id})) {
-	    print "LML_file_obj: WARNING Tablelayout with id >$id< exists, skipping\n";
-	    return(0);
-    	}
-	foreach $k (sort keys %attr) {
-#	    print "$k: $attr{$k}\n";
-	    $o->{TABLELAYOUT}->{$id}->{$k}=$attr{$k};
-	}
-	return(1);
-    }
-
-    if($name eq "column") {
-	$id=$o->{LASTTABLELAYOUTID};
-	$cid=$attr{cid};
-	$v=$attr{value};
-
-	if(exists($o->{TABLELAYOUT}->{$id}->{column}->{$cid})) {
-	    print "LML_file_obj: WARNING column in tablelayout with id >$cid<  exists, skipping\n";
-	    return(0);
-    	}
-	foreach $k (sort keys %attr) {
-#	    print "$k: $attr{$k}\n";
-	    $o->{TABLELAYOUT}->{$id}->{column}->{$cid}->{$k}=$attr{$k};
-	}
-	return(1);
-    }
-
-    # nodedisplaylayout
-    if($name eq "nodedisplaylayout") {
-	$id=$attr{id};
-	if(exists($o->{NODEDISPLAYLAYOUT}->{$id})) {
-	    print "LML_file_obj: WARNING Nodedisplaylayout with id >$id< exists, skipping\n";
-	    return(0);
-    	}
-	foreach $k (sort keys %attr) {
-	    $o->{NODEDISPLAYLAYOUT}->{$id}->{$k}=$attr{$k};
-	}
-	$o->{NODEDISPLAYLAYOUT}->{$id}->{tree}=LML_ndtree->new("ndlytree");
-	$o->{NODEDISPLAYLAYOUT}->{$id}->{tree}->{_level}=-1;
-	push(@{$o->{NODEDISPLAYLAYOUTSTACK}},$o->{NODEDISPLAYLAYOUT}->{$id}->{tree});
-	return(1);
-    }
-    if(($name=~/el\d/) || ($name eq 'img')) {
-	my $lastelem=$o->{NODEDISPLAYLAYOUTSTACK}->[-1];
-	my $treenode=$lastelem->new_child(\%attr,$name);
-	push(@{$o->{NODEDISPLAYLAYOUTSTACK}},$treenode);
-	return(1);
-    }
-
-    print "LML_file_obj: WARNING unknown tag >$name< \n";
-   
-}
-
-sub lml_end {
-    my $self=shift; # object reference
-    my $o   =shift;
-    my $name=shift;
-    if(($name=~/el\d/) || ($name eq 'img')) {
-	pop(@{$o->{NODEDISPLAYLAYOUTSTACK}});
-    }
-}
-
-
-sub write_lml {
-    my($self) = shift;
-    my $outfile  = shift;
-    my($k,$rc,$id,$c,$key);
-    my $tstart=time;
-    $rc=1;
-
-    open(OUT,"> $outfile") || die "cannot open file $outfile";
-    printf(OUT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-
-    printf(OUT "<lml:lgui ");
-    foreach $k (sort keys %{$self->{DATA}->{LMLLGUI}}) {
-	printf(OUT "%s=\"%s\"\n ",$k,$self->{DATA}->{LMLLGUI}->{$k});
-    }
-    printf(OUT "     \>\n");
-
-
-    printf(OUT "<objects>\n");
-    foreach $id (sort keys %{$self->{DATA}->{OBJECT}}) {
-	printf(OUT "<object");
-	foreach $k (sort keys %{$self->{DATA}->{OBJECT}->{$id}}) {
-	    printf(OUT " %s=\"%s\"",$k,$self->{DATA}->{OBJECT}->{$id}->{$k});
-	}
-	printf(OUT "/>\n");
-    }
-    printf(OUT "</objects>\n");
-
-    printf(OUT "<information>\n");
-    foreach $id (sort keys %{$self->{DATA}->{INFO}}) {
-	printf(OUT "<info");
-	foreach $k (sort keys %{$self->{DATA}->{INFO}->{$id}}) {
-	    printf(OUT " %s=\"%s\"",$k,$self->{DATA}->{INFO}->{$id}->{$k});
-	}
-	printf(OUT ">\n");
-	foreach $k (sort keys %{$self->{DATA}->{INFODATA}->{$id}}) {
-	    printf(OUT "<data key=\"%s\" value=\"%s\"/>\n",$k,$self->{DATA}->{INFODATA}->{$id}->{$k});
-	}
-	printf(OUT "</info>\n");
-    }
-    printf(OUT "</information>\n");
-
-    if(exists($self->{DATA}->{TABLE})) {
-
-	foreach $id (sort keys %{$self->{DATA}->{TABLE}}) {
-	    my $table=$self->{DATA}->{TABLE}->{$id};
-	    printf(OUT "<table title=\"%s\" id=\"%s\">\n", $table->{title}, $table->{id});
- 	    foreach $k (sort keys %{$table->{column}}) {
-		printf(OUT "<column");
-		for $key ("id","name","sort") {
-		    printf(OUT " %s=\"%s\"",$key,  $table->{column}->{$k}->{$key});
-		}
-		printf(OUT "/>\n");
-	    }
- 	    foreach $k (sort keys %{$table->{row}}) {
-		printf(OUT "<row  %s=\"%s\">\n","oid",$k);
-		foreach $c (@{$table->{row}->{$k}->{cell}}) {
-		    printf(OUT "<cell %s=\"%s\"/>\n","value",$c);
-		}
-		printf(OUT "</row>\n");
-	    }
-	    printf(OUT "</table>\n");
-	}
-    }
-
-    if(exists($self->{DATA}->{TABLELAYOUT})) {
-
-	foreach $id (sort keys %{$self->{DATA}->{TABLELAYOUT}}) {
-	    my $tablelayout=$self->{DATA}->{TABLELAYOUT}->{$id};
-	    printf(OUT "<tablelayout id=\"%s\" gid=\"%s\">\n", $tablelayout->{id}, $tablelayout->{gid});
- 	    foreach $k (sort {$a <=> $b} keys %{$tablelayout->{column}}) {
-		printf(OUT "<column");
-		for $key ("cid","pos","width","active","key") {
-		    printf(OUT " %s=\"%s\"",$key,  $tablelayout->{column}->{$k}->{$key});
-		}
-		printf(OUT "/>\n");
-	    }
-	    printf(OUT "</tablelayout>\n");
-	}
-    }
-
-
-    if(exists($self->{DATA}->{NODEDISPLAYLAYOUT})) {
-
-	foreach $id (sort keys %{$self->{DATA}->{NODEDISPLAYLAYOUT}}) {
-	    my $ndlayout=$self->{DATA}->{NODEDISPLAYLAYOUT}->{$id};
-	    printf(OUT "<nodedisplaylayout id=\"%s\" gid=\"%s\">\n", $ndlayout->{id}, $ndlayout->{gid});
-	    print OUT $ndlayout->{tree}->get_xml_tree(0);
-	    printf(OUT "</nodedisplaylayout>\n");
-	}
-    }
-
-    if(exists($self->{DATA}->{NODEDISPLAY})) {
-
-	foreach $id (sort keys %{$self->{DATA}->{NODEDISPLAY}}) {
-	    my $nd=$self->{DATA}->{NODEDISPLAY}->{$id};
-	    printf(OUT "<nodedisplay id=\"%s\" title=\"%s\">\n", $nd->{id}, $nd->{title});
-	    print OUT "<scheme>\n";
-	    print OUT $nd->{schemeroot}->get_xml_tree(1);
-	    print OUT "</scheme>\n";
-	    print OUT "<data>\n";
-	    print OUT $nd->{dataroot}->get_xml_tree(1);
-	    print OUT "</data>\n";
-	    printf(OUT "</nodedisplay>\n");
-	}
-    }
-    
-    printf(OUT "</lml:lgui>\n");
-    
-    close(OUT);
-
-    my $tdiff=time-$tstart;
-    printf("LML_file_obj: wrote  XML in %6.4f sec to %s\n",$tdiff,$outfile) if($self->{TIMINGS});
-    
-    return($rc);
-    
-}
-    
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_gen_nodedisplay.pm b/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_gen_nodedisplay.pm
deleted file mode 100644
index 3274d72..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_gen_nodedisplay.pm
+++ /dev/null
@@ -1,400 +0,0 @@
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-package LML_gen_nodedisplay;
-
-my $VERSION='1.0';
-my($debug)=0;
-
-use strict;
-use Data::Dumper;
-use Time::Local;
-use Time::HiRes qw ( time );
-use String::Scanf;
-
-use LML_ndtree;
-
-use LML_gen_nodedisplay_insert_job;
-
-sub new {
-    my $self    = {};
-    my $proto   = shift;
-    my $class   = ref($proto) || $proto;
-    my $verbose = shift;
-    my $timings = shift;
-    printf("\t LML_gen_nodedisplay: new %s\n",ref($proto)) if($debug>=3);
-    $self->{VERBOSE}   = $verbose; 
-    $self->{TIMINGS}   = $timings; 
-    $self->{LMLFH}       = undef; 
-    $self->{LAYOUT}      = undef; 
-    $self->{NODEMAPPING} = undef; 
-    $self->{NODENAMENAMASK}= "n%06d";
-    $self->{IDLISTREF}   = undef; 
-    bless $self, $class;
-    return $self;
-}
-
-sub get_ids {
-    my($self) = shift;
-    return($self->{IDLISTREF});
-}
-
-sub process {
-    my($self) = shift;
-    my $layoutref  = shift;
-    my $filehandler_LML  = shift;
-    my ($numids,$gid,$idlistref);
-    my ($schemeroot,$dataroot);
-    $numids=0;
-    $self->{LAYOUT}    = $layoutref; 
-    $self->{LMLFH}     = $filehandler_LML; 
-    $gid               = $layoutref->{gid};
-
-    # internal structure
-    $self->{SCHEMEROOT} = $schemeroot = LML_ndtree->new();
-    $self->{DATAROOT}   = $dataroot   = LML_ndtree->new();
-    
-    # determine scheme of system
-    $self->{SYSTEMTYPE}=$self->_get_system_type();    
-    if($self->{SYSTEMTYPE} eq "BG/P") {
-	my($maxlx,$maxly,$maxlz,$maxpx,$maxpy,$maxpz)=$self->_get_system_size_bg();
-	if(!$self->_init_trees_bg($maxlx,$maxly,$maxlz,$maxpx,$maxpy,$maxpz)) {
-	    print "ERROR: could not init internal data structures, system type: $self->{SYSTEMTYPE}, aborting ...\n";
-	    return(-1);
-	}
-    } elsif($self->{SYSTEMTYPE} eq "Cluster") {
-	
-	# standard one-level tree, mapping of node names
-	$self->_get_system_size_cluster();
-	if(!$self->_init_trees_cluster()) {
-	    print "ERROR: could not init internal data structures, system type: $self->{SYSTEMTYPE}, aborting ...\n";
-	    return(-1);
-	}
-    } else {
-	print "ERROR: not supported system type: $self->{SYSTEMTYPE}, aborting ...\n";
-	return(-1);
-    }
-    # add regular expression to each level of node display scheme for fast pattern scann of nodenames
-    $self->_add_regexp_to_scheme();
-
-    $idlistref=[];
-    print "LML_gen_nodedisplay::process: gid=$gid\n" if($self->{VERBOSE});
-    $idlistref=$self->_insert_run_jobs();
-
-    $self->{IDLISTREF}=$idlistref;
-    $numids=scalar @{$idlistref};
-    
-    return($numids);
-}
-
-sub _insert_run_jobs {
-    my($self) = shift;
-    my (@idlist,$key,$ref,$inforef,$nodelist);
-    
-    keys(%{$self->{LMLFH}->{DATA}->{OBJECT}}); # reset iterator
-    while(($key,$ref)=each(%{$self->{LMLFH}->{DATA}->{OBJECT}})) {
-	next if($ref->{type} ne 'job');
-	$inforef=$self->{LMLFH}->{DATA}->{INFODATA}->{$key};
-	next if($inforef->{state} ne 'Running');
-	$nodelist=$self->_remap_nodes($inforef->{nodelist});
-	$self->insert_job_into_nodedisplay($self->{SCHEMEROOT},$self->{DATAROOT},$nodelist,$key);
-	push(@idlist,$key);
-#	last; # WF
-    }
-    return(\@idlist);
-}
-
-
-sub get_lml_nodedisplay {
-    my($self) = shift;
-    my($ds,$rc,$id,$cid);
-    my $layoutref  = $self->{LAYOUT};
-    my(@keylist,$key,$value);
-
-    $ds->{id}=$layoutref->{gid};
-    $ds->{title}=$layoutref->{id};
-    $ds->{schemeroot}=$self->{SCHEMEROOT};
-    $ds->{dataroot}=$self->{DATAROOT};
-    
-    return($ds);
-
-}
-
-
-sub get_lml_nodedisplaylayout {
-    my($self) = shift;
-    my($ds,$rc,$id,$cid);
-    my $layoutref  = $self->{LAYOUT};
-
-    return($layoutref);
-
-}
-
-sub _get_system_type {
-    my($self) = shift;
-    my $system_type = "unknown";
-    my($key,$ref);
-    keys(%{$self->{LMLFH}->{DATA}->{OBJECT}}); # reset iterator
-    while(($key,$ref)=each(%{$self->{LMLFH}->{DATA}->{OBJECT}})) {
-	if($ref->{type} eq 'system') {
-	    $ref=$self->{LMLFH}->{DATA}->{INFODATA}->{$key};
-	    if($ref->{type}) {
-		$system_type=$ref->{type};
-		printf("_get_system_type: type is '%s'\n",$system_type) if($self->{VERBOSE});
-	    }
-	    last; 
-	}
-    }
-    return($system_type);
-}
-
-
-sub _add_regexp_to_scheme  {
-    my($self) = shift;
-    
-    my $schemeref=$self->{SCHEMEROOT};
-    my($id,@numbers,$format,$regexp, $child);
-
-
-    $regexp="";
-
-    foreach $child (@{$schemeref->{_childs}}) {
-	$self->__add_regexp_to_scheme($child,$regexp);
-    }
-
-    return(1);
-}
-
-sub __add_regexp_to_scheme {
-    my($self) = shift;
-    my($schemeref)=shift;
-    my($regexp)=shift;
-    my($rg,$child);
-
-    if(exists($schemeref->{ATTR}->{mask})) {
-	$rg=String::Scanf::format_to_re($schemeref->{ATTR}->{mask});
-    } else {
-	$rg="";
-    }
-    $schemeref->{ATTR}->{_maskreg}=$rg;
-    $regexp.=$rg;
-    $schemeref->{ATTR}->{_maskregall}=$regexp;
-    foreach $child (@{$schemeref->{_childs}}) {
-	$self->__add_regexp_to_scheme($child,$regexp);
-    }
-    return(1);
-}
-
-
-sub _remap_nodes {
-    my($self) = shift;
-    my($nodelist)=shift;
-    my($newnodelist,$spec,$node,$num,$newnode);
-    if($self->{NODEMAPPING}) {
-	foreach $spec (split(/\),?\(/,$nodelist)) {
-	    if($spec=~/\(?([^,]+),(\d+)\)?/) {
-		$node=$1;$num=$2;
-		if(exists($self->{NODEMAPPING}->{$node})) {
-		    $newnode=$self->{NODEMAPPING}->{$node};
-		    $newnodelist.="," if($newnodelist);
-		    $newnodelist.=sprintf("%s-c%02d",$newnode,$num);
-		} else {
-		    print "ERROR: _remap_nodes: unknown node '$node', skipping a\n";
-		}
-	    }
-	    if($spec=~/^([^,]+)$/) {
-		$node=$1;
-		if(exists($self->{NODEMAPPING}->{$node})) {
-		    $newnode=$self->{NODEMAPPING}->{$node};
-		    $newnodelist.="," if($newnodelist);
-		    $newnodelist.=sprintf("%s-c%02d",$newnode,0);
-		} else {
-		    print "ERROR: _remap_nodes: unknown node '$node', skipping\n";
-		}
-	    }
-	}
-	return($newnodelist);
-    } else {
-	return($nodelist);
-    }
-}
-
-###############################################
-# Cluster related
-############################################### 
-sub _get_system_size_cluster  {
-    my($self) = shift;
-    my($indataref) = $self->{INDATA};
-    my($numnodes);
-    my ($key,$ref,$name,$ncores);
-
-    keys(%{$self->{LMLFH}->{DATA}->{OBJECT}}); # reset iterator
-    while(($key,$ref)=each(%{$self->{LMLFH}->{DATA}->{OBJECT}})) {
-	next if($ref->{type} ne 'node');
-	$name=$ref->{name};
-	$ncores=$self->{LMLFH}->{DATA}->{INFODATA}->{$key}->{ncores};
-	if(!defined($ncores)) {
-	    print "_get_system_size_cluster: suspect node: $name   , assuming 0 cores\n"  if($self->{VERBOSE});
-	    $ncores=0;
-	}
-	push(@{$self->{NODESIZES}->{$ncores}},$name);
-    }
-
-
-    $numnodes=0;
-    foreach $ncores (sort {$a <=> $b} keys %{$self->{NODESIZES}}) {
-	foreach $name (@{$self->{NODESIZES}->{$ncores}}) {
-	    # register new node 
-	    if(!exists($self->{NODEMAPPING}->{$name})) {
-		$self->{NODEMAPPING}->{$name}=sprintf($self->{NODENAMENAMASK},$numnodes);
-#		print "_get_system_size_cluster: remap '$name' -> '$self->{NODEMAPPING}->{$name}'\n";
-		$numnodes++;
-	    } else {
-		print "ERROR: _get_system_size_cluster: duplicate node '$name' -> '$self->{NODEMAPPING}->{$name}'\n";
-	    }
-	}
-	printf("_get_system_size_cluster: found %4d nodes of size: %d\n", scalar @{$self->{NODESIZES}->{$ncores}},$ncores) 
-	    if($self->{VERBOSE});
-    }
-    printf("_get_system_size_cluster: Cluster found of size: %d\n",$numnodes) if($self->{VERBOSE});
-    
-    return();
-}
-
-sub _init_trees_cluster  {
-    my($self) = shift;
-    my($id,$subid,$treenode,$schemeroot,$ncores,$numnodes,$start);
-
-    $schemeroot=$self->{SCHEMEROOT};
-    $start=0;
-    foreach $ncores (sort {$a <=> $b} keys %{$self->{NODESIZES}}) {
-	$numnodes=scalar @{$self->{NODESIZES}->{$ncores}};
-	$treenode=$schemeroot;
-	$treenode=$treenode->new_child();
-	$treenode->add_attr({ tagname => 'node',
-			      min     => $start,
-			      max     => $start+$numnodes-1,
-			      mask    => $self->{NODENAMENAMASK} });
-	$treenode=$treenode->new_child();
-	$treenode->add_attr({ tagname => 'core',
-			      min     => 0,
-			      max     => $ncores,
-			      mask    => '-c%02d' });
-
-	# insert first element in data section
-	$treenode=$self->{DATAROOT};
-	$treenode=$treenode->new_child();
-	$treenode->add_attr({ min     => $start,
-			      max     => $start+$numnodes-1,
-			      oid     => 'empty' });
-	$start+=$numnodes;
-    }
-
-    return(1);
-}
-
-###############################################
-# BG/P related
-############################################### 
-sub _get_system_size_bg  {
-    my($self) = shift;
-    my($indataref) = $self->{INDATA};
-    my($partref,$part,$lx,$ly,$lz,$px,$py,$pz);
-    my($maxlx,$maxly,$maxlz,$maxpx,$maxpy,$maxpz);
-
-    my ($key,$ref);
-    
-    $maxlx=$maxly=$maxlz=0;
-    $maxpx=$maxpy=$maxpz=0;
-    keys(%{$self->{LMLFH}->{DATA}->{OBJECT}}); # reset iterator
-    while(($key,$ref)=each(%{$self->{LMLFH}->{DATA}->{OBJECT}})) {
-	next if($ref->{type} ne 'partition');
-	next if($ref->{id}!~/^bgbp/s);
-	$partref=$self->{LMLFH}->{DATA}->{INFODATA}->{$key};
-	$part=$partref->{bgp_partitionid};
-	$px=$partref->{x_loc};
-	$py=$partref->{y_loc};
-	$pz=$partref->{z_loc};
-	$maxpx=$px if($px>$maxpx);
-	$maxpy=$py if($py>$maxpy);
-	$maxpz=$pz if($pz>$maxpz);
-        # currently not supported for BG/P
-	# data could only get from LL over LL C-API
-	$lx=$ly=$lz=0; 
-	$maxlx=$lx if($lx>$maxlx);
-	$maxly=$ly if($ly>$maxly);
-	$maxlz=$lz if($lz>$maxlz);
-    }
-
-    printf("_get_system_size_bg: Blue Gene System found of size: %dx%dx%d (logical: %dx%dx%d)\n",
-	   $maxpx+1,$maxpy+1,$maxpz+1,
-	   $maxlx+1,$maxly+1,$maxlz+1,
-	) if($self->{VERBOSE});
-    
-    return($maxlx,$maxly,$maxlz,$maxpx,$maxpy,$maxpz);
-}
-
-
-sub _init_trees_bg  {
-    my($self) = shift;
-    my($maxlx,$maxly,$maxlz,$maxpx,$maxpy,$maxpz)=@_;
-    my($id,$subid,$treenode,$schemeroot,$bgsystem);
-
-    $schemeroot=$self->{SCHEMEROOT};
-    $treenode=$schemeroot;
-    $bgsystem=$treenode=$treenode->new_child();
-    $treenode->add_attr({ tagname => 'row',
-			  min     => 0,
-			  max     => $maxpx,
-			  mask    => 'R%01d' });
-
-    $treenode=$treenode->new_child();
-    $treenode->add_attr({ tagname => 'rack',
-			  min     => 0,
-			  max     => $maxpy,
-			  mask    => '%01d' });
-
-    $treenode=$treenode->new_child();
-    $treenode->add_attr({ tagname => 'midplane',
-			  min     => 0,
-			  max     => $maxpz,
-			  mask    => '-M%01d' });
-
-    $treenode=$treenode->new_child();
-    $treenode->add_attr({ tagname => 'nodecard',
-			  min     => 0,
-			  max     => 15,
-			  mask    => '-N%02d' });
-
-    $treenode=$treenode->new_child();
-    $treenode->add_attr({ tagname => 'computecard',
-			  min     => 4,
-			  max     => 35,
-			  mask    => '-C%02d' });
-
-    $treenode=$treenode->new_child();
-    $treenode->add_attr({ tagname => 'core',
-			  min     => 0,
-			  max     => 3,
-			  mask    => '-%01d' });
-
-
-    # insert first element in data section
-    $treenode=$self->{DATAROOT};
-    $treenode=$treenode->new_child();
-    $treenode->add_attr({ min     => $bgsystem->{ATTR}->{min},
-			  max     => $bgsystem->{ATTR}->{max},
-			  oid     => 'empty' });
-
-    return(1);
-}
-
-
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_gen_nodedisplay_insert_job.pm b/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_gen_nodedisplay_insert_job.pm
deleted file mode 100644
index 5c28da8..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_gen_nodedisplay_insert_job.pm
+++ /dev/null
@@ -1,405 +0,0 @@
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-package LML_gen_nodedisplay;
-my($debug)=0;
-use strict;
-use Time::Local;
-use Time::HiRes qw ( time );
-use Data::Dumper;
-
-
-################################################################################################################
-# job insertion
-################################################################################################################
-sub insert_job_into_nodedisplay  {
-    my($self) = shift;
-    my($schemeref) = shift;
-    my($dataref) = shift;
-    my($nodelist) = shift;
-    my($oid) = shift;
-    my($data,$node,$listref,@nodelistrefs,@nodelistrefs_reduced, $allcovered, $child);
-
-    foreach $node (sort(split(/\s*,\s*/,$nodelist))) {
-	$listref=$self->get_numbers_from_name($node,$schemeref);
-	push(@nodelistrefs,$listref);
-    }
-    
-    foreach $listref (@nodelistrefs) {
-	print "insert_job_into_nodedisplay, before: ",join(',',@{$listref}),"\n"  if($debug>=2); 
-    }
-
-    # for each system part
-    foreach $child (@{$schemeref->{_childs}}) {
-	$allcovered=$self->_reduce_nodelist($child,\@nodelistrefs,\@nodelistrefs_reduced);
-    }
-
-    print "insert_job_into_nodedisplay, allcovered=$allcovered\n"  if($debug>=2); 
-
-    foreach $listref (@nodelistrefs_reduced) {
-	$self->_insert_jobnode_nodedisplay($dataref,$listref,$oid);
-    }
-
-
-    return(1);
-}
-
-sub _insert_jobnode_nodedisplay {
-    my($self) = shift;
-    my($dataref)=shift;
-    my($nodelistref)=shift;
-    my($oid) = shift;
-    my($myspec,$min,$max,$subspec,$child);
-    my($lmin,$lmax,$subchilds);
-    my $level=$dataref->{_level};
-    my $xspace=" "x$level;
-    my (@covered, @childlist, $newchild, @newlist, $isleaf, $i, @notcoveredlist, $newlist, $updatechild);
-    
-    print "_insert_jobnode_nodedisplay: $xspace # START level=$level nodelistref=>",join(',',@{$nodelistref}),"<\n"  if($debug>=2); 
-    
-    $myspec=$nodelistref->[0];
-    if($myspec=~/^\((.*)\)$/) {
-	my $list=$1;
-	for $subspec (split(',',$list)) {
-	    my @list = @{$nodelistref};
-	    $list[0]=$subspec;
-	    print "_insert_jobnode_nodedisplay: $xspace  -> re-calling with top subspec >$subspec<\n"  if($debug>=2); 
-	    $self->_insert_jobnode_nodedisplay($dataref,\@list, $oid);
-	}
-	print "_insert_jobnode_nodedisplay: $xspace # END   level=$level nodelistref=>",join(',',@{$nodelistref}),"<\n" if($debug>=2); 
-	return();
-    } elsif($myspec=~/(\d+)\-(\d+)/) {
-	$min=$1;$max=$2;
-    } else {
-	$min=$max=$myspec;
-    }
-    for($i=$min;$i<=$max;$i++) {$covered[$i]=1;}
-
-    @newlist = @{$nodelistref};shift(@newlist);
-    $isleaf=($#newlist == -1)?1:0;
-    # scan child
-    @childlist=@{$dataref->{_childs}};
-    foreach $child (@childlist) {
-	$lmin=$child->{ATTR}->{min};
-	$lmax=$child->{ATTR}->{max};
-	$subchilds=$#{$child->{_childs}}+1;
-	print "_insert_jobnode_nodedisplay: $xspace ==> level=$level [$min..$max] found child:  ($lmin..$lmax) #subchilds=$subchilds\n"  if($debug>=2); 
-
-	if(($max<$lmin) || ($min>$lmax)) {
-	    print "_insert_jobnode_nodedisplay: $xspace  -> child full outside range, skip\n"  if($debug>=2); 
-	    next;
-	}
-	# case 2: full covered
-	if(($min>=$lmin) && ($max<=$lmax)) {
-	    print "_insert_jobnode_nodedisplay: $xspace  -> child full covered, isleaf=$isleaf\n"  if($debug>=2); 
-	    
-	    if( ($min==$lmin) && ($max==$lmax) ) { # exact match
-		$updatechild=$child;
-	    } else {
-		if($min>$lmin) { 	           # overlap before
-		    print "_insert_jobnode_nodedisplay: $xspace  -> duplicate child   with (",($lmin),"..",($min-1),"), inserting subnodes ...\n" if($debug>=2); 
-		    $newchild=$dataref->duplicate_child($child);
-		    $newchild->{ATTR}->{min}=$lmin;
-		    $newchild->{ATTR}->{max}=$min-1;
-		    print "_insert_jobnode_nodedisplay: $xspace  -> adjust min of child to (",$min,"..",($lmax),")\n" if($debug>=2); 
-		    $child->{ATTR}->{min}=$min;
-		} 
-		if($max<$lmax) {                   # overlap after, copy tree
-		    print "_insert_jobnode_nodedisplay: $xspace  -> duplicate child   with (",($max+1),"..",($max),")\n" if($debug>=2); 
-		    $newchild=$dataref->duplicate_child($child);
-		    $newchild->{ATTR}->{min}=$max+1;
-		    $newchild->{ATTR}->{max}=$lmax;
-		    print "_insert_jobnode_nodedisplay: $xspace  -> adjust max of child to (",$min,"..",($max),")\n" if($debug>=2); 
-		    $child->{ATTR}->{max}=$max;
-		}
-		$updatechild=$child;
-	    }
-
-	    if($isleaf) {
-		# insert new child
-		print "_insert_jobnode_nodedisplay: $xspace     remove old child\n" if($debug>=2); 
-		$dataref->remove_child($updatechild);
-		print "_insert_jobnode_nodedisplay: $xspace  -> add new child   with (",($min),"..",($max),")\n" if($debug>=2); 
-		$updatechild=$dataref->new_child();
-		$updatechild->add_attr({ oid => $oid, min => $min, max => $max });
-	    } else {
-		# change tree of existing child
-#		$updatechild->{ATTR}->{min}=$min;
-#		$updatechild->{ATTR}->{max}=$max;
-		print "_insert_jobnode_nodedisplay: $xspace  -> duplicate child   with (",($min),"..",($max),"), inserting subnodes ...\n" if($debug>=2); 
-		$self->_insert_jobnode_nodedisplay($updatechild,\@newlist, $oid) ;
-	    }
- 	    for($i=$min;$i<=$max;$i++) {$covered[$i]=0}
-
-	} elsif(($min<$lmin) && ($max<=$lmax)) {
-	    print "_insert_jobnode_nodedisplay: $xspace  -> child not full covered: low overlap #subchilds=$subchilds\n" if($debug>=2); 
-
-	    if($max<$lmax) {             # overlap high
-		$newchild=$dataref->duplicate_child($child);
-		$newchild->{ATTR}->{min}=$max+1;
-		$newchild->{ATTR}->{max}=$lmax;
-		print "_insert_jobnode_nodedisplay: $xspace  -> duplicate child   with (",($max+1),"..",($lmax),")\n" if($debug>=2); 
-	    } 
-	    if($isleaf) {
-		$dataref->remove_child($child); # replace subtree
-		print "_insert_jobnode_nodedisplay: $xspace     remove old child\n" if($debug>=2); 
-		$newchild=$dataref->new_child();
-		$newchild->add_attr({ oid => $oid, min => $lmin, max => $max });
-		print "_insert_jobnode_nodedisplay: $xspace  -> insert new child  with (",($lmin),"..",($max),")\n" if($debug>=2); 
-	    } else {
-		$child->{ATTR}->{min}=$lmin;
-		$child->{ATTR}->{max}=$max;
-		print "_insert_jobnode_nodedisplay: $xspace  -> adjust range      with (",($lmin),"..",($max),"), inserting subnodes ...\n" if($debug>=2); 
-		$self->_insert_jobnode_nodedisplay($child,\@newlist, $oid) ;
-	    }
- 	    for($i=$min;$i<=$lmin;$i++) {$covered[$i]=0}
-	} elsif(($min>=$lmin) && ($max>$lmax)) {
-	    print "_insert_jobnode_nodedisplay: $xspace  -> child not full covered: high overlap #subchilds=$subchilds\n" if($debug>=2); 
-	    if($min>$lmin) {             # overlap low
-		$newchild=$dataref->duplicate_child($child);
-		$newchild->{ATTR}->{min}=$lmin;
-		$newchild->{ATTR}->{max}=$min-1;
-		print "_insert_jobnode_nodedisplay: $xspace  -> duplicate child   with (",($lmin),"..",($min-1),")\n" if($debug>=2); 
-	    } 
-	    if($isleaf) {
-		$dataref->remove_child($child); # replace subtree
-		print "_insert_jobnode_nodedisplay: $xspace     remove old child\n" if($debug>=2); 
-		$newchild=$dataref->new_child();
-		$newchild->add_attr({ oid => $oid, min => $min, max => $lmax });
-		print "_insert_jobnode_nodedisplay: $xspace  -> insert new child  with (",($min),"..",($lmax),")\n" if($debug>=2); 
-	    } else {
-		$child->{ATTR}->{min}=$min;
-		$child->{ATTR}->{max}=$lmax;
-		print "_insert_jobnode_nodedisplay: $xspace  -> adjust range      with (",($min),"..",($lmax),"), inserting subnodes ...\n" if($debug>=2); 
-		$self->_insert_jobnode_nodedisplay($child,\@newlist, $oid) ;
-	    }
- 	    for($i=$min;$i<=$lmax;$i++) {$covered[$i]=0}
-	}
-    }
-
-    # build entries for not already covered childs
-    for($i=$min;$i<=$max;$i++) {
-	push(@notcoveredlist,$i) if($covered[$i]==1);
-    }
-    if(@notcoveredlist) {
-	$newlist=reduce_list(@notcoveredlist);$newlist=~s/\(//gs;$newlist=~s/\)//gs;
-	print "_insert_jobnode_nodedisplay: $xspace  -> notcoveredlist= >$newlist<\n" if($debug>=2); 
-	for $subspec (split(',',$newlist)) {
-	    if($subspec=~/(\d+)\-(\d+)/) {$min=$1;$max=$2;  } 
-	    else                         {$min=$max=$subspec;}
-	}
-	$newchild=$dataref->new_child();
-	if($isleaf) {
-	    print "_insert_jobnode_nodedisplay: $xspace  -> insert new child with (",($min),"..",($max),")\n" if($debug>=2); 
-	    $newchild->add_attr({ oid => $oid, min => $min, max => $max });
-	} else {
-	    $newchild->add_attr({ min => $min, max => $max, oid => $dataref->{ATTR}->{oid} });
-	    print "_insert_jobnode_nodedisplay: $xspace  -> insert new child with (",($min),"..",($max),"), inserting subnodes ...\n" if($debug>=2); 
-	    $self->_insert_jobnode_nodedisplay($newchild,\@newlist, $oid) ;
-	}
-	
-    }
-
-    print "_insert_jobnode_nodedisplay: $xspace # END   level=$level nodelistref=>",join(',',@{$nodelistref}),"<\n" if($debug>=2); 
-
-}    
-
-
-sub _reduce_nodelist {
-    my($self) = shift;
-    my($schemeref)=shift;
-    my($nodelistrefs)=shift;
-    my($newnodelistrefs)=shift;
-    my($rg,$child, $listref, @covered, $allcovered, $nodenum,@shortlists,@newshortlists, $lastfound);
-    my $level=$schemeref->{_level};
-    my $xspace=" "x$level;
-    
-
-    print "_reduce_nodelist: $xspace # START level=$level scheme min..max=$schemeref->{ATTR}->{min}..$schemeref->{ATTR}->{max}\n" if($debug>=2); 
-    for($nodenum=$schemeref->{ATTR}->{min};$nodenum<=$schemeref->{ATTR}->{max};$nodenum++) {
-	$covered[$nodenum]=0;
-    }
-
-    # check which treenodes are given in nodelist, covered = {0 no nodes, 1 all nodes, 2 some nodes}  
-    foreach $listref (@{$nodelistrefs}) {
-	$nodenum=$listref->[0];
-	# check only nodes which are described by this subtree of the scheme
-	next if($nodenum<$schemeref->{ATTR}->{min});
-	next if($nodenum>$schemeref->{ATTR}->{max});
-	print "_reduce_nodelist: $xspace # CHECK nodenum=$nodenum\n" if($debug>=2); 
-	if($#{$listref}==0) {
-	    # node full covered
-	    $covered[$nodenum]=1;
-	} else {
-	    my(@list);
-	    $covered[$nodenum]=2 if($covered[$nodenum]==0);
-	    # remove top elem and add it to sublist
-	    @list=@{$listref};shift(@list);push(@{$shortlists[$nodenum]},\@list);
-	}
-    }
-
-    # check childs of all nodes which are not fully covered
-    $allcovered=1;
-    for($nodenum=$schemeref->{ATTR}->{min};$nodenum<=$schemeref->{ATTR}->{max};$nodenum++) { 
-	if($covered[$nodenum]==2) {
-	    my $allcovered_=1;
-	    foreach $child (@{$schemeref->{_childs}}) {
-		my(@newlist,$allcovered__);
-		$allcovered__=$self->_reduce_nodelist($child,$shortlists[$nodenum],\@newlist);
-		$allcovered_=0 if(!$allcovered__);
-		push(@{$newshortlists[$nodenum]},@newlist);
-	    }
-	    # reduce if all covered
-	    if($allcovered_) {
-		$covered[$nodenum]=1;
-		$newshortlists[$nodenum]=[];
-	    } else {
-		$allcovered=0;
-	    }
-
-	} elsif($covered[$nodenum]==0) {
-	    $allcovered=0;
-	}
-    }
-    
-    # build new node list
-    if($allcovered) {
-	push(@{$newnodelistrefs},[$schemeref->{ATTR}->{min}."-".$schemeref->{ATTR}->{max}]);
-
-    } else {
-	# build list of allcovered subnodes
-	my(@nlist,$newlist);
-	for($nodenum=$schemeref->{ATTR}->{min};$nodenum<=$schemeref->{ATTR}->{max};$nodenum++) { 
-	    push(@nlist, $nodenum) if($covered[$nodenum]==1);
-	}
-	if(@nlist) {
-	    $newlist=reduce_list(@nlist);
-	    push(@{$newnodelistrefs},[$newlist]); 
-	}
-
-
-	# build list of partly covered nodes
-	for($nodenum=$schemeref->{ATTR}->{min};$nodenum<=$schemeref->{ATTR}->{max};$nodenum++) { 
-	    if($covered[$nodenum]==2) {
-		my(@nlist,$newlist,$nd);
-		for($nd=$nodenum;$nd<=$schemeref->{ATTR}->{max};$nd++) { 
-		    if($covered[$nd]==2) {
-			if(&twolist_compare($newshortlists[$nodenum],$newshortlists[$nd])) {
-			    push(@nlist,$nd);
-			    $covered[$nd]=-1;
-			}
-		    }
-		}
-		$newlist=reduce_list(@nlist);
-	
-		foreach $listref (@{$newshortlists[$nodenum]}) {
-		    unshift(@$listref,  $newlist );
-		    push(@{$newnodelistrefs},$listref);
-		}
-	    }
-	}
-	
-    }
-
-    return($allcovered);
-}
-
-sub twolist_compare  {
-    my($listref1) = shift;
-    my($listref2) = shift;
-    my($l1,$l2, $rc);
-    
-    $rc=1;
-#    print "Compare1:", Dumper($listref1),"\n"; 
-#    print "Compare2:", Dumper($listref2),"\n"; 
-    if($#{$listref1} ne $#{$listref2}) {
-	return(0);
-    }
-    for($l1=0;$l1<=$#{$listref1};$l1++) {
-	if($#{$listref1->[$l1]} ne $#{$listref2->[$l1]}) {
-	    return(0);
-	}
-	for($l2=0;$l2<=$#{$listref1->[$l1]};$l2++) {
-	    $rc=0 if($listref1->[$l1]->[$l2] ne $listref2->[$l1]->[$l2]);
-	}
-    }
-    return($rc);
-}
-
-sub reduce_list  {
-    my(@list) = @_;
-    my(@newlist,$i,$start,$lastfound);
-
-    return("") if(!@list);
-    $lastfound=$list[0];
-    $start=$list[0];
-    for($i=1;$i<=$#list;$i++) {
-	if(($list[$i]-1) == $lastfound) {
-	    $lastfound++;
-	} else {
-	    if($start != $lastfound) {push(@newlist, $start."-".$lastfound)} 
-	    else                     {push(@newlist, $start)};
-	    $lastfound=$list[$i];
-	    $start=$lastfound;
-	}
-    }
-    if($start != $lastfound) {push(@newlist, $start."-".$lastfound)} 
-    else                     {push(@newlist, $start)};
-
-    if($#newlist>0) {
-	return("(" . (join(',',@newlist)) .")");
-    } else {
-	return($newlist[0]);
-    }
-}
-
-
-
-################################################################################################################
-# help function
-################################################################################################################
-sub get_numbers_from_name  {
-    my($self) = shift;
-    my($name) = shift;
-    my($schemeref) = shift;
-    my($id,$listref,$format,$child);
-   
-    foreach $child (@{$schemeref->{_childs}}) {
-	$listref=$self->_get_numbers_from_name($child,$name);
-    }
-
-    return($listref);
-}
-
-sub _get_numbers_from_name {
-    my($self) = shift;
-    my($schemeref)=shift;
-    my($name)=shift;
-    my($rg,$child,@list,$listref);
-
-
-    $rg=$schemeref->{ATTR}->{_maskregall};
-    if($name=~/^$rg$/) {
-	@list=$name=~/^$rg$/;
-	print "get_numbers_from_name: found on level ",$schemeref->{_level}+1," $name -> ",join(',',@list),"\n" if($debug>=2); 
-	return(\@list);
-    } else {
-	foreach $child (@{$schemeref->{_childs}}) {
-	    $listref=$self->_get_numbers_from_name($child,$name);
-	    if(defined($listref)) {
-		return($listref);
-	    }
-	}
-    }
-    return(undef);
-}
-
-
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_gen_table.pm b/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_gen_table.pm
deleted file mode 100644
index ecd81d2..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_gen_table.pm
+++ /dev/null
@@ -1,178 +0,0 @@
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-package LML_gen_table;
-
-my $VERSION='1.0';
-my($debug)=0;
-
-use strict;
-use Data::Dumper;
-use Time::Local;
-use Time::HiRes qw ( time );
-
-sub new {
-    my $self    = {};
-    my $proto   = shift;
-    my $class   = ref($proto) || $proto;
-    my $verbose = shift;
-    my $timings = shift;
-    printf("\t LML_gen_table: new %s\n",ref($proto)) if($debug>=3);
-    $self->{VERBOSE}   = $verbose; 
-    $self->{TIMINGS}   = $timings; 
-    $self->{LMLFH}     = undef; 
-    $self->{LAYOUT}    = undef; 
-    $self->{IDLISTREF} = undef; 
-    bless $self, $class;
-    return $self;
-}
-
-sub get_ids {
-    my($self) = shift;
-    return($self->{IDLISTREF});
-}
-
-sub process {
-    my($self) = shift;
-    my $layoutref  = shift;
-    my $filehandler_LML  = shift;
-    my ($numids,$gid,$idlistref);
-    $numids=0;
-    $self->{LAYOUT}    = $layoutref; 
-    $self->{LMLFH}     = $filehandler_LML; 
-    
-    $gid=$layoutref->{gid};
-    
-    $idlistref=[];
-    print "LML_gen_table::process: gid=$gid\n" if($self->{VERBOSE});
-    if(uc($gid) eq "JOBLIST_RUN") {
-	$idlistref=$self->_select_run_jobs();
-    }
-
-    if(uc($gid) eq "JOBLIST_WAIT") {
-	$idlistref=$self->_select_wait_jobs();
-    }
-
-    $self->{IDLISTREF}=$idlistref;
-    $numids=scalar @{$idlistref};
-#    print "LML_gen_table::process: idlist=(",join(',',sort(@{$idlistref})),")\n" if($self->{VERBOSE});
-    
-    $self->{VALIDATTR}=$self->_update_valid_attributes();
-
-    return($numids);
-}
-
-sub _update_valid_attributes {
-    my($self) = shift;
-    my ($key,$k,%validattr,@validattr);
-    
-    foreach $key (@{$self->{IDLISTREF}}) {
-	foreach $k (keys %{$self->{LMLFH}->{DATA}->{INFODATA}->{$key}}) {
-	    $validattr{$k}++;
-	}
-    }
-    @validattr=(sort keys(%validattr));
-    return(\@validattr);
-}
-
-sub _select_run_jobs {
-    my($self) = shift;
-    my (@idlist,$key,$ref);
-    
-    while(($key,$ref)=each(%{$self->{LMLFH}->{DATA}->{OBJECT}})) {
-	next if($ref->{type} ne 'job');
-	next if($self->{LMLFH}->{DATA}->{INFODATA}->{$key}->{state} ne 'Running');
-	push(@idlist,$key);
-    }
-    return(\@idlist);
-}
-
-sub _select_wait_jobs {
-    my($self) = shift;
-    my (@idlist,$key,$ref);
-    
-    while(($key,$ref)=each(%{$self->{LMLFH}->{DATA}->{OBJECT}})) {
-	next if($ref->{type} ne 'job');
-	next if($self->{LMLFH}->{DATA}->{INFODATA}->{$key}->{state} ne 'Idle');
-	push(@idlist,$key);
-    }
-    
-    return(\@idlist);
-}
-
-
-sub get_lml_table {
-    my($self) = shift;
-    my($ds,$rc,$id,$cid);
-    my $layoutref  = $self->{LAYOUT};
-    my(@keylist,$key,$value);
-
-    $ds->{id}=$layoutref->{gid};
-    $ds->{title}=$layoutref->{gid};
-    
-    foreach $cid (sort {$a <=> $b} (keys(%{$layoutref->{column}}))) {
-	$ds->{column}->{$cid}->{id}=$cid;
-	$ds->{column}->{$cid}->{name}=$layoutref->{column}->{$cid}->{key};
-	$ds->{column}->{$cid}->{sort}="alpha";
-	push(@keylist,$layoutref->{column}->{$cid}->{key});
-    }
-    
-    foreach $id (@{$self->{IDLISTREF}}) {
-	foreach $key (@keylist) {
-	    if(exists($self->{LMLFH}->{DATA}->{INFODATA}->{$id}->{$key})) {
-		$value=$self->{LMLFH}->{DATA}->{INFODATA}->{$id}->{$key};
-	    } else {
-		$value="?";
-	    }
-	    push(@{$ds->{row}->{$id}->{cell}},$value);
-	}
-    }
-    
-    return($ds);
-
-}
-
-
-sub get_lml_tablelayout {
-    my($self) = shift;
-    my($ds,$rc,$id,$cid);
-    my $layoutref  = $self->{LAYOUT};
-    my($key,$value,%activekeys,$lastcid);
-
-    $ds->{id}=$layoutref->{id};
-    $ds->{gid}=$layoutref->{gid};
-    
-    $lastcid=0;
-    foreach $cid (sort {$a <=> $b} (keys(%{$layoutref->{column}}))) {
-	$ds->{column}->{$cid}->{cid}=$cid;
-	$ds->{column}->{$cid}->{key}=$layoutref->{column}->{$cid}->{key};
-	$ds->{column}->{$cid}->{pos}=$layoutref->{column}->{$cid}->{pos};
-	$ds->{column}->{$cid}->{width}=$layoutref->{column}->{$cid}->{width};
-	$ds->{column}->{$cid}->{active}=$layoutref->{column}->{$cid}->{active};
-	$lastcid=$cid if($cid>$lastcid);
-	$activekeys{$ds->{column}->{$cid}->{key}}++;
-    }
-
-    foreach $key (@{$self->{VALIDATTR}}) {
-	next if($activekeys{$key});
-	$lastcid++;$cid=$lastcid;
-	$ds->{column}->{$cid}->{cid}=$cid;
-	$ds->{column}->{$cid}->{key}=$key;
-	$ds->{column}->{$cid}->{pos}=$cid;
-	$ds->{column}->{$cid}->{width}="1";
-	$ds->{column}->{$cid}->{active}="false";
-	$lastcid=$cid if($cid>$lastcid);
-    }
-
-    return($ds);
-
-}
-
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_ndtree.pm b/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_ndtree.pm
deleted file mode 100644
index b3f3e1b..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/LML2LML/LML_ndtree.pm
+++ /dev/null
@@ -1,158 +0,0 @@
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-package LML_ndtree;
-use strict;
-use Time::Local;
-use Time::HiRes qw ( time );
-use Storable qw(dclone); 
-use Data::Dumper;
-
-
-sub new  {
-    my $self  = {};
-    my $proto = shift;
-    my $class = ref($proto) || $proto;
-    my($name) = shift;
-
-    $self->{ATTR} = {};
-
-    # init root elem
-    $self->{_level}  = 0;
-    $self->{_childs} = [];
-    $name="el".$self->{_level} if(!$name);
-    $self->{_name}  = $name;
-
-    bless $self, $class;
-    return $self;
-}
-
-
-
-
-sub add_attr  {
-    my($self) = shift;
-    my($attrhashref) = shift;
-    my($id);
-
-#    print "LML_ndtree: add_attr: ",join(",",%{$attrhashref}),"->",caller(),"\n"; 
-    
-    foreach $id (keys(%{$attrhashref})) {
-	$self->{ATTR}->{$id}=$attrhashref->{$id};
-    }
-       
-    return(1);
-}
-
-
-sub new_child  {
-    my($self) = shift;
-    my($attrhashref) = shift;
-    my($name) = shift;
-    my $treenode = LML_ndtree->new();
-
-    $treenode->{_level}=$self->{_level}+1;
-    $name="el".$treenode->{_level} if(!$name);
-    $treenode->{_name}=$name;
-    
-    if($attrhashref) {
-	$treenode->add_attr($attrhashref);
-    }
-
-    push(@{$self->{_childs}},$treenode);
-
-    return($treenode);
-}
-
-sub duplicate_child  {
-    my($self) = shift;
-    my($child) = shift;
-    my($newchild) = dclone($child);
-  
-    push(@{$self->{_childs}},$newchild);
-
-    return($newchild);
-}
-
-
-
-sub insert_attr_into_tree  {
-    my($self) = shift;
-    my($tree) = shift;
-    my($spec) = shift;
-    my($attrhashref) = shift;
-    my($id);
-
-    print "WF: insert_attr_into_tree: $spec, ",join(",",%{$attrhashref}),"\n"; 
-    
-    
-    
-    return(1);
-}
-
-
-sub remove_child  {
-    my($self) = shift;
-    my($child) = shift;
-    my($childnr);
-
-    
-    for ($childnr=0; $childnr<=$#{$self->{_childs}};$childnr++) {
-	if($self->{_childs}->[$childnr] eq $child) {
-	    last;
-	}
-    }
-    splice(@{$self->{_childs}},$childnr,1);
-    return(1);
-}
-
-
-sub get_xml_tree {
-    my($self) = shift;
-    my($fromlevel,$tolevel) = @_;
-    my($id,$subid,$elname,$xmldata,$level,$child);
-
-    $fromlevel = -1     if(!defined($fromlevel));
-    $tolevel   = 100000 if(!defined($tolevel));
-    $xmldata="";
-
-    $level=$self->{_level};
-    $elname=$self->{_name};
-
-    if($level<=$tolevel) {
-	
-	# prolog
-	if($level>=$fromlevel) {
-	    $xmldata.="    "x$level;
-	    $xmldata.="<$elname";
-	    foreach $subid (sort {$b cmp $a} (keys(%{$self->{ATTR}}))) {
-		next if($subid=~/\_/);
-		$xmldata.=" $subid= \"".$self->{ATTR}->{$subid}."\"";
-	    }
-	    $xmldata.=">\n";
-	}
-	
-	# dive in
-	foreach $child (@{$self->{_childs}}) {
-	    $xmldata.=$child->get_xml_tree();
-	}
-	
-	# epilog
-	if($level>=$fromlevel) {
-	    $xmldata.="    "x$level;
-	    $xmldata.="</$elname>\n";
-	}
-	
-    }
-
-    return($xmldata);
-}
-
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/LML_combiner/LML_combine_file_obj.pm b/rms/org.eclipse.ptp.rm.lml.da/LML_combiner/LML_combine_file_obj.pm
deleted file mode 100644
index 4b316b2..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/LML_combiner/LML_combine_file_obj.pm
+++ /dev/null
@@ -1,243 +0,0 @@
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-package LML_combine_file_obj;
-
-my $VERSION='$Revision: 1.00 $';
-my($debug)=0;
-
-use strict;
-use lib "$FindBin::RealBin/lib";
-use Data::Dumper;
-use Time::Local;
-use Time::HiRes qw ( time );
-
-
-sub new {
-    my $self    = {};
-    my $proto   = shift;
-    my $class   = ref($proto) || $proto;
-    my $verbose = shift;
-    my $timings = shift;
-    printf("\t LML_combine_file_obj: new %s\n",ref($proto)) if($debug>=3);
-    $self->{DATA}      = {};
-    $self->{VERBOSE}   = $verbose; 
-    $self->{TIMINGS}   = $timings; 
-    $self->{LASTINFOID} = undef;
-    bless $self, $class;
-    return $self;
-}
-
-sub get_data_ref {
-    my($self) = shift;
-    return($self->{DATA});
-} 
-
-sub get_stat {
-    my($self) = shift;
-    my($log,$type,%types,$id);
-    $log="";
-    
-    $log.=sprintf("objects: total #%d\n",scalar keys(%{$self->{DATA}->{OBJECT}}));
-    foreach $id (keys %{$self->{DATA}->{OBJECT}}) {
-	$type=$self->{DATA}->{OBJECT}->{$id}->{type};
-	$types{$type}++;
-    }
-    foreach $type (sort keys %types) {
-	$log.=sprintf("        |-- %10d (%s)\n",$types{$type},$type);
-    }
-    return($log);
-} 
-
-sub read_lml_fast {
-    my($self) = shift;
-    my $infile  = shift;
-    my $type    = shift;
-    my($xmlin);
-    my $rc=0;
-
-    my $tstart=time;
-    if(!open(IN,$infile)) {
-	print "could not open $infile, leaving ...\n";return(0);
-    }
-    while(<IN>) {
-	$xmlin.=$_;
-    }
-    close(IN);
-    my $tdiff=time-$tstart;
-    printf("LML_file_obj: read  XML in %6.4f sec\n",$tdiff) if($self->{VERBOSE});
-
-    $self->{DATA}->{SEARCHTYPE}=$type;
-    $tstart=time;
-
-    # light-weight self written xml parser, only working for simple XML files  
-    $xmlin=~s/\n/ /gs;
-    $xmlin=~s/\s\s+/ /gs;
-    my ($tag,$tagname,$rest,$ctag,$nrc);
-    foreach $tag (split(/\>\s*/,$xmlin)) {
-	$ctag.=$tag;
-	$nrc=($ctag=~ tr/\"/\"/);
-	if($nrc%2==0) {
-	    $tag=$ctag;
-	    $ctag="";
-	} else {
-	    next;
-	}
-	
-#	print "TAG: '$tag'\n";
-	if($tag=~/^<[\/\?](.*)[^\s\>]/) {
-	    $tagname=$1;
-	    $self->lml_end($self->{DATA},$tagname,());
-	} elsif($tag=~/<([^\s]+)\s*$/) {
-	    $tagname=$1;
-#	    print "TAG0: '$tagname'\n";
-	    $self->lml_start($self->{DATA},$tagname,());
-	} elsif($tag=~/<([^\s]+)(\s(.*)[^\/])$/) {
-	    $tagname=$1;
-	    $rest=$2;$rest=~s/^\s*//gs;$rest=~s/\s*$//gs;
-#	    print "TAG1: '$tagname' rest='$rest'\n";
-	    $self->lml_start($self->{DATA},$tagname,split(/=?\"\s*/,$rest));
-	} elsif($tag=~/<([^\s]+)(\s(.*)\s?)\/$/) {
-	    $tagname=$1;
-	    $rest=$2;$rest=~s/^\s*//gs;$rest=~s/\s*$//gs;
-#	    print "TAG2: '$tagname' rest='$rest' closed\n";
-	    $self->lml_start($self->{DATA},$tagname,split(/=?\"\s*/,$rest));
-	    $self->lml_end($self->{DATA},$tagname,());
-	}
-    }
-
-    $tdiff=time-$tstart;
-    printf("LML_file_obj: parse XML in %6.4f sec\n",$tdiff) if($self->{VERBOSE});
-
-#    print Dumper($self->{DATA});
-    return($rc);
-
-}
-
-sub lml_start {
-    my $self=shift; # object reference
-    my $o   =shift;
-    my $name=shift;
-#    print "WF: >",ref($o),"< >$name<\n";
-    my($k,$v,$actnodename,$id);
-    my %attr=(@_);
-
-    if($name eq "lml:lgui") {
-	foreach $k (sort keys %attr) {
-	    $o->{LMLLGUI}->{$k}=$attr{$k};
-	}
-	return(1);
-    }
-    if($name eq "objects") {
-	return(1);
-    }
-    if($name eq "information") {
-	return(1);
-    }
-    if($name eq "object") {
-	$id=$attr{id};
-	if(exists($o->{OBJECT}->{$id})) {
-	    print "LML_file_obj: WARNING objects with id >$id< exists, skipping\n";
-	    return(0);
-    	}
-	foreach $k (sort keys %attr) {
-#	    print "$k: $attr{$k}\n";
-	    $o->{OBJECT}->{$id}->{$k}=$attr{$k};
-	}
-	return(1);
-    }
-    if($name eq "info") {
-	$id=$attr{oid};
-	$o->{LASTINFOID}=$id;
-	if(exists($o->{INFO}->{$id})) {
-	    print "LML_file_obj: WARNING info with id >$id< exists, skipping\n";
-	    return(0);
-    	}
-	foreach $k (sort keys %attr) {
-#	    print "$k: $attr{$k}\n";
-	    $o->{INFO}->{$id}->{$k}=$attr{$k};
-	}
-	return(1);
-    }
-    if($name eq "data") {
-	$id=$o->{LASTINFOID};
-	$k=$attr{key};
-	$v=$attr{value};
-
-	if(exists($o->{INFODATA}->{$id}->{$k})) {
-	    print "LML_file_obj: WARNING infodata with id >$id< and key >$k< exists, skipping\n";
-	    return(0);
-    	}
-	$o->{INFODATA}->{$id}->{$k}=$v;
-	return(1);
-    }
-    print "LML_file_obj: WARNING unknown tag >$name< \n";
-   
-}
-
-sub lml_end {
-    my $self=shift; # object reference
-    my $name=shift;
-}
-
-
-sub write_lml {
-    my($self) = shift;
-    my $outfile  = shift;
-    my($k,$rc,$id);
-    my $tstart=time;
-    $rc=1;
-
-    open(OUT,"> $outfile") || die "cannot open file $outfile";
-    printf(OUT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-
-    printf(OUT "<lml:lgui ");
-    foreach $k (sort keys %{$self->{DATA}->{LMLLGUI}}) {
-	printf(OUT "%s=\"%s\"\n ",$k,$self->{DATA}->{LMLLGUI}->{$k});
-    }
-    printf(OUT "     \>\n");
-
-
-    printf(OUT "<objects>\n");
-    foreach $id (sort keys %{$self->{DATA}->{OBJECT}}) {
-	printf(OUT "<object");
-	foreach $k (sort keys %{$self->{DATA}->{OBJECT}->{$id}}) {
-	    printf(OUT " %s=\"%s\"",$k,$self->{DATA}->{OBJECT}->{$id}->{$k});
-	}
-	printf(OUT "/>\n");
-    }
-    printf(OUT "</objects>\n");
-
-    printf(OUT "<information>\n");
-    foreach $id (sort keys %{$self->{DATA}->{INFO}}) {
-	printf(OUT "<info");
-	foreach $k (sort keys %{$self->{DATA}->{INFO}->{$id}}) {
-	    printf(OUT " %s=\"%s\"",$k,$self->{DATA}->{INFO}->{$id}->{$k});
-	}
-	printf(OUT ">\n");
-	foreach $k (sort keys %{$self->{DATA}->{INFODATA}->{$id}}) {
-	    printf(OUT "<data key=\"%s\" value=\"%s\"/>\n",$k,$self->{DATA}->{INFODATA}->{$id}->{$k});
-	}
-	printf(OUT "</info>\n");
-    }
-    printf(OUT "</information>\n");
-
-    printf(OUT "</lml:lgui>\n");
-
-    close(OUT);
-
-    my $tdiff=time-$tstart;
-    printf("LML_file_obj: wrote  XML in %6.4f sec to %s\n",$tdiff,$outfile) if($self->{TIMINGS});
-
-    return($rc);
-
-}
-
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/LML_combiner/LML_combine_obj.pl b/rms/org.eclipse.ptp.rm.lml.da/LML_combiner/LML_combine_obj.pl
deleted file mode 100755
index cb6024c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/LML_combiner/LML_combine_obj.pl
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/perl -w
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-
-use strict;
-use Getopt::Long;
-
-use FindBin;
-use lib "$FindBin::RealBin/";
-use lib "$FindBin::RealBin/../lib";
-
-use LML_combine_file_obj;
-use LML_combine_obj_check;
-use LML_combine_obj_bgp;
-
-
-my $patint="([\\+\\-\\d]+)";   # Pattern for Integer number
-my $patfp ="([\\+\\-\\d.E]+)"; # Pattern for Floating Point number
-my $patwrd="([\^\\s]+)";       # Pattern for Work (all noblank characters)
-my $patbl ="\\s+";             # Pattern for blank space (variable length)
-
-#####################################################################
-# get user info / check system 
-#####################################################################
-my $UserID = getpwuid($<);
-my $Hostname = `hostname`;
-my $verbose=1;
-my ($filename);
-
-
-#####################################################################
-# get command line parameter
-#####################################################################
-
-# option handling
-my $opt_outfile="./test.lml";
-my $opt_verbose=0;
-my $opt_timings=0;
-my $opt_dump=0;
-my $opt_dbdir="./";
-usage($0) if( ! GetOptions( 
-			    'verbose'          => \$opt_verbose,
-			    'timings'          => \$opt_timings,
-			    'dump'             => \$opt_dump,
-			    'dbdir=s'          => \$opt_dbdir,
-			    'output=s'         => \$opt_outfile
-			    ) );
-
-#print "@ARGV ($opt_outfile)\n";
-if ($#ARGV < 0) {
-    &usage($0);
-}
-my @filenames = @ARGV;
-
-my $system_sysprio=-1;
-my $maxtopdogs=-1;
-my $filehandler;
-
-$filehandler=LML_combine_file_obj->new($opt_verbose,$opt_timings);
-
-foreach $filename (@filenames) {
-    print "reading file: $filename  ...\n" if($opt_verbose); 
-    $filehandler->read_lml_fast($filename);
-}
-
-# determine system type
-my $system_type = "unkown";
-{
-    my($key,$ref);
-    while(($key,$ref)=each(%{$filehandler->{DATA}->{OBJECT}})) {
-	if($ref->{type} eq 'system') {
-	    $ref=$filehandler->{DATA}->{INFODATA}->{$key};
-	    if($ref->{type}) {
-		$system_type=$ref->{type};
-		printf("scan system: type is %s\n",$system_type);
-	    }
-	    last; 
-	}
-    }
-}
-
-
-if($system_type eq "BG/P") {
-    &LML_combine_obj_bgp::update($filehandler->get_data_ref(),$opt_dbdir);
-}
-
-
-&LML_combine_obj_check::check_jobs($filehandler->get_data_ref());
-
-if($opt_verbose) {
-    print $filehandler->get_stat();
-}
-
-$filehandler->write_lml($opt_outfile);
-
-sub usage {
-    die "Usage: $_[0] <options> <filenames> 
-                -output <file>           : LML output filename
-                -verbose                 : verbose
-";
-}
-
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/LML_combiner/LML_combine_obj_bgp.pm b/rms/org.eclipse.ptp.rm.lml.da/LML_combiner/LML_combine_obj_bgp.pm
deleted file mode 100644
index 8512f49..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/LML_combiner/LML_combine_obj_bgp.pm
+++ /dev/null
@@ -1,109 +0,0 @@
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-package LML_combine_obj_bgp;
-use strict;
-use Data::Dumper;
-
-my $VERSION='$Revision: 1.00 $';
-my($debug)=0;
-
-sub update {
-    my($dataptr) = shift;
-    my($dbdir) = shift;
-#    print Dumper($dataptr);
-    &update_job_info($dataptr);
-    &update_class_info($dataptr);
-    return(1);
-} 
-
-sub update_job_info {
-    my($dataptr) = shift;
-    my($id,$jobref,%partitions);
-    
-    # scan for partition names
-    foreach $id (keys(%{$dataptr->{OBJECT}})) {
-	if($dataptr->{OBJECT}->{$id}->{type} eq "partition") {
-	    $partitions{$dataptr->{OBJECT}->{$id}->{name}}=$dataptr->{INFODATA}->{$id};
-	}
-    }
-    # update job info
-    foreach $id (keys(%{$dataptr->{OBJECT}})) {
-	if($dataptr->{OBJECT}->{$id}->{type} eq "job") {
-	    $jobref=$dataptr->{INFODATA}->{$id};
-	    
-	    # update nodelist 
-	    if($jobref->{state} ne "Running") {
-		if(!exists($jobref->{nodelist})) {
-		    $jobref->{nodelist}="-";
-		    $jobref->{totaltasks}=0;
-		}
-	    }
-	    # update totalcores
-	    if(!exists($jobref->{totalcores})) {
-		if(exists($jobref->{bgp_size_alloc})) {
-		    $jobref->{totalcores}=$jobref->{bgp_size_alloc}*4;
-		} elsif (exists($jobref->{bgp_size_req})) {
-		    $jobref->{totalcores}=$jobref->{bgp_size_req}*4;
-		} elsif (exists($jobref->{bgp_shape_alloc})) {
-		    my @shape=split(/x/,$jobref->{bgp_shape_alloc});
-		    $jobref->{totalcores}=$shape[0]*$shape[1]*$shape[2]*512*4;
-		} elsif (exists($jobref->{bgp_shape_req})) {
-		    my @shape=split(/x/,$jobref->{bgp_shape_req});
-		    $jobref->{totalcores}=$shape[0]*$shape[1]*$shape[2]*512*4;
-		} elsif(exists($jobref->{queue})) {
-		    if($jobref->{queue} eq "serial") {
-			# job will not executed on a partition
-			$jobref->{totalcores}=0;
-			$jobref->{totaltasks}=1;
-		    }
-		} else {
-		    print "update_job_info: could not find attributes for job $id to compute totalcores\n";
-		}
-	    }
-	    # update totaltasks and other attributes for BG/P running jobs
-	    if(!exists($jobref->{totaltasks})) {
-		if(exists($jobref->{bgp_partalloc})) {
-		    my $partitionref=$partitions{$jobref->{bgp_partalloc}};
-		    if(exists($partitionref->{bgp_mode})) {
-			$jobref->{totaltasks}=$jobref->{bgp_size_alloc}*4;
-		    } else {
-			$jobref->{totaltasks}=-1;
-		    }
- 		    if(exists($partitionref->{bgp_executable})) {
-			$jobref->{executable}=$partitionref->{bgp_executable};
-		    }   
-		}
-	    }
-
-	}
-    }
-    return(1);
-}
-
-sub update_class_info {
-    my($dataptr) = shift;
-    my($id,$class);
-    my(%classes);
-
-    # get class info
-    foreach $id (keys(%{$dataptr->{OBJECT}})) {
-	if($dataptr->{OBJECT}->{$id}->{type} eq "class") {
-	    $class=$dataptr->{INFODATA}->{$id}->{name};
-#	    print "class=$class\n";
-	    $classes{$class}{include}=$dataptr->{INFODATA}->{$id}->{bgp_incl_bg};
-	    $classes{$class}{exclude}=$dataptr->{INFODATA}->{$id}->{bgp_excl_bg};
-	}
-    }
-
-    return(1);
-} 
-
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/LML_combiner/LML_combine_obj_check.pm b/rms/org.eclipse.ptp.rm.lml.da/LML_combiner/LML_combine_obj_check.pm
deleted file mode 100644
index 0d753bf..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/LML_combiner/LML_combine_obj_check.pm
+++ /dev/null
@@ -1,53 +0,0 @@
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-package LML_combine_obj_check;
-use strict;
-use Data::Dumper;
-use lib "$FindBin::RealBin/../LML_specs";
-use LML_specs;
-
-my $VERSION='$Revision: 1.00 $';
-my($debug)=0;
-
-sub check_jobs {
-    my($dataptr) = shift;
-    my($inforef,$id,$key);
-    my(%unknown_attr,%unset_attr);
-
-    foreach $id (keys(%{$dataptr->{OBJECT}})) {
-	if($dataptr->{OBJECT}->{$id}->{type} eq "job") {
-	    $inforef=$dataptr->{INFODATA}->{$id};
-	    foreach $key (keys %{$inforef}) {
-		if(!exists($LML_specs::LMLattributes->{'job'}->{$key})) {
-		    $unknown_attr{$key}++;
-		}
-	    }
-	    foreach $key (keys %{$LML_specs::LMLattributes->{'job'}}) {
-		next if ($LML_specs::LMLattributes->{'job'}->{$key}->[1] ne "M");
-		if(!exists($inforef->{$key})) {
-		    $unset_attr{$key}++;
-		}
-	    }
-
-	}
-    }
-    foreach $key (sort keys(%unknown_attr)) {
-	printf("check_jobs: WARNING: unknown attribute '%s' %d occurrences\n",$key,$unknown_attr{$key});
-    }
-    foreach $key (sort keys(%unset_attr)) {
-	printf("check_jobs: WARNING: unset attribute '%s' %d occurrences\n",$key,$unset_attr{$key});
-    }
-
-    return(1);
-} 
-
-
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/LML_da.pl b/rms/org.eclipse.ptp.rm.lml.da/LML_da.pl
deleted file mode 100755
index 6c4f25e..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/LML_da.pl
+++ /dev/null
@@ -1,142 +0,0 @@
-#!/usr/bin/perl -w
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-
-use FindBin;
-use lib "$FindBin::RealBin/lib";
-use XML::Simple;
-use Data::Dumper;
-use Getopt::Long;
-use Time::Local;
-use Time::HiRes qw ( time );
-
-use strict;
-
-my $patint="([\\+\\-\\d]+)";   # Pattern for Integer number
-my $patfp ="([\\+\\-\\d.E]+)"; # Pattern for Floating Point number
-my $patwrd="([\^\\s]+)";       # Pattern for Work (all noblank characters)
-my $patbl ="\\s+";             # Pattern for blank space (variable length)
-
-use LML_da_util;
-use LML_da_step;
-
-my $version="1.0";
-
-# time measurement
-my ($tstart,$tdiff,$rc);
-
-
-# Init XML-Parser
-my $xs=XML::Simple->new();
-
-# option handling
-my $opt_configfile="./LML_da_workflow.conf";
-my $opt_verbose=0;
-my $opt_dump=0;
-usage($0) if( ! GetOptions( 
-			    'verbose'          => \$opt_verbose,
-			    'configfile=s'     => \$opt_configfile,
-			    'dump'             => \$opt_dump
-			    ) );
-my $date=`date`;
-chomp($date);
-
-print "-"x90,"\n" if($opt_verbose);
-print "  LML Data Access Workflow Manager $version, starting at ($date)\n"; 
-print "-"x90,"\n" if($opt_verbose);
-
-# read config file
-print STDERR "$0: configfile=$opt_configfile\n" if($opt_verbose);
-$tstart=time;
-my $confxml=$xs->XMLin($opt_configfile,
-		       KeyAttr => {step => "+id"},
-		       ForceArray => 1);
-$tdiff=time-$tstart;
-printf("$0: parsing XML configfile in %6.4f sec\n",$tdiff) if($opt_verbose);
-
-# init global vars
-my $vardefs=$confxml->{'vardefs'}->[0];
-my $globalvarref;
-my $pwd=`pwd`;
-chomp($pwd);
-$globalvarref->{instdir} = $FindBin::RealBin;
-$globalvarref->{pwd}     = $pwd;
-$globalvarref->{permdir} = "./perm_dedault";
-$globalvarref->{tmpdir}  = "./tmp_dedault";
-$globalvarref->{verbose} = $opt_verbose;
-&LML_da_util::init_globalvar($vardefs,$globalvarref); 
-
-# substitute vars in steps
-my $stepdefs=$confxml->{'step'};
-#&LML_da_util::substitute_recursive($stepdefs,$globalvarref); 
-
-if($opt_dump) {
-    print Dumper($confxml);
-    exit(1);
-}
-
-my $permdir=$globalvarref->{permdir};
-my $tmpdir=$globalvarref->{tmpdir};
-
-
-# check permament snd temporary directory
-if(! -d $permdir) {
-	printf( "LML_da.pl: permament directory not found, create new directory $permdir ...\n");
-	if(!mkdir($permdir,0755)) {
-	    die "LML_da.pl: could not create $permdir ...$!\n";
-	}
-}
-
-if(! -d $tmpdir) {
-	printf( "LML_da.pl: temporary directory not found, create new directory $tmpdir ...\n");
-	if(!mkdir($tmpdir,0755)) {
-	    die "LML_da.pl: could not create $tmpdir ...$!\n";
-	}
-}
-
-
-# check if another LML_da.pl is running
-if (-f "$permdir/RUNNING") {
-	printf( "LML_da.pl: another LML_da.pl process is running ... exiting, please remove $permdir/RUNNING\n");
-} else {
-    # touch RUNNING stamp
-    open(RUNNING,"> $permdir/RUNNING");
-    print RUNNING "$$\n";
-    close(RUNNING);
-
-    # processing steps
-    my $stepobj=LML_da_step->new($stepdefs,$globalvarref);
-    $stepobj->process();
-
-    unlink("$permdir/RUNNING");
-
-}
-
-
-
-print "-"x90,"\n" if($opt_verbose);
-print "  LML Data Access Workflow Manager $version, ending at   ($date)\n"; 
-print "-"x90,"\n" if($opt_verbose);
-
-
-sub mydie {
-    my ($message)=@_;
-    unlink("$permdir/RUNNING");
-    die "$message";
-}
-
-sub usage {
-    die "Usage: $_[0] <options> 
-                -configfile <configfile> : configfile (default: ./LML_da.conf)
-                -verbose                 : verbose
-
-";
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.da/LML_specs/LML_specs.pm b/rms/org.eclipse.ptp.rm.lml.da/LML_specs/LML_specs.pm
deleted file mode 100644
index 9217d52..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/LML_specs/LML_specs.pm
+++ /dev/null
@@ -1,86 +0,0 @@
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-
-package LML_specs;
-
-use strict;
-
-# [type, req, info]
-# type:
-#    k    -> keywords
-#    s    -> string
-#    d    -> integer
-#    D    -> Date
-# req:
-#    M    -> Mandatory
-#    O    -> Optional
-
-$LML_specs::LMLattributes = {
-    "job" => {
-	         "owner"          => ["s","M", undef],
-	         "group"          => ["s","M", undef],
-	         "state"          => ["k","M",{
-		                                "Running"    => 1,
-						"Completed"  => 1,
-						"Idle"       => 1,
-						"Not Queued" => 1,
-						"Removed"    => 1,
-						"User Hold"  => 1,
-						"System Hold"=> 1,
-				      }
-		                     ],
-		 "wall"         => ["d","M",undef],
-		 "wallsoft"     => ["d","O",undef],
-		 "queuedate"    => ["D","M",undef], 
-		 "dispatchdate" => ["D","O",undef],
-		 "enddate"      => ["D","O",undef],
-		 "name"         => ["s","O",undef],
-		 "step"         => ["s","M",undef],
-		 "comment"      => ["s","O",undef],
-		 "totalcores"   => ["i","M",undef],
-		 "totaltasks"   => ["i","M",undef],
-		 "nodelist"     => ["s","M",undef],
-		 "queue"        => ["s","M",undef],
-		 "dependency"   => ["s","O",undef],
-		 "executable"   => ["s","O",undef],
-# LL optional
-		 "classprio"    => ["d","O",undef], 
-		 "groupprio"    => ["d","O",undef], 
-		 "userprio"     => ["d","O",undef], 
-		 "favored"      => ["s","O",undef], 
-		 "restart"      => ["s","O",undef], 
-# BG/P optional
-		 "bgp_partalloc"      => ["s","O",undef],
-		 "bgp_size_alloc"     => ["s","O",undef],
-		 "bgp_size_req"       => ["s","O",undef],
-		 "bgp_shape_alloc"    => ["s","O",undef],
-		 "bgp_shape_req"      => ["s","O",undef],
-		 "bgp_state"          => ["s","O",undef],
-		 "bgp_type"           => ["s","O",undef],
-   },
-    "node" => {
-	         "id"             => ["s","M", undef],
-	         "ncores"         => ["i","M", undef],
-	         "physmem"        => ["i","M", undef],
-	         "availmem"       => ["i","M", undef],
-	         "state"          => ["k","M",{
-		                                "Running"    => 1,
-						"Idle"       => 1,
-						"Drained"    => 1,
-						"Down"       => 1,
-						"Unknown"    => 1,
-				      }
-		                     ],
-    }
-};
-
-
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/META-INF/MANIFEST.MF b/rms/org.eclipse.ptp.rm.lml.da/META-INF/MANIFEST.MF
deleted file mode 100644
index b32034c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,7 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: LML Data Access
-Bundle-SymbolicName: org.eclipse.ptp.rm.lml.da
-Bundle-Version: 1.0.0.qualifier
-Bundle-Vendor: eclipse.org
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/rms/org.eclipse.ptp.rm.lml.da/README.txt b/rms/org.eclipse.ptp.rm.lml.da/README.txt
deleted file mode 100644
index c84cefd..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/README.txt
+++ /dev/null
@@ -1,305 +0,0 @@
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-
-
-LML_da: LML data access tool
------------------------------
-
-W.Frings, Forschungszentrum Juelich GmbH, 11 Feb 2011
-
-Introduction
-------------
-
-This tool is part of the new remote system monitoring views of PTP
-displaying the status and the batch system usage of the remote
-systems.  The new monitoring views are adaption of the new Java based
-version of LLview (see also http://www.fzj-juelich.de/jsc/llview).
-
-LML_da extracts from the resource management system of the remote
-system information about the batch system usage and store it in a XML
-file in LML format. Depending on the availability and access rules
-following information will be obtained by LML_da:
-
- - nodes managed by batch system
- - batch jobs running and waiting in queues
- - information about reservation, rules for job-queue 
-   mapping and queue-node mapping 
- - system state (failed components, ...)
- - additional information, e.g. power usage, 
-   I/O-throughput, ... (depending on system)   
- - ...
-
-
-LML_da is a (set of) Perl scripts which uses the standard batch system
-query functions to get the above described information. It depends on
-the access right given to the user's account under which LML_da is
-executed, which information could be obtained.
-
-For large system the queries could take a long time because
-information about ALL jobs and ALL nodes of the system are
-requested. To prevent an overload of the batch system management
-daemons LML_da should be installed by system administrator and ran
-only in one instance on the system via crontab (e.g. one a minute).
-
-The following sections will describe the LML-format created by
-LML_da, the internal structure of LML_da and the format of the
-input files needed to run LML_da.
-
-The LML format:
----------------
-
-LML is the XML format used to describe the machine status of the
-remote system. A more detailed description of that format can be found
-under:
-
-http://llview.zam.kfa-juelich.de/LML/OnlineDocumentation/lmldoc.html
-
-The structure of LML is specified with a XML schema definition file
-which is also available on that web page. In addition, also a
-validation tool for LML is available which allows to check LML files
-during development of new system adapters.
-
-LML can be used to store different kind of data. LML_da uses LML in
-two steps. In the first step LML will be used to store information in
-raw format, including only objects and info-data elements.  In the
-second step the LML files will also have display elements like tables
-and node displays containing the information in form which can
-directly be used by the monitoring views of the client.
-
-
-LML_da structure:
------------------
-
-The generation of the LML data is processed in a sequence of steps,
-executed by the main script LML_da.pl:
-
-    ./LML_da.pl <config-file>
-
-The main steps are the calling the driver scripts, combining the
-output files and generating of the LML intended to use by the monitoring client
-client.
-
-1. Driver
----------
-
-To support different types of batch systems LML_da has in addition to
-the general a batch system related layer:
-    
-     - driver scripts for Torque: 
-       ./TORQUE/da_<infotype>_LML.pl
-
-     - driver scripts for LoadLeveler: 
-     - ./LL/da_<infotype>_LML.pl
-
-     - driver scripts for BlueGene/P running Loadleveler: 
-     - ./BGP/LL/da_<infotype>_LML.pl
-     - ./BGP/DB2/da_<infotype>_LML.pl
-     - ./BGP/RAW/da_<infotype>_LML.pl
- 
-     - ...	   
-
-Each of the driver scripts could are executed from LML_da.pl and
-collects typically one kind of data.  For example,
-./TORQUE/da_jobs_info_LML.pl runs the torque utility 'qstat -f' to get
-information about running and queued jobs of all users.  Each script
-will store the resulting data in a separate LML file, using LML
-objects and info-data elements.
-
-Remark: An advantage of separating the queries to individual scripts
-is that they are simple to implement and adapt to other or newer
-version of batch systems. For supported batch-systems the script has
-to be adapted marginally, e.g. if the batch system is not installed in
-the default location. Also, if the batch system attributes are changed
-or added on a specific system, it could be adapted in the driver
-scripts directly. For this, each script contains at table defining the
-mapping between attribute names given by batch system and those
-accepted by LML.
-
-
-2. Combiner
------------
-
-Next, these LML output files of the driver scripts will be combined to
-one LML file. This will be done by the LMLcombiner, called from
-LML_da: 
-
-     - ./LMLcombiner/LML_combine_obj.pl -o LML_rawfile.xml <files>
-
-Depending on the system type the combiner will also combine or adjust
-attributes and check if all mandatory attributes for jobs and nodes
-are available.
-
-3. LML2LML
------------
-
-In this step the LML file will be generated which is intended to use
-by the monitoring client . This will be done by the LML2LML
-utility:
-
-     - /LML2LML/LML2LML.pl -v -layout layout.xml -output LML_file.xml LML_rawfile.xml
-
-This resulting LML file will contain for each view a separate element, like <table>
-or <nodedisplay> according to the elements requested in the layout file. 
-
-
-
-LML_da input files:
--------------------
-
-There are two input files needed to process the LML data. The first
-one is the input file of LML_da.pl describing the steps which
-should be executed. 
-
-LML_da.pl can handle workflows described by steps and dependencies
-between those steps. A simple example is default configuration script
-for Torque, defining the thre main steps described above.
-
---------------------------------------------------------------------------------------------
-<LML_da_workflow>
-
-<!--- predefined vars: 
-      $instdir="./da"
-      $stepinfile                 # file in $tmpdir filename contains id of predecessor step
-      $stepoutfile                # file in $tmpdir filename contains current id
-  -->
-<vardefs>
-  <var   key="tmpdir"        value="./LMLtmp" />              
-  <var   key="permdir"       value="./LMLperm" />             
-</vardefs>
-
-<step
-   id           = "getdata" 
-   active       = "0"
-   exec_after   = ""            
-   type         = "execute" 
-   >            
-  <cmd exec="TORQUE/da_system_info_LML.pl               $tmpdir/sysinfo_LML.xml" />
-  <cmd exec="TORQUE/da_jobs_info_LML.pl                 $tmpdir/jobs_LML.xml" />
-  <cmd exec="TORQUE/da_nodes_info_LML.pl                $tmpdir/nodes_LML.xml" />
-</step>
-
-<step
-   id           = "combineLML" 
-   active       = "1"
-   exec_after   = "getdata"               
-   type         = "execute" 
-   >            
-  <cmd exec="$instdir/LMLcombiner/LML_combine_obj.pl -dbdir $permdir/db -v -o $stepoutfile 
-                                                            $tmpdir/sysinfo_LML.xml
-                                                            $tmpdir/jobs_LML.xml 
-                                                            $tmpdir/nodes_LML.xml "
-                                                            />
-</step>
-
-<step
-   id           = "genLML_std" 
-   active       = "1"
-   exec_after   = "combineLML"		
-   type         = "execute" 
-   >		
-  <cmd exec="$instdir/LML2LML/LML2LML.pl -v -layout $permdir/layout_std.xml -output $stepoutfile $stepinfile" />
-</step>
-
-<step
-   id           = "cppermfile1" 
-   active       = "1"
-   exec_after   = "genLML_std"          
-   type         = "execute" 
-   >            
-  <cmd exec="cp $stepinfile  $permdir/cluster_LML.xml" />
-  <cmd exec="/usr/bin/gzip -c -9 $stepinfile > $permdir/cluster_LML.xml.gz" />
-</step>
-
-</LML_da_workflow>
---------------------------------------------------------------------------------------------
-
-Due to the different call of the driver script this input file is
-batch system related. Therefore, a specific input file for each of the
-supported batch system is provided. 
-
-The advantage of describing the process of generating as a workflow
-is, that is allows to specify more complex workflows which stores for
-example the LML file directly on a web server, store the data in a
-history data base, or split the workflow in different part to execute
-some steps on another server.
-
-A second input file is needed in the last step of the LML data
-generation (LML2LML). This input file (layout) describes the elements
-(tables, ...) which should be generated from the raw LML
-data. 
-
-The following short example shows the layout definition of a table,
-containing the list of running jobs. The layout definition itself is
-also defined according to the LML schema and will also be part of the
-resulting result LML file.
-
-------------------------------------------------------------------------------------------------------
-<tablelayout id="tl_RUN" gid="joblist_RUN">
- <column cid="1" pos="0" width="0.3" active="true" key="totalcores" />
- <column cid="2" pos="1" width="0.2" active="true" key="owner" />
- <column cid="3" pos="2" width="0.2" active="true" key="queue" />
- <column cid="4" pos="3" width="0.1" active="true" key="wall" />
- <column cid="5" pos="5" width="0.1" active="true" key="queuedate" />
- <column cid="6" pos="6" width="0.1" active="true" key="dispatchdate" />
-</tablelayout>
-------------------------------------------------------------------------------------------------------
-
-For each batch system a default layout file is provided defining two
-tables (running and waiting jobs) and the node display. In future
-versions the layout definitions will be part of the request sent from
-the client to LML_da to support dynamic refinement of the view or
-selecting more table rows.
-
-To display the nodes of the system (node display) LML2LML has to know
-the how the system is structured in sets of elements (e.g. in
-rack,nodes,cores, ...). This will be internally used to build a
-hierarchical data structures to storing these elements (tree). For
-some systems these structure is directly given, e.g. IBM Blue Gene/P
-and the position in the tree structure can obtained by evaluating the
-name of the node. For other system, like clusters of SMP node, the
-arrangement of node into racks can typically not be obtained from the
-batch system information. Therefore LML2LML will accept besides the
-layout section of a node display also the scheme part of the node
-display, which describes the physical hierarchy of the system. If this
-scheme is given LML2LML will sort the nodes according this information
-into the tree. If the scheme is not specified (default), LML2LML will
-try to sort the nodes in a two0-level tree, containing nodes in the
-first level and cores in the second level.
-
-Below is shown an example of the scheme definition for Blue Gene/P,
-which spans up a tree of 6 levels.
-
- <scheme>
-      <el1 tagname="row" min="0" max="8" mask="R%01d">
-          <el2 tagname="rack" min="0" max="7" mask="%01d">
-              <el3 tagname="midplane" min="0" max="1" mask="-M%1d">
-                  <el4 tagname="nodecard" min="0" max="15" mask="-N%02d">
-                      <el5 tagname="computecard" min="4" max="35" mask="-C%02d">
-                          <el6 tagname="core" min="0" max="3" mask="-%01d">
-                          </el6>
-                      </el5>
-                  </el4>
-              </el3>
-          </el2>
-      </el1>
- </scheme>
-
-Prerequisites:
---------------
-
-Following Perl modules will be used by LML_da.pl:
-
-- XML::Simple
-- String::Scanf
-
-If these modules are not part of the Perl standard installation, 
-packages could be found at CPAN (http://search.cpan.org/).
-
diff --git a/rms/org.eclipse.ptp.rm.lml.da/build.properties b/rms/org.eclipse.ptp.rm.lml.da/build.properties
deleted file mode 100644
index df0fbca..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-bin.includes = META-INF/,\
-               .,\
-               README.txt,\
-               LML2LML/,\
-               LML_combiner/,\
-               LML_da.pl,\
-               LML_specs/,\
-               lib/,\
-               rms/,\
-               samples/
diff --git a/rms/org.eclipse.ptp.rm.lml.da/lib/LML_da_step.pm b/rms/org.eclipse.ptp.rm.lml.da/lib/LML_da_step.pm
deleted file mode 100644
index 4f5ca27..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/lib/LML_da_step.pm
+++ /dev/null
@@ -1,194 +0,0 @@
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-package LML_da_step;
-
-my $VERSION='1.0';
-my($debug)=0;
-
-use strict;
-use Data::Dumper;
-use XML::Simple;
-use Time::Local;
-use Time::HiRes qw ( time );
-use LML_da_util;
-use LML_da_step_execute;
-
-sub new {
-    my $self    = {};
-    my $proto   = shift;
-    my $class   = ref($proto) || $proto;
-    my $stepdefs     = shift;
-    my $globalvarref = shift;
-    my $verbose = shift;
-    printf("\t LML_da_step: new %s\n",ref($proto)) if($debug>=3);
-    $self->{STEPDEFS}  = $stepdefs;
-    $self->{GLOBALVARS}= $globalvarref;
-    $self->{VERBOSE}   = $globalvarref->{verbose};
-    $self->{TMPDIR}    = $globalvarref->{"tmpdir"};
-    $self->{PERMDIR}   = $globalvarref->{"permdir"};
-    $self->{LASTSTEP}  = "__init__";
-    bless $self, $class;
-    return $self;
-}
-
-sub process {
-    my($self) = shift;
-    my($step,$steprefs,@steplist,%stepstate,$depsteps,$depstep,$stepref,$dostep);
-    my $rc=0;
-    my $loop_done=0;
-    $steprefs=$self->{STEPDEFS};
-    foreach $step (keys(%{$steprefs})) {
-	next if (!exists($steprefs->{$step}->{active}));
-	next if ($steprefs->{$step}->{active}==0);
-	print "LML_da_step: scan step $step active=$steprefs->{$step}->{active}\n" if($self->{VERBOSE});
-	push(@steplist,$step);
-	$stepstate{$step}="do";
-    }
-    push(@steplist,"___endloop___");
-
-    while(@steplist) {
-	$step=shift(@steplist);
-	if($step eq "___endloop___") {
-	    # check if smething happens in this loop
-	    if($loop_done==0) {
-		if(!@steplist) {
-		    print "LML_da_step: all steps processed, leaving\n" if($self->{VERBOSE});
-		    return(1);
-		}
-		print "LML_da_step: something went wrong --> noc action in current cyle of loop, leaving ...\n";
-		return(0);
-	    } else {
-		$loop_done=0;	    
-		push(@steplist,$step);
-	    }
-	    next;
-	}
-	$stepref=$self->{STEPDEFS}->{$step};
-	if($stepref->{exec_after} eq "") {
-	    # no dependency, execute
-	    $rc=$self->execute_step($step);
-	    if($rc) {
-		$stepstate{$step}="failed";
-	    } else {
-		$stepstate{$step}="done";
-	    }
-	    $loop_done++;
-	    next;
-	} 
-	$depsteps=$stepref->{exec_after};
-	$dostep=1;
-	foreach $depstep (split('\s*,\s*',$depsteps)) {
-	    if(!exists($stepstate{$depstep})) {
-		print "LML_da_step: dependency to unknown step ($depstep), leaving ...\n";
-		return(0);
-	    }
-	    print "LML_da_step: step check dependency to step $depstep (=$stepstate{$depstep})\n" if($debug==1);
-	    $dostep=0 if($stepstate{$depstep} ne "done");
-	}
-	if($dostep) {
-	    # dependencies fulfilled, execute
-	    $rc=$self->execute_step($step);
-	    if($rc) {
-		$stepstate{$step}="failed";
-	    } else {
-		$stepstate{$step}="done";
-	    }
-	    $loop_done++;
-	    next;
-	} else {
-	    print "LML_da_step: step $step dependencies not fulfilled ($depsteps) dostep=$dostep loop_done=$loop_done\n"  if($debug==1);
-	    push(@steplist,$step);
-	} 
-	
-    }
-    
-    return($rc);
-
-}
-
-sub execute_step {
-    my($self) = shift;
-    my($step) = shift;
-    my ($stepref);
-    my $rc=0;
-    my $laststep=$self->{LASTSTEP};
-    my $stepinfile=$self->{GLOBALVARS}->{tmpdir}."/datastep_$laststep.xml";
-    my $stepoutfile=$self->{GLOBALVARS}->{tmpdir}."/datastep_$step.xml";
-    printf("EXECUTE_STEP: %-10s\n",$step) if($self->{VERBOSE});
-    printf("              (%-30s->%-30s) ...\n",$stepinfile,$stepoutfile) if($self->{VERBOSE});
-
-    $stepref=$self->{STEPDEFS}->{$step};
-    $self->{GLOBALVARS}->{stepinfile}=$stepinfile;
-    $self->{GLOBALVARS}->{stepoutfile}=$stepoutfile;
-    &LML_da_util::substitute_recursive($stepref,$self->{GLOBALVARS}); 
-
-
-    if(!-f $stepinfile) {
-	printf("execute_step: input file for step not found %-30s ...\n",$stepinfile);
-	if($laststep eq "__init__") {
-	    printf("execute_step: --> generating empty %-30s ...\n",$stepinfile);
-	    system("touch $stepinfile");
-	}
-    }
-
-    if(-f $stepoutfile) {
-	printf("execute_step: unlink output file from previous run %-30s ...\n",$stepoutfile);
-	unlink($stepoutfile);
-    }
-
-    if($stepref->{type} eq "execute") {
-	my $execobj=LML_da_step_execute->new($stepref,$self->{GLOBALVARS});
-	$rc=$execobj->execute();
-    }
-
-    if($stepref->{type} eq "driver_bgp") {
-	my $execobj=LML_da_driver_bgp->new($stepref,$self->{GLOBALVARS});
-	$rc=$execobj->generate_xmlfile();
-    }
-
-    if($stepref->{type} eq "usagedb") {
-	my $execobj=LML_da_usageDB->new($stepref,$self->{GLOBALVARS});
-	$rc=$execobj->update_usagedb();
-    }
-
-    if($stepref->{type} eq "forecast") {
-	my $execobj=LML_da_forecastcaller->new($stepref,$self->{GLOBALVARS});
-	$rc=$execobj->runforecast();
-    }
-
-    if($stepref->{type} eq "historyMGR") {
-	my $execobj=LML_da_historyMGR->new($stepref,$self->{GLOBALVARS});
-	$rc=$execobj->store();
-    }
-
-    if($stepref->{type} eq "put") {
-	my $execobj=LML_da_put->new($stepref,$self->{GLOBALVARS});
-	$rc=$execobj->put();
-    }
-
-    if($stepref->{type} eq "LMLconvert") {
-	my $execobj=LML_da_convert2LMLcaller->new($stepref,$self->{GLOBALVARS});
-	$rc=$execobj->runconvert();
-    }
-
-    if(! -f $stepoutfile) {
-	printf("execute_step: output file not generated by step, renaming input file to %-30s ...\n",$stepoutfile);
-	rename($stepinfile,$stepoutfile);
-    }
-
-    $self->{GLOBALVARS}->{stepinfile}="";
-    $self->{GLOBALVARS}->{stepoutfile}="";
-
-    $self->{LASTSTEP} = $step;
-    return($rc);
-}
-
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/lib/LML_da_step_execute.pm b/rms/org.eclipse.ptp.rm.lml.da/lib/LML_da_step_execute.pm
deleted file mode 100644
index 6fa894a..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/lib/LML_da_step_execute.pm
+++ /dev/null
@@ -1,64 +0,0 @@
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-package LML_da_step_execute;
-
-my $VERSION='$Revision: 1.00 $';
-my($debug)=0;
-
-use strict;
-use Data::Dumper;
-use XML::Simple;
-use Time::Local;
-use Time::HiRes qw ( time );
-use LML_da_util;
-
-sub new {
-    my $self    = {};
-    my $proto   = shift;
-    my $class   = ref($proto) || $proto;
-    my $stepdef      = shift;
-    my $globalvarref = shift;
-    printf("\t LML_da_step: new %s\n",ref($proto)) if($debug>=3);
-    $self->{STEPDEF}   = $stepdef;
-    $self->{GLOBALVARS}= $globalvarref;
-    $self->{VERBOSE}   = $globalvarref->{verbose};
-    $self->{TMPDIR}    = $globalvarref->{"tmpdir"};
-    $self->{PERMDIR}   = $globalvarref->{"permdir"};
-    bless $self, $class;
-    return $self;
-}
-
-sub execute {
-    my($self) = shift;
-    my($file,$newfile)=@_;
-    my($cmd,$cmdref);
-    my($tstart,$tdiff);
-    my $rc=0;
-    my $step=$self->{STEPDEF}->{id};
-    my $stepref=$self->{STEPDEF};
-
-#    print Dumper($stepref);
-
-    foreach $cmdref (@{$self->{STEPDEF}->{cmd}}) {
-	$cmd=$cmdref->{exec};
-	printf  "LML_da_step_execute: executing: %s ...\n",$cmd if($self->{VERBOSE});
-	$tstart=time;
-        system($cmd);$rc=$?;
-	$tdiff=time-$tstart;
-	printf  "LML_da_step_execute:            %60s -> ready, time used %10.4ss\n","",$tdiff if($self->{VERBOSE});
-        if($rc) {     printf STDERR "failed executing: %s rc=%d\n",$cmd,$rc; return(-1);}
-    }
-    return($rc);
-}
-
-
-
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/lib/LML_da_util.pm b/rms/org.eclipse.ptp.rm.lml.da/lib/LML_da_util.pm
deleted file mode 100644
index e6b77c2..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/lib/LML_da_util.pm
+++ /dev/null
@@ -1,314 +0,0 @@
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-
-package LML_da_util;
-use Time::Local;
-my $debug=0;
-use Data::Dumper;
-
-# SUPPORT FUNCTIONS
-###################
-sub init_globalvar {
-    my($vardefsref,$varhashref)=@_;
-    my($pairref,$key,$value);
-    
-    foreach $pairref (@{$vardefsref->{var}}) {
-	$key=$pairref->{key};
-	$value=$pairref->{value};
-	&substitute(\$value,$varhashref);
-	print "init_globalvar: $key -> $value\n" if($debug==1);
-	$varhashref->{$key}=$value;
-    }
-    
-    return(1);
-}
-
-sub substitute_recursive {
-    my($ds,$varhashref)=@_;
-    my($i);
-#    print "substitute_recursive: ",ref($ds),"\n";
-#    print "substitute_recursive: ",Dumper($ds),"\n";
-    
-    if(ref($ds) eq "HASH") {
-	foreach $key (keys(%{$ds})) {
-#	    print "substitute_recursive: HASH -> $key\n";
-	    if(ref($ds->{$key})) {
-		&substitute_recursive($ds->{$key},$varhashref);
-	    } else {
-		&substitute(\$ds->{$key},$varhashref);
-	    }
-	}
-    } elsif(ref($ds) eq "ARRAY") {
-	for($i=0;$i<=$#{$ds};$i++) {
-#	    print "substitute_recursive: ARRAY\n";
-	    if(ref($ds->[$i])) {
-		&substitute_recursive($ds->[$i],$varhashref);
-	    } else {
-		&substitute(\$ds->[$i],$varhashref);
-	    }
-	}
-    } else {
-	    print "substitute_recursive: unknown type ",ref($ds),"\n";
-    }
-    return(1);
-}
-
-sub substitute {
-    my($strref,$hashref)=@_;
-    my($found,$c,@varlist1,@varlist2,$var);
-    my($SUBSTITUTE_NOTFOUND);
-    $c=0;
-    $found=0;
-
-    return(0) if($$strref eq "");
-
-    # search normal variables
-    @varlist1=($$strref=~/\$([^\{\[\$\\\s\.\,\*\/\+\-\\\`\(\)\'\?\:\;\}]+)/g);
-    foreach $var (sort {length($b) <=> length($a)} (@varlist1)) {
-	if(exists($hashref->{$var})) {
-	    my $val=$hashref->{$var};
-	    $$strref=~s/\$$var/$val/egs;
-	    printf("                      substitute var1: %s = %s\n",$var,$val) if ($debug==1);
-	    $found=1;
-	}
-    }
-
-    # search variables in following form: ${name}
-    @varlist2=($$strref=~/\$\{([^\{\[\$\\\s\.\,\*\/\+\-\\\`\(\)\'\?\:\;\}]+)\}/g);
-    foreach $var (sort {length($b) <=> length($a)} (@varlist2)) {
-	if(exists($hashref->{$var})) {
-	    my $val=$hashref->{$var};
-	    $$strref=~s/\$\{$var\}/$val/egs;
-	    printf("                      substitute var2: %s = %s\n",$var,$val) if ($debug==1);
-	    $found=1;
-	} 
-    }
-
-    # search eval strings (`...`)
-    while($$strref=~/^(.*)(\`(.*?)\`)(.*)$/) {
-	my ($before,$evalall,$evalstr,$after)=($1,$2,$3,$4);
-	my($val,$executeval);
-        $val=undef;
-
-        if($evalstr=~/^\s*getstdout\((.*)\)\s*$/) {
-            $executeval=$1;
-	    eval("{\$val=`$executeval`}");
-            $val=~s/\n/ /gs;
-        } 
-	if(!defined($val)) {
-	    eval("{\$val=$evalstr;}");
-	}
-	if(!defined($val)) {
-	    $val=eval("{$evalstr;}");
-	}
-	$val="" if(!defined($val));
-	if($val ne "") {
-	    $$strref=$before.$val.$after;
-	} else {
-	    last;
-	}
-	printf("                      eval %s -> %s >%s<\n",$val,$$strref,$evalall) if ($debug==1);
-    }
-
-    # search for variables which could not be substitute
-    @varlist1=($$strref=~/\$([^\{\[\$\\\s\.\,\*\/\+\-\\\`\(\)\'\?\:\;\}]+)/g);
-    @varlist2=($$strref=~/\$\{([^\{\[\$\\\s\.\,\*\/\+\-\\\`\(\)\'\?\:\;\}]+)\}/g);
-    if ( (@varlist1) || (@varlist2) ) {
-	$SUBSTITUTE_NOTFOUND=join(',',@varlist1,@varlist2);
-	$found=-1;
-	printf("                      unknown vars in %s: %s\n",$$strref,$SUBSTITUTE_NOTFOUND);
-    }
-    return($found);
-}
-
-
-# UTILITY FUNCTIONS
-###################
-
-sub cp_file {
-    my($from,$to,$verbose)=@_;
-    my $cmd="/bin/cp $from $to";
-    printf STDERR "executing: %s\n",$cmd if($verbose);
-    system($cmd);$rc=$?;
-    if($rc) {     printf STDERR "failed executing: %s rc=%d\n",$cmd,$rc; exit(-1);}
-    return($rc);
-}
-
-sub sec_to_date {
-    my ($lsec)=@_;
-    my($date);
-    my ($sec,$min,$hours,$mday,$mon,$year,$rest)=localtime($lsec);
-    $year=sprintf("%02d",$year % 100);
-    $mon++;
-    $date=sprintf("%02d/%02d/%02d-%02d:%02d:%02d",$mon,$mday,$year,$hours,$min,$sec);
-#    print "WF: sec_to_date $lsec -> sec=$sec,min=$min,hours=$hours,mday=$mday,mon=$mon,year=$year -> $date\n";
-    return($date);
-}
-
-sub sec_to_date2 {
-    my ($lsec)=@_;
-    my($date);
-    my ($sec,$min,$hours,$mday,$mon,$year,$rest)=localtime($lsec);
-    $mon++;
-    $year+=1900;
-    $date=sprintf("%02d.%02d.%4d",$mday,$mon,$year);
-#    print "WF: sec_to_date $lsec -> sec=$sec,min=$min,hours=$hours,mday=$mday,mon=$mon,year=$year -> $date\n";
-    return($date);
-}
-
-sub sec_to_day {
-    my ($lsec)=@_;
-    my($wdaystr);
-    my ($sec,$min,$hours,$mday,$mon,$year,$wday,$rest)=localtime($lsec);
-    $wdaystr=("Su","Mo","Tu","We","Th","Fr","Sa")[$wday];
-#    print "WF: sec_to_day $lsec -> sec=$sec,min=$min,hours=$hours,mday=$mday,mon=$mon,year=$year -> wday=$wday wdaystr=$wdaystr\n";
-    return($wday);
-}
-
-sub sec_to_month {
-    my ($lsec)=@_;
-    my ($sec,$min,$hours,$mday,$mon,$year,$wday,$rest)=localtime($lsec);
-    return($mon);
-}
-
-sub timediff {
-    my ($date1,$date2)=@_;
-#    print"WF: timediff $date1 $date2\n";
-    my $timesec1=&date_to_sec($date1);
-    my $timesec2=&date_to_sec($date2);
-    return($timesec1-$timesec2);
-}
-
-sub date_to_sec3 {
-    my ($ldate)=@_;
-    my ($mday,$mon,$year,$hours,$min,$sec)=split(/[ \.:\/\-\_\.]/,$ldate);
-    $hours=$min=$sec=0;
-    $mon--;
-#    print caller(),"\n";
-    my $timesec=timelocal($sec,$min,$hours,$mday,$mon,$year);
-#    print "WF: date_to_sec3 $date -> sec=$sec,min=$min,hours=$hours,mday=$mday,mon=$mon,year=$year -> $timesec\n";
-    return($timesec);
-}
-
-sub date_to_sec {
-    my ($ldate)=@_;
-    my ($mon,$mday,$year,$hours,$min,$sec)=split(/[ :\/\-\_\.]/,$ldate);
-    $mon--;
-    my $timesec=timelocal($sec,$min,$hours,$mday,$mon,$year);
-#   print "WF: date_to_sec $ldate -> sec=$sec,min=$min,hours=$hours,mday=$mday,mon=$mon,year=$year -> $timesec\n";
-    return($timesec);
-}
-
-sub date_to_sec_job {
-    my ($ldate)=@_;
-    my ($mday,$mon,$year,$hours,$min,$sec)=split(/[ :\/\-\_\.]/,$ldate);
-    $mon--;
-    my $timesec=timelocal($sec,$min,$hours,$mday,$mon,$year);
-#   print "WF: date_to_sec $ldate -> sec=$sec,min=$min,hours=$hours,mday=$mday,mon=$mon,year=$year -> $timesec\n";
-    return($timesec);
-}
-
-sub date_to_sec2 {
-    my ($ldate)=@_;
-    my ($mday,$mon,$year)=split(/[ :\/\-\.\_]/,$ldate);
-    $mon--;
-    if($mon<0) {  
-	$mon=0;$year=0;$mday=1;
-#	print "WF: date_to_sec >$ldate< -> sec=$sec,min=$min,hours=$hours,mday=$mday,mon=$mon,year=$year -> $timesec\n";
-#	print caller();
-    }
-    my $timesec=timelocal(0,0,0,$mday,$mon,$year);
-#    print "WF: date_to_sec $ldate -> sec=$sec,min=$min,hours=$hours,mday=$mday,mon=$mon,year=$year -> $timesec\n";
-    return($timesec);
-}
-
-# $dpm Tage pro Monat
-sub timediff_md {
-    my ($timesec1,$timesec2)=@_;
-    my @days=(31,28,31,30,31,30,31,31,30,31,30,31);
-    my($diffm,$difft);
-    my ($sec1,$min1,$hours1,$mday1,$mon1,$year1,$wday1,$rest1)=localtime($timesec1);
-    my ($sec2,$min2,$hours2,$mday2,$mon2,$year2,$wday2,$rest2)=localtime($timesec2);
-    my($m1,$m2)=($mon1+12*$year1,$mon2+12*$year2);
-    if($m1==$m2) {
-	$diffm=0;
-	$difft=($mday2-$mday1+1) * $dpm/$days[$mon1];
-    } else {
-	$diffm=$m2-$m1+1;
-	if($mday1!=1) {
-	    $difft=-($mday1) * $dpm/$days[$mon1];
-#	    print "WF: mday1 $difft\n";
-	} else {$difft=0}
-
-	if($mday2!=$days[$mon2]) {
-	    $difft+= -($days[$mon2]-$mday2+1) * $dpm/$days[$mon2];
-#	    print "WF: mday2 $difft\n";
-	}
-	if($difft<0) {
-	    $diffm+=int($difft/$dpm-1);
-	    $difft+= -$dpm*int($difft/$dpm-1);
-	}
-    }
-#   print "WF timediff_md: $m1,$m2 $year1,$year2 $mday1,$mday2 ($diffm,$difft)\n";
-    return($diffm,$difft);
-}
-
-sub date_to_absmonth {
-    my ($ldate)=@_;
-    my $absmonth=-1;
-    my ($mday,$mon,$year);
-    if($ldate) {
-	($mday,$mon,$year)=split(/[ :\/\-\.\_]/,$ldate);
-	$absmonth=$mon-1;
-	$year-=2000 if($year>=2000);
-	$absmonth+=(12*$year);
-    }
-    return($absmonth);
-}
-
-sub absmonth_to_date {
-    my ($absmonth)=@_;
-    my($ldate,$mday,$mon,$year);
-    $year=int($absmonth/12);
-    $mon=$absmonth-$year*12 + 1;
-    $year+=2000;
-    $mday=01;
-    $ldate=sprintf("%02d.%02d.%4d",$mday,$mon,$year);
-    return($ldate);
-}
-
-sub absmonth_to_mname {
-    my ($absmonth)=@_;
-    my($mname,$mon,$year);
-    $year=int($absmonth/12);
-    $mon=$absmonth-$year*12 + 1;
-    $mname=("","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")[$mon];
-    $mname.=sprintf("%02d",$year);
-    return($mname);
-}
-
-sub unify_string {
-    my($lineref)=@_;
-    my $data=$$lineref;
-    $data=~s/\xe1/a/gs;
-    $data=~s/\xe4/ae/gs;
-    $data=~s/\xfc/ue/gs;
-    $data=~s/\xf6/oe/gs;
-    $data=~s/\xf3/o/gs;
-    $data=~s/\xc1/A/gs;
-    $data=~s/\xd6/Oe/gs;
-    $data=~s/\xdf/ss/gs;
-#   print "unify_line: '$$lineref' -> '$data'\n" if($data=~/Ir/);
-    $$lineref=$data;
-}
-
-
-1;
diff --git a/rms/org.eclipse.ptp.rm.lml.da/rms/LL/da_jobs_info_LML.pl b/rms/org.eclipse.ptp.rm.lml.da/rms/LL/da_jobs_info_LML.pl
deleted file mode 100755
index 9484e14..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/rms/LL/da_jobs_info_LML.pl
+++ /dev/null
@@ -1,286 +0,0 @@
-#!/usr/bin/perl -w
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-use strict;
-
-my $patint="([\\+\\-\\d]+)";   # Pattern for Integer number
-my $patfp ="([\\+\\-\\d.E]+)"; # Pattern for Floating Point number
-my $patwrd="([\^\\s]+)";       # Pattern for Work (all noblank characters)
-my $patbl ="\\s+";             # Pattern for blank space (variable length)
-
-#####################################################################
-# get user info / check system 
-#####################################################################
-my $UserID = getpwuid($<);
-my $Hostname = `hostname`;
-my $verbose=1;
-my ($line,%jobs,%jobnr,$key,$value,$count,%notmappedkeys,%notfoundkeys);
-
-#unless( ($Hostname =~ /jugenes\d/) && ($UserID =~ /llstat/) ) {
-#  die "da_jobs_info_LML.pl can only be used as llstat on jugenesX!";
-#}
-
-#####################################################################
-# get command line parameter
-#####################################################################
-if ($#ARGV != 0) {
-  die " Usage: $0 <filename> $#ARGV\n";
-}
-my $filename = $ARGV[0];
-
-my $system_sysprio=-1;
-my $maxtopdogs=-1;
-
-my %mapping = (
-    "Account"                                => "",
-    "Adapter_Requirement"                    => "",
-    "Allocated_Host"                         => "nodelist",
-    "Args"                                   => "",
-    "As_Hard_Limit"                          => "",
-    "As_Soft_Limit"                          => "",
-    "BG_Partition_State"                     => "bgp_state",
-    "BG_Partition_Type"                      => "bgp_type",
-    "BG_Requirements"                        => "",
-    "Base_Partition_List"                    => "nodelist",
-    "Blue_Gene_Job_Id"                       => "",
-    "Blue_Gene_Status"                       => "",
-    "Bulk_Transfer"                          => "",
-    "Checkpoint_File"                        => "",
-    "Checkpointable"                         => "",
-    "Ckpt_Accum_Time"                        => "",
-    "Ckpt_Elapse_Time"                       => "",
-    "Ckpt_Execute_Dir"                       => "",
-    "Ckpt_Hard_Limit"                        => "",
-    "Ckpt_Soft_Limit"                        => "",
-    "Ckpt_Start_Time"                        => "",
-    "Class"                                  => "queue",
-    "Cluster_Option"                         => "",
-    "Cmd"                                    => "",
-    "Comment"                                => "comment",
-    "Completion_Code"                        => "",
-    "Completion_Date"                        => "",
-    "Core_Hard_Limit"                        => "",
-    "Core_Soft_Limit"                        => "",
-    "Coschedule"                             => "",
-    "Cpu_Hard_Limit"                         => "",
-    "Cpu_Soft_Limit"                         => "",
-    "Cpus_Per_Core"                          => "",
-    "Data_Hard_Limit"                        => "",
-    "Data_Soft_Limit"                        => "",
-    "Data_Stg_Dependency"                    => "",
-    "Dependency"                             => "dependency",
-    "Dispatch_Time"                          => "dispatchdate",
-    "Env"                                    => "",
-    "Err"                                    => "",
-    "Error_Text"                             => "",
-    "Fail_Ckpt_Time/Date"                    => "",
-    "Favored_Job"                            => "favored",
-    "File_Hard_Limit"                        => "",
-    "File_Soft_Limit"                        => "",
-    "Good_Ckpt_Time/Date"                    => "",
-    "Hold_Job_Until"                         => "",
-    "IONodes_Per_BP"                         => "",
-    "In"                                     => "",
-    "Initial_Working_Dir"                    => "",
-    "Job_Name"                               => "name",
-    "Job_Queue_Key"                          => "",
-    "Job_Step_Id"                            => "step",
-    "Large_Page"                             => "",
-    "LoadLeveler_Group"                      => "group",
-    "Locks_Hard_Limit"                       => "",
-    "Locks_Soft_Limit"                       => "",
-    "Max_Processors"                         => "",
-    "Mcm_Affinity_Option"                    => "",
-    "Memlock_Hard_Limit"                     => "",
-    "Memlock_Soft_Limit"                     => "",
-    "MetaCluster_Job"                        => "",
-    "Min_Processors"                         => "",
-    "Negotiator_Messages"                    => "",
-    "Node_Resources"                         => "",
-    "Node_Usage"                             => "",
-    "Nofile_Hard_Limit"                      => "",
-    "Nofile_Soft_Limit"                      => "",
-    "Notifications"                          => "",
-    "Notify_User"                            => "",
-    "Nproc_Hard_Limit"                       => "",
-    "Nproc_Soft_Limit"                       => "",
-    "Out"                                    => "",
-    "Outbound_Schedds"                       => "",
-    "Owner"                                  => "owner",
-    "Parallel_Threads"                       => "",
-    "Partition_Allocated"                    => "bgp_partalloc",
-    "Partition_Requested"                    => "bgp_partreq",
-    "Preempt_Wait_Count"                     => "",
-    "Preemptable"                            => "",
-    "Preferences"                            => "",
-    "Previous_q_sysprio"                     => "",
-    "Queue_Date"                             => "queuedate",
-    "RSet"                                   => "",
-    "Recurring"                              => "",
-    "Requested_Cluster"                      => "",
-    "Requested_Res._ID"                      => "",
-    "Requirements"                           => "",
-    "Reservation_ID"                         => "",
-    "Resources"                              => "",
-    "Restart"                                => "restart",
-    "Restart_From_Ckpt"                      => "",
-    "Restart_Same_Nodes"                     => "",
-    "Rotate"                                 => "",
-    "Rss_Hard_Limit"                         => "",
-    "Rss_Soft_Limit"                         => "",
-    "SMT_required"                           => "",
-    "Schedd_History"                         => "",
-    "Schedd_Host"                            => "",
-    "Scheduling_Cluster"                     => "",
-    "Sending_Cluster"                        => "",
-    "Shell"                                  => "",
-    "Stack_Hard_Limit"                       => "",
-    "Stack_Soft_Limit"                       => "",
-    "Status"                                 => "state",
-    "Step_Adapter_Memory"                    => "",
-    "Step_Cpu_Hard_Limit"                    => "",
-    "Step_Cpu_Soft_Limit"                    => "",
-    "Step_Cpus"                              => "",
-    "Step_Large_Page_Mem"                    => "",
-    "Step_Name"                              => "",
-    "Step_Real_Memory"                       => "",
-    "Step_Type"                              => "",
-    "Step_Virtual_Memory"                    => "",
-    "Structure_Version"                      => "",
-    "Submitting_Cluster"                     => "",
-    "Submitting_Host"                        => "",
-    "Submitting_User"                        => "",
-    "System_Priority"                        => "",
-    "Task_Affinity"                          => "",
-    "Unix_Group"                             => "",
-    "User_Hold_Time"                         => "",
-    "User_Priority"                          => "",
-    "Virtual_Image_Size"                     => "",
-    "Wall_Clk_Hard_Limit"                    => "wall",
-    "Wall_Clk_Soft_Limit"                    => "wallsoft",
-    "Wiring_Allocated"                       => "",
-    "Wiring_Requested"                       => "",
-    "class_sysprio"                          => "classprio",
-    "group_sysprio"                          => "groupprio",
-    "q_sysprio"                              => "",
-    "user_sysprio"                           => "userprio",
-    "Allocated_Hosts"                        => "",
-    "Exec_Args"                              => "",
-    "Executable"                             => "",
-    "Mcm_Affinity_Options"                   => "",
-    "Name"                                   => "",
-    "Node_actual"                            => "",
-    "Node_maximum"                           => "",
-    "Node_minimum"                           => "",
-    "Num_Task_Inst"                          => "",
-    "Step_rCxt_Blocks"                       => "",
-    "TaskInstances"                          => "nodelist",
-    "TaskInstances"                          => "nodelist",
-    );
-
-open(IN,"llq -l |");
-my $jobid="-";
-my $lastkey="-";
-my (%nodelastcorenumber);
-while($line=<IN>) {
-    chomp($line);
-    next if ($line=~/^\-+$/);
-    last if($line=~/There is currently no job step to report/);
-
-    if($line=~/^\s*Task Instance[:]\s*$patwrd[:]$patint/) {
-	my($host,$num)=($1,$2);
-	$nodelastcorenumber{$host}=0 if(!exists($nodelastcorenumber{$host}));
-	if($num>=0) {
-	    $jobs{$jobid}{TaskInstances}.="($host,".$nodelastcorenumber{$host}.")";
-	    $nodelastcorenumber{$host}++;
-	}
-    } elsif($line=~/^=+ Job Step $patwrd =+/) {
-	$jobid=$1;
-    } elsif($line=~/^\s*([^\:]+): (.*)$/) {
-	($key,$value)=($1,$2);
-	$key=~s/\s+$//gs;
-	$key=~s/\s/_/gs;
-	$lastkey=$key;
-	$jobs{$jobid}{$key}=$value;
-    } else {
-	$line=~s/^\s*//gs;
-	$jobs{$jobid}{$lastkey}.=",$line";
-    }
-
-}
-close(IN);
-
-open(OUT,"> $filename") || die "cannot open file $filename";
-printf(OUT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-printf(OUT "<lml:lgui xmlns:lml=\"http://www.llview.de\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
-printf(OUT "	xsi:schemaLocation=\"http://www.llview.de lgui.xsd\"\n");
-printf(OUT "	version=\"0.7\"\>\n");
-printf(OUT "<objects>\n");
-$count=0;
-foreach $jobid (sort(keys(%jobs))) {
-    $count++;$jobnr{$jobid}=$count;
-    printf(OUT "<object id=\"j%06d\" name=\"%s\" type=\"job\"/>\n",$count,$jobid);
-}
-printf(OUT "</objects>\n");
-printf(OUT "<information>\n");
-foreach $jobid (sort(keys(%jobs))) {
-    printf(OUT "<info oid=\"j%06d\" type=\"short\">\n",$jobnr{$jobid});
-    foreach $key (sort(keys(%{$jobs{$jobid}}))) {
-	if(exists($mapping{$key})) {
-	    if($mapping{$key} ne "") {
-		$value=&modify($key,$mapping{$key},$jobs{$jobid}{$key});
-		if($value) {
-		    printf(OUT " <data %-20s value=\"%s\"/>\n","key=\"".$mapping{$key}."\"",$value);
-		}
-	    } else {
-		$notmappedkeys{$key}++;
-	    }
-	} else {
-	    $notfoundkeys{$key}++;
-	}
-    }
-    printf(OUT "</info>\n");
-}
-printf(OUT "</information>\n");
- 
-printf(OUT "</lml:lgui>\n");
-
-close(OUT);
-
-foreach $key (sort(keys(%notfoundkeys))) {
-#    printf("not found key %-40s: %6d times\n",$key,$notfoundkeys{$key});
-    printf("%-40s => \"\",\n","\"".$key."\"",$notfoundkeys{$key});
-}
-
-
-
-sub modify {
-    my($key,$mkey,$value)=@_;
-    my $ret=$value;
-
-    if(($mkey eq "wall") || ($mkey eq "wallsoft")) {
-	if($value=~/\($patint seconds\)/) {
-	    $ret=$1;
-	}
-	if($value=~/$patint minutes/) {
-	    $ret=$1*60;
-	}
-    }
-
-    if(($mkey eq "comment")) {
-	$ret=~s/\"//gs;
-    }
-    if(($mkey eq "bgp_state")) {
-	$ret=~s/\<unknown\>/unknown/gs;
-    }
-
-    return($ret);
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.da/rms/LL/da_nodes_info_LML.pl b/rms/org.eclipse.ptp.rm.lml.da/rms/LL/da_nodes_info_LML.pl
deleted file mode 100755
index 66e2022..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/rms/LL/da_nodes_info_LML.pl
+++ /dev/null
@@ -1,246 +0,0 @@
-#!/usr/bin/perl -w
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-use strict;
-
-my $patint="([\\+\\-\\d]+)";   # Pattern for Integer number
-my $patfp ="([\\+\\-\\d.E]+)"; # Pattern for Floating Point number
-my $patwrd="([\^\\s]+)";       # Pattern for Work (all noblank characters)
-my $patbl ="\\s+";             # Pattern for blank space (variable length)
-
-#####################################################################
-# get user info / check system 
-#####################################################################
-my $UserID = getpwuid($<);
-my $Hostname = `hostname`;
-my $verbose=1;
-my ($line,%nodes,%nodenr,$key,$value,$count,%notmappedkeys,%notfoundkeys);
-
-#unless( ($Hostname =~ /jugenes\d/) && ($UserID =~ /llstat/) ) {
-#  die "da_nodes_info_LML.pl can only be used as llstat on jugenesX!";
-#}
-
-#####################################################################
-# get command line parameter
-#####################################################################
-if ($#ARGV != 0) {
-  die " Usage: $0 <filename> $#ARGV\n";
-}
-my $filename = $ARGV[0];
-
-my $system_sysprio=-1;
-my $maxtopdogs=-1;
-
-my %mapping = (
-
-    "Adapter"                                => "",
-    "Arch"                                   => "",
-    "AvailableClasses"                       => "",
-    "CONTINUE"                               => "",
-    "Completed"                              => "",
-    "ConfigTimeStamp"                        => "",
-    "ConfiguredClasses"                      => "",
-    "ConsumableResources"                    => "",
-    "Cpus"                                   => "ncores",
-    "CustomMetric"                           => "",
-    "Disk"                                   => "",
-    "DrainedClasses"                         => "",
-    "DrainingClasses"                        => "",
-    "EnteredCurrentState"                    => "",
-    "FabricConnectivity"                     => "",
-    "Feature"                                => "",
-    "FreeLargePageMemory"                    => "",
-    "FreeRealMemory"                         => "availmem",
-    "Held"                                   => "",
-    "Idle"                                   => "",
-    "KILL"                                   => "",
-    "KeyboardIdle"                           => "",
-    "LargePageMemory"                        => "",
-    "LargePageSize"                          => "",
-    "LoadAvg"                                => "",
-    "MACHPRIO"                               => "",
-    "MasterMachPriority"                     => "",
-    "Max_Dstg_Starters"                      => "",
-    "Max_Starters"                           => "",
-    "Mcms"                                   => "",
-    "Memory"                                 => "physmem",
-    "Name"                                   => "",
-    "OpSys"                                  => "",
-    "PagesFreed"                             => "",
-    "PagesPagedIn"                           => "",
-    "PagesPagedOut"                          => "",
-    "PagesScanned"                           => "",
-    "Pending"                                => "",
-    "Pool"                                   => "",
-    "Prestarted_Starters"                    => "",
-    "RSetSupportType"                        => "",
-    "Removed"                                => "",
-    "RemovedPending"                         => "",
-    "Reservations"                           => "",
-    "SMT"                                    => "",
-    "START"                                  => "",
-    "SUSPEND"                                => "",
-    "SYSPRIO"                                => "",
-    "ScheddAvail"                            => "",
-    "ScheddRunning"                          => "",
-    "ScheddState"                            => "",
-    "Speed"                                  => "",
-    "StartdAvail"                            => "",
-    "Starting"                               => "",
-    "State"                                  => "state",
-    "Subnet"                                 => "",
-    "TimeStamp"                              => "",
-    "Tmp"                                    => "",
-    "TotalJobs"                              => "",
-    "Unexpanded"                             => "",
-    "VACATE"                                 => "",
-    "VirtualMemory"                          => "",
-    "id"                                     => "id",
-# unknown attributes
-    );
-
-open(IN," llstatus -l |");
-my $nodeid="-";
-my $lastkey="-";
-
-
-while($line=<IN>) {
-    chomp($line);
-    next if ($line=~/^\-+$/);
-    next if ($line=~/^\=+$/);
-
-    if($line=~/^\s*Machine\s*[=]\s*$patwrd/) {
-	$nodeid=$1;
-	$nodeid=~s/\..*$//gs;  # remove domain
-	$nodes{$nodeid}{id}=$nodeid;
-#	print "line $line\n";
-    } elsif($line=~/^\s*([^\=\s]+)\s+\=\s+(.*)$/) {
-	($key,$value)=($1,$2);
-	$key=~s/\s/_/gs;
-	$lastkey=$key;
-	$nodes{$nodeid}{$key}=$value;
-    } else {
-	$line=~s/^\s*//gs;
-	$nodes{$nodeid}{$lastkey}.=$line;
-    }
-}
-close(IN);
-
-# add unknown but manatory attributes to nodes
-foreach $nodeid (keys(%nodes)) {
-    my($key,$value,$pair);
-    if(exists($nodes{$nodeid}{status})) {
-	foreach $pair (split(/,/,$nodes{$nodeid}{status})) {
-	    ($key,$value)=split(/=/,$pair);
-	    $nodes{$nodeid}{$key}=$value;
-	}
-    } 
-
-}
-
-open(OUT,"> $filename") || die "cannot open file $filename";
-printf(OUT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-printf(OUT "<lml:lgui xmlns:lml=\"http://www.llview.de\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
-printf(OUT "	xsi:schemaLocation=\"http://www.llview.de lgui.xsd\"\n");
-printf(OUT "	version=\"0.7\"\>\n");
-printf(OUT "<objects>\n");
-$count=0;
-foreach $nodeid (sort(keys(%nodes))) {
-    $count++;$nodenr{$nodeid}=$count;
-    printf(OUT "<object id=\"nd%06d\" name=\"%s\" type=\"node\"/>\n",$count,$nodeid);
-}
-printf(OUT "</objects>\n");
-printf(OUT "<information>\n");
-foreach $nodeid (sort(keys(%nodes))) {
-    printf(OUT "<info oid=\"nd%06d\" type=\"short\">\n",$nodenr{$nodeid});
-    foreach $key (sort(keys(%{$nodes{$nodeid}}))) {
-	if(exists($mapping{$key})) {
-	    if($mapping{$key} ne "") {
-		$value=&modify($key,$mapping{$key},$nodes{$nodeid}{$key});
-		if($value) {
-		    printf(OUT " <data %-20s value=\"%s\"/>\n","key=\"".$mapping{$key}."\"",$value);
-		}
-	    } else {
-		$notmappedkeys{$key}++;
-	    }
-	} else {
-	    $notfoundkeys{$key}++;
-	}
-    }
-    printf(OUT "</info>\n");
-}
-printf(OUT "</information>\n");
- 
-printf(OUT "</lml:lgui>\n");
-
-close(OUT);
-
-foreach $key (sort(keys(%notfoundkeys))) {
-    printf("%-40s => \"\",\n","\"".$key."\"",$notfoundkeys{$key});
-}
-
-
-
-sub modify {
-    my($key,$mkey,$value)=@_;
-    my $ret=$value;
-
-    if($mkey eq "owner") {
-	$ret=~s/\@.*//gs;
-    }
-
-    if($mkey eq "state") {
-	$ret="Running"  if ($value eq "Running");
-	$ret="Down"     if ($value eq "Down");
-	$ret="Idle"     if ($value eq "Idle");
-	$ret="unknown"  if ($value eq "unknown");
-    }
-
-    if(($mkey eq "wall") || ($mkey eq "wallsoft")) {
-	if($value=~/\($patint seconds\)/) {
-	    $ret=$1;
-	}
-	if($value=~/$patint minutes/) {
-	    $ret=$1*60;
-	}
-	if($value=~/^$patint[:]$patint[:]$patint$/) {
-	    $ret=$1*60*60+$2*60+$3;
-	}
-    }
-
-    if($mkey eq "nodelist") {
-	if($ret ne "-") {
-	    $ret=~s/\//,/gs;
-	    my @nodes = split(/\+/,$ret);
-	    $ret="(".join(')(',@nodes).")";
-	}
-    }
-
-    if($mkey eq "totalcores") {
-	if($ret=~/$patint[:]ppn=$patint/) {
-	    $ret=$1*$2;
-	}
-    }
-    if($mkey eq "totaltasks") {
-	if($ret=~/$patint[:]ppn=$patint/) {
-	    $ret=$1*$2;
-	}
-    }
-
-    if(($mkey eq "comment")) {
-	$ret=~s/\"//gs;
-    }
-    if(($mkey eq "bgp_state")) {
-	$ret=~s/\<unknown\>/unknown/gs;
-    }
-
-    return($ret);
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.da/rms/LL/da_system_info_LML.pl b/rms/org.eclipse.ptp.rm.lml.da/rms/LL/da_system_info_LML.pl
deleted file mode 100755
index ccc2b6b..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/rms/LL/da_system_info_LML.pl
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/perl -w
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-use strict;
-
-use lib ".";
-
-my $patint="([\\+\\-\\d]+)";   # Pattern for Integer number
-my $patfp ="([\\+\\-\\d.E]+)"; # Pattern for Floating Point number
-my $patwrd="([\^\\s]+)";       # Pattern for Work (all noblank characters)
-my $patbl ="\\s+";             # Pattern for blank space (variable length)
-
-#####################################################################
-# get user sysinfo / check system 
-#####################################################################
-my $UserID = getpwuid($<);
-my $Hostname = `hostname`;
-chomp($Hostname);
-my $verbose=1;
-
-my $filename = $ARGV[0];
-
-my %mapping = (
-    "hostname"                                  => "hostname",
-    "date"                                      => "system_time",
-    "type"                                      => "type",
-    );
-
-my ($sysinfoid,$line,%sysinfo,%sysinfonr,$key,$value,$count,%notmappedkeys,%notfoundkeys);
-
-$sysinfoid="jugene";
-$sysinfo{$sysinfoid}{hostname}=$Hostname;
-$sysinfo{$sysinfoid}{date}=&get_current_date();
-$sysinfo{$sysinfoid}{type}="Cluster";
-
-open(OUT,"> $filename") || die "cannot open file $filename";
-printf(OUT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-printf(OUT "<lml:lgui xmlns:lml=\"http://www.llview.de\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
-printf(OUT "	xsi:schemaLocation=\"http://www.llview.de lgui.xsd\"\n");
-printf(OUT "	version=\"0.7\"\>\n");
-printf(OUT "<objects>\n");
-$count=0;
-foreach $sysinfoid (sort(keys(%sysinfo))) {
-    $count++;$sysinfonr{$sysinfoid}=$count;
-    printf(OUT "<object id=\"sys%06d\" name=\"%s\" type=\"system\"/>\n",$count,$sysinfoid);
-}
-printf(OUT "</objects>\n");
-printf(OUT "<information>\n");
-foreach $sysinfoid (sort(keys(%sysinfo))) {
-    printf(OUT "<info oid=\"sys%06d\" type=\"short\">\n",$sysinfonr{$sysinfoid});
-    foreach $key (sort(keys(%{$sysinfo{$sysinfoid}}))) {
-	if(exists($mapping{$key})) {
-	    if($mapping{$key} ne "") {
-
-		$value=&modify($key,$mapping{$key},$sysinfo{$sysinfoid}{$key});
-		if(defined($value)) {
-		    printf(OUT " <data %-20s value=\"%s\"/>\n","key=\"".$mapping{$key}."\"",$value);
-		}
-	    } else {
-		$notmappedkeys{$key}++;
-	    }
-	} else {
-	    $notfoundkeys{$key}++;
-	}
-    }
-    printf(OUT "</info>\n");
-}
-printf(OUT "</information>\n");
- 
-printf(OUT "</lml:lgui>\n");
-
-close(OUT);
-
-foreach $key (sort(keys(%notfoundkeys))) {
-    printf("%-40s => \"\"\n","\"".$key."\"",$notfoundkeys{$key});
-}
-
-1;
-
-sub get_current_date {
-    my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$idst)=localtime(time());
-    my($date);
-    $year=substr($year,1,2);
-    $date=sprintf("%02d/%02d/%02d-%02d:%02d:%02d",$mon+1,$mday,$year,$hour,$min,$sec);
-    return($date);
-}
-
-
-sub modify {
-    my($key,$mkey,$value)=@_;
-    my $ret=$value;
-
-    return($ret);
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.da/rms/TORQUE/da_jobs_info_LML.pl b/rms/org.eclipse.ptp.rm.lml.da/rms/TORQUE/da_jobs_info_LML.pl
deleted file mode 100755
index 9547ba1..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/rms/TORQUE/da_jobs_info_LML.pl
+++ /dev/null
@@ -1,234 +0,0 @@
-#!/usr/bin/perl -w
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-use strict;
-
-my $patint="([\\+\\-\\d]+)";   # Pattern for Integer number
-my $patfp ="([\\+\\-\\d.E]+)"; # Pattern for Floating Point number
-my $patwrd="([\^\\s]+)";       # Pattern for Work (all noblank characters)
-my $patbl ="\\s+";             # Pattern for blank space (variable length)
-
-#####################################################################
-# get user info / check system 
-#####################################################################
-my $UserID = getpwuid($<);
-my $Hostname = `hostname`;
-my $verbose=1;
-my ($line,%jobs,%jobnr,$key,$value,$count,%notmappedkeys,%notfoundkeys);
-
-#unless( ($Hostname =~ /jugenes\d/) && ($UserID =~ /llstat/) ) {
-#  die "da_jobs_info_LML.pl can only be used as llstat on jugenesX!";
-#}
-
-#####################################################################
-# get command line parameter
-#####################################################################
-if ($#ARGV != 0) {
-  die " Usage: $0 <filename> $#ARGV\n";
-}
-my $filename = $ARGV[0];
-
-my $system_sysprio=-1;
-my $maxtopdogs=-1;
-
-my %mapping = (
-    "Checkpoint"                             => "",
-    "Error_Path"                             => "",
-    "Hold_Types"                             => "",
-    "Job_Name"                               => "name",
-    "Job_Owner"                              => "owner",
-    "Join_Path"                              => "",
-    "Keep_Files"                             => "",
-    "Mail_Points"                            => "",
-    "Mail_Users"                             => "",
-    "Output_Path"                            => "",
-    "Priority"                               => "",
-    "Rerunable"                              => "restart",
-    "Resource_List.cput"                     => "",
-    "Resource_List.depend"                   => "dependency",
-    "Resource_List.mem"                      => "",
-    "Resource_List.nodect"                   => "",
-    "Resource_List.nodes"                    => "totalcores",
-    "Resource_List.pmem"                     => "",
-    "Resource_List.walltime"                 => "wall",
-    "Shell_Path_List"                        => "",
-    "Walltime.Remaining"                     => "",
-    "comment"                                => "",
-    "ctime"                                  => "",
-    "depend"                                 => "",
-    "etime"                                  => "",
-    "exec_host"                              => "nodelist",
-    "exit_status"                            => "",
-    "fault_tolerant"                         => "",
-    "interactive"                            => "",
-    "job_state"                              => "state",
-    "mtime"                                  => "",
-    "qtime"                                  => "queuedate",
-    "queue"                                  => "queue",
-    "resources_used.cput"                    => "",
-    "resources_used.mem"                     => "",
-    "resources_used.vmem"                    => "",
-    "resources_used.walltime"                => "",
-    "server"                                 => "",
-    "session_id"                             => "",
-    "start_count"                            => "",
-    "start_time"                             => "dispatchdate",
-    "submit_args"                            => "",
-
-    "step"                                   => "step",
-    "totaltasks"                             => "totaltasks",
-    "spec"                                   => "spec",
-    "Resource_List.signal"                   => "",
-    "x"                                      => "",
-
-# unknown attributes
-    "group"                                  => "group",
-    );
-
-open(IN,"/usr/bin/qstat -f |");
-my $jobid="-";
-my $lastkey="-";
-
-
-while($line=<IN>) {
-    chomp($line);
-    if($line=~/Job Id: ([^\s]+)$/) {
-	$jobid=$1;
-	$jobs{$jobid}{step}=$jobid;
-#	print "line $line\n";
-    } elsif($line=~/^\s+([^\:]+)\s+\=\s+(.*)$/) {
-	($key,$value)=($1,$2);
-	$key=~s/\s/_/gs;
-	$lastkey=$key;
-	$jobs{$jobid}{$key}=$value;
-    } else {
-	$line=~s/^\s*//gs;
-	$jobs{$jobid}{$lastkey}.=$line;
-    }
-}
-close(IN);
-
-# add unknown but manatory attributes to jobs
-foreach $jobid (sort(keys(%jobs))) {
-    $jobs{$jobid}{group}      = "unknown" if(!exists($jobs{$jobid}{group}));
-    $jobs{$jobid}{exec_host}  = "-" if(!exists($jobs{$jobid}{exec_host}));
-    $jobs{$jobid}{totaltasks} = $jobs{$jobid}{"Resource_List.nodes"} if(!exists($jobs{$jobid}{totaltasks}));
-    $jobs{$jobid}{spec}       = $jobs{$jobid}{"Resource_List.nodes"} if(!exists($jobs{$jobid}{spec}));
-}
-
-open(OUT,"> $filename") || die "cannot open file $filename";
-printf(OUT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-printf(OUT "<lml:lgui xmlns:lml=\"http://www.llview.de\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
-printf(OUT "	xsi:schemaLocation=\"http://www.llview.de lgui.xsd\"\n");
-printf(OUT "	version=\"0.7\"\>\n");
-printf(OUT "<objects>\n");
-$count=0;
-foreach $jobid (sort(keys(%jobs))) {
-    $count++;$jobnr{$jobid}=$count;
-    printf(OUT "<object id=\"j%06d\" name=\"%s\" type=\"job\"/>\n",$count,$jobid);
-}
-printf(OUT "</objects>\n");
-printf(OUT "<information>\n");
-foreach $jobid (sort(keys(%jobs))) {
-    printf(OUT "<info oid=\"j%06d\" type=\"short\">\n",$jobnr{$jobid});
-    foreach $key (sort(keys(%{$jobs{$jobid}}))) {
-	if(exists($mapping{$key})) {
-	    if($mapping{$key} ne "") {
-		$value=&modify($key,$mapping{$key},$jobs{$jobid}{$key});
-		if($value) {
-		    printf(OUT " <data %-20s value=\"%s\"/>\n","key=\"".$mapping{$key}."\"",$value);
-		}
-	    } else {
-		$notmappedkeys{$key}++;
-	    }
-	} else {
-	    $notfoundkeys{$key}++;
-	}
-    }
-    printf(OUT "</info>\n");
-}
-printf(OUT "</information>\n");
- 
-printf(OUT "</lml:lgui>\n");
-
-close(OUT);
-
-foreach $key (sort(keys(%notfoundkeys))) {
-    printf("%-40s => \"\",\n","\"".$key."\"",$notfoundkeys{$key});
-}
-
-
-
-sub modify {
-    my($key,$mkey,$value)=@_;
-    my $ret=$value;
-
-
-    if($mkey eq "owner") {
-	$ret=~s/\@.*//gs;
-    }
-
-    if($mkey eq "state") {
-	$ret="Completed"   if ($value eq "C");
-	$ret="Removed"     if ($value eq "E");
-	$ret="System Hold" if ($value eq "H");
-	$ret="Idle"        if ($value eq "Q");
-	$ret="Idle"        if ($value eq "W");
-	$ret="Idle"        if ($value eq "T");
-	$ret="Running"     if ($value eq "R");
-	$ret="System Hold" if ($value eq "S");
-    }
-
-    if(($mkey eq "wall") || ($mkey eq "wallsoft")) {
-	if($value=~/\($patint seconds\)/) {
-	    $ret=$1;
-	}
-	if($value=~/$patint minutes/) {
-	    $ret=$1*60;
-	}
-	if($value=~/^$patint[:]$patint[:]$patint$/) {
-	    $ret=$1*60*60+$2*60+$3;
-	}
-    }
-
-    if($mkey eq "nodelist") {
-	if($ret ne "-") {
-	    $ret=~s/\//,/gs;
-	    my @nodes = split(/\+/,$ret);
-	    $ret="(".join(')(',@nodes).")";
-	}
-    }
-
-    if($mkey eq "totalcores") {
-	if($ret=~/$patint[:]ppn=$patint/) {
-	    $ret=$1*$2;
-	}
-    }
-    if($mkey eq "totaltasks") {
-	if($ret=~/$patint[:]ppn=$patint/) {
-	    $ret=$1*$2;
-	}
-    }
-
-    if(($mkey eq "comment")) {
-	$ret=~s/\"//gs;
-    }
-    if(($mkey eq "bgp_state")) {
-	$ret=~s/\<unknown\>/unknown/gs;
-    }
-    # mask & in user input
-    if($ret=~/\&/) {
-	$ret=~s/\&/\&amp\;/gs;
-    } 
-
-
-    return($ret);
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.da/rms/TORQUE/da_nodes_info_LML.pl b/rms/org.eclipse.ptp.rm.lml.da/rms/TORQUE/da_nodes_info_LML.pl
deleted file mode 100755
index f9e23b8..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/rms/TORQUE/da_nodes_info_LML.pl
+++ /dev/null
@@ -1,203 +0,0 @@
-#!/usr/bin/perl -w
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-use strict;
-
-my $patint="([\\+\\-\\d]+)";   # Pattern for Integer number
-my $patfp ="([\\+\\-\\d.E]+)"; # Pattern for Floating Point number
-my $patwrd="([\^\\s]+)";       # Pattern for Work (all noblank characters)
-my $patbl ="\\s+";             # Pattern for blank space (variable length)
-
-#####################################################################
-# get user info / check system 
-#####################################################################
-my $UserID = getpwuid($<);
-my $Hostname = `hostname`;
-my $verbose=1;
-my ($line,%nodes,%nodenr,$key,$value,$count,%notmappedkeys,%notfoundkeys);
-
-#####################################################################
-# get command line parameter
-#####################################################################
-if ($#ARGV != 0) {
-  die " Usage: $0 <filename> $#ARGV\n";
-}
-my $filename = $ARGV[0];
-
-my $system_sysprio=-1;
-my $maxtopdogs=-1;
-
-my %mapping = (
-    "availmem"                               => "availmem",
-    "id"                                     => "id",
-    "idletime"                               => "",
-    "jobs"                                   => "",
-    "loadave"                                => "",
-    "ncpus"                                  => "",
-    "netload"                                => "",
-    "note"                                   => "",
-    "np"                                     => "ncores",
-    "nsessions"                              => "",
-    "ntype"                                  => "",
-    "nusers"                                 => "",
-    "opsys"                                  => "",
-    "physmem"                                => "physmem",
-    "properties"                             => "",
-    "rectime"                                => "",
-    "sessions"                               => "",
-    "size"                                   => "",
-    "state"                                  => "state",
-    "status"                                 => "",
-    "totmem"                                 => "",
-    "uname"                                  => "",
-    "varattr"                                => "",
-# unknown attributes
-    );
-
-open(IN,"/usr/bin/pbsnodes -a |");
-my $nodeid="-";
-my $lastkey="-";
-
-
-while($line=<IN>) {
-    chomp($line);
-    if($line=~/^([^\s]+)$/) {
-	$nodeid=$1;
-	$nodes{$nodeid}{id}=$nodeid;
-#	print "line $line\n";
-    } elsif($line=~/^\s+([^\:]+)\s+\=\s+(.*)$/) {
-	($key,$value)=($1,$2);
-	$key=~s/\s/_/gs;
-	$lastkey=$key;
-	$nodes{$nodeid}{$key}=$value;
-    } else {
-	$line=~s/^\s*//gs;
-	$nodes{$nodeid}{$lastkey}.=$line;
-    }
-}
-close(IN);
-
-# add unknown but manatory attributes to nodes
-foreach $nodeid (keys(%nodes)) {
-    my($key,$value,$pair);
-    if(exists($nodes{$nodeid}{status})) {
-	foreach $pair (split(/,/,$nodes{$nodeid}{status})) {
-	    ($key,$value)=split(/=/,$pair);
-	    $nodes{$nodeid}{$key}=$value;
-	}
-    } 
-
-}
-
-open(OUT,"> $filename") || die "cannot open file $filename";
-printf(OUT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-printf(OUT "<lml:lgui xmlns:lml=\"http://www.llview.de\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
-printf(OUT "	xsi:schemaLocation=\"http://www.llview.de lgui.xsd\"\n");
-printf(OUT "	version=\"0.7\"\>\n");
-printf(OUT "<objects>\n");
-$count=0;
-foreach $nodeid (sort(keys(%nodes))) {
-    $count++;$nodenr{$nodeid}=$count;
-    printf(OUT "<object id=\"nd%06d\" name=\"%s\" type=\"node\"/>\n",$count,$nodeid);
-}
-printf(OUT "</objects>\n");
-printf(OUT "<information>\n");
-foreach $nodeid (sort(keys(%nodes))) {
-    printf(OUT "<info oid=\"nd%06d\" type=\"short\">\n",$nodenr{$nodeid});
-    foreach $key (sort(keys(%{$nodes{$nodeid}}))) {
-	if(exists($mapping{$key})) {
-	    if($mapping{$key} ne "") {
-		$value=&modify($key,$mapping{$key},$nodes{$nodeid}{$key});
-		if($value) {
-		    printf(OUT " <data %-20s value=\"%s\"/>\n","key=\"".$mapping{$key}."\"",$value);
-		}
-	    } else {
-		$notmappedkeys{$key}++;
-	    }
-	} else {
-	    $notfoundkeys{$key}++;
-	}
-    }
-    printf(OUT "</info>\n");
-}
-printf(OUT "</information>\n");
- 
-printf(OUT "</lml:lgui>\n");
-
-close(OUT);
-
-foreach $key (sort(keys(%notfoundkeys))) {
-#    printf("not found key %-40s: %6d times\n",$key,$notfoundkeys{$key});
-    printf("%-40s => \"\",\n","\"".$key."\"",$notfoundkeys{$key});
-}
-
-
-
-sub modify {
-    my($key,$mkey,$value)=@_;
-    my $ret=$value;
-
-    if($mkey eq "owner") {
-	$ret=~s/\@.*//gs;
-    }
-
-    if($mkey eq "state") {
-	$ret="Running"  if ($value eq "busy");
-	$ret="Down"     if ($value eq "down");
-	$ret="Idle"     if ($value eq "free");
-	$ret="Running"  if ($value eq "job-exclusive");
-	$ret="Running"  if ($value eq "job-sharing");
-	$ret="Running"  if ($value eq "time-sharing");
-	$ret="Down"     if ($value eq "offline");
-	$ret="Drained"  if ($value eq "reserve");
-	$ret="unknown"  if ($value eq "unknown");
-    }
-
-    if(($mkey eq "wall") || ($mkey eq "wallsoft")) {
-	if($value=~/\($patint seconds\)/) {
-	    $ret=$1;
-	}
-	if($value=~/$patint minutes/) {
-	    $ret=$1*60;
-	}
-	if($value=~/^$patint[:]$patint[:]$patint$/) {
-	    $ret=$1*60*60+$2*60+$3;
-	}
-    }
-
-    if($mkey eq "nodelist") {
-	if($ret ne "-") {
-	    $ret=~s/\//,/gs;
-	    my @nodes = split(/\+/,$ret);
-	    $ret="(".join(')(',@nodes).")";
-	}
-    }
-
-    if($mkey eq "totalcores") {
-	if($ret=~/$patint[:]ppn=$patint/) {
-	    $ret=$1*$2;
-	}
-    }
-    if($mkey eq "totaltasks") {
-	if($ret=~/$patint[:]ppn=$patint/) {
-	    $ret=$1*$2;
-	}
-    }
-
-    if(($mkey eq "comment")) {
-	$ret=~s/\"//gs;
-    }
-    if(($mkey eq "bgp_state")) {
-	$ret=~s/\<unknown\>/unknown/gs;
-    }
-
-    return($ret);
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.da/rms/TORQUE/da_system_info_LML.pl b/rms/org.eclipse.ptp.rm.lml.da/rms/TORQUE/da_system_info_LML.pl
deleted file mode 100755
index ccc2b6b..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/rms/TORQUE/da_system_info_LML.pl
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/perl -w
-#*******************************************************************************
-#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
-#* All rights reserved. This program and the accompanying materials
-#* are made available under the terms of the Eclipse Public License v1.0
-#* which accompanies this distribution, and is available at
-#* http://www.eclipse.org/legal/epl-v10.html
-#*
-#* Contributors:
-#*    Wolfgang Frings (Forschungszentrum Juelich GmbH) 
-#*******************************************************************************/ 
-use strict;
-
-use lib ".";
-
-my $patint="([\\+\\-\\d]+)";   # Pattern for Integer number
-my $patfp ="([\\+\\-\\d.E]+)"; # Pattern for Floating Point number
-my $patwrd="([\^\\s]+)";       # Pattern for Work (all noblank characters)
-my $patbl ="\\s+";             # Pattern for blank space (variable length)
-
-#####################################################################
-# get user sysinfo / check system 
-#####################################################################
-my $UserID = getpwuid($<);
-my $Hostname = `hostname`;
-chomp($Hostname);
-my $verbose=1;
-
-my $filename = $ARGV[0];
-
-my %mapping = (
-    "hostname"                                  => "hostname",
-    "date"                                      => "system_time",
-    "type"                                      => "type",
-    );
-
-my ($sysinfoid,$line,%sysinfo,%sysinfonr,$key,$value,$count,%notmappedkeys,%notfoundkeys);
-
-$sysinfoid="jugene";
-$sysinfo{$sysinfoid}{hostname}=$Hostname;
-$sysinfo{$sysinfoid}{date}=&get_current_date();
-$sysinfo{$sysinfoid}{type}="Cluster";
-
-open(OUT,"> $filename") || die "cannot open file $filename";
-printf(OUT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-printf(OUT "<lml:lgui xmlns:lml=\"http://www.llview.de\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
-printf(OUT "	xsi:schemaLocation=\"http://www.llview.de lgui.xsd\"\n");
-printf(OUT "	version=\"0.7\"\>\n");
-printf(OUT "<objects>\n");
-$count=0;
-foreach $sysinfoid (sort(keys(%sysinfo))) {
-    $count++;$sysinfonr{$sysinfoid}=$count;
-    printf(OUT "<object id=\"sys%06d\" name=\"%s\" type=\"system\"/>\n",$count,$sysinfoid);
-}
-printf(OUT "</objects>\n");
-printf(OUT "<information>\n");
-foreach $sysinfoid (sort(keys(%sysinfo))) {
-    printf(OUT "<info oid=\"sys%06d\" type=\"short\">\n",$sysinfonr{$sysinfoid});
-    foreach $key (sort(keys(%{$sysinfo{$sysinfoid}}))) {
-	if(exists($mapping{$key})) {
-	    if($mapping{$key} ne "") {
-
-		$value=&modify($key,$mapping{$key},$sysinfo{$sysinfoid}{$key});
-		if(defined($value)) {
-		    printf(OUT " <data %-20s value=\"%s\"/>\n","key=\"".$mapping{$key}."\"",$value);
-		}
-	    } else {
-		$notmappedkeys{$key}++;
-	    }
-	} else {
-	    $notfoundkeys{$key}++;
-	}
-    }
-    printf(OUT "</info>\n");
-}
-printf(OUT "</information>\n");
- 
-printf(OUT "</lml:lgui>\n");
-
-close(OUT);
-
-foreach $key (sort(keys(%notfoundkeys))) {
-    printf("%-40s => \"\"\n","\"".$key."\"",$notfoundkeys{$key});
-}
-
-1;
-
-sub get_current_date {
-    my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$idst)=localtime(time());
-    my($date);
-    $year=substr($year,1,2);
-    $date=sprintf("%02d/%02d/%02d-%02d:%02d:%02d",$mon+1,$mday,$year,$hour,$min,$sec);
-    return($date);
-}
-
-
-sub modify {
-    my($key,$mkey,$value)=@_;
-    my $ret=$value;
-
-    return($ret);
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.da/samples/LML_da_LL.conf b/rms/org.eclipse.ptp.rm.lml.da/samples/LML_da_LL.conf
deleted file mode 100644
index 0106583..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/samples/LML_da_LL.conf
+++ /dev/null
@@ -1,70 +0,0 @@
-<LML_da_workflow>
-
-<!--- predefined vars: 
-      $instdir="llview/da"
-      $stepinfile                 # file in $tmpdir filename contains id of
-                                    predecessor step
-      $stepoutfile                # file in $tmpdir filename contains current id
-  -->
-<vardefs>
-  <var   key="tmpdir"        value="./LMLtmp" />              
-  <var   key="permdir"       value="./LMLperm" />             
-  <var   key="histdir"       value="$permdir/hist" />         
-</vardefs>
-
-
-<step
-   id           = "getdata" 
-   active       = "1"
-   exec_after   = ""            
-   type         = "execute" 
-   >            
-  <cmd exec="LL/da_system_info_LML.pl               $tmpdir/sysinfo_LML.xml" />
-  <cmd exec="LL/da_jobs_info_LML.pl                 $tmpdir/jobs_LML.xml" />
-  <cmd exec="LL/da_nodes_info_LML.pl                $tmpdir/nodes_LML.xml" />
-</step>
-
-<step
-   id           = "combineLML" 
-   active       = "1"
-   exec_after   = "getdata"               
-   type         = "execute" 
-   >            
-  <cmd exec="$instdir/LML_combiner/LML_combine_obj.pl  -v -o $stepoutfile 
-                                                             $tmpdir/sysinfo_LML.xml
-                                                             $tmpdir/jobs_LML.xml 
-                                                             $tmpdir/nodes_LML.xml "
-                                                             />
-</step>
-
-<step
-   id           = "cppermfile1" 
-   active       = "1"
-   exec_after   = "combineLML"          
-   type         = "execute" 
-   >            
-  <cmd exec="cp $stepinfile  $permdir/llview_LMLraw.xml" />
-  <cmd exec="/usr/bin/gzip -c -9 $stepinfile > $permdir/llview_LMLraw.xml.gz" />
-</step>
-
-<step
-   id           = "genLML_std" 
-   active       = "1"
-   exec_after   = "cppermfile1"		
-   type         = "execute" 
-   >		
-  <cmd exec="$instdir/LML2LML/LML2LML.pl -v -layout $permdir/layout_std.xml -output $stepoutfile $stepinfile" />
-</step>
-
-<step
-   id           = "cppermfile2" 
-   active       = "1"
-   exec_after   = "genLML_std"          
-   type         = "execute" 
-   >            
-  <cmd exec="cp $stepinfile  $permdir/llview_LML.xml" />
-  <cmd exec="/usr/bin/gzip -c -9 $stepinfile > $permdir/llview_LML.xml.gz" />
-</step>
-
-
-</LML_da_workflow>
diff --git a/rms/org.eclipse.ptp.rm.lml.da/samples/LML_da_torque.conf b/rms/org.eclipse.ptp.rm.lml.da/samples/LML_da_torque.conf
deleted file mode 100644
index e14282c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/samples/LML_da_torque.conf
+++ /dev/null
@@ -1,70 +0,0 @@
-<LML_da_workflow>
-
-<!--- predefined vars: 
-      $instdir="llview/da"
-      $stepinfile                 # file in $tmpdir filename contains id of
-                                    predecessor step
-      $stepoutfile                # file in $tmpdir filename contains current id
-  -->
-<vardefs>
-  <var   key="tmpdir"        value="./LMLtmp" />              
-  <var   key="permdir"       value="./LMLperm" />             
-  <var   key="histdir"       value="$permdir/hist" />         
-</vardefs>
-
-
-<step
-   id           = "getdata" 
-   active       = "1"
-   exec_after   = ""            
-   type         = "execute" 
-   >            
-  <cmd exec="TORQUE/da_system_info_LML.pl               $tmpdir/sysinfo_LML.xml" />
-  <cmd exec="TORQUE/da_jobs_info_LML.pl                 $tmpdir/jobs_LML.xml" />
-  <cmd exec="TORQUE/da_nodes_info_LML.pl                $tmpdir/nodes_LML.xml" />
-</step>
-
-<step
-   id           = "combineLML" 
-   active       = "1"
-   exec_after   = "getdata"               
-   type         = "execute" 
-   >            
-  <cmd exec="$instdir/LML_combiner/LML_combine_obj.pl -dbdir $permdir/db -v -o $stepoutfile 
-                                                             $tmpdir/sysinfo_LML.xml
-                                                             $tmpdir/jobs_LML.xml 
-                                                             $tmpdir/nodes_LML.xml "
-                                                             />
-</step>
-
-<step
-   id           = "cppermfile1" 
-   active       = "1"
-   exec_after   = "combineLML"          
-   type         = "execute" 
-   >            
-  <cmd exec="cp $stepinfile  $permdir/llview_LMLraw.xml" />
-  <cmd exec="/usr/bin/gzip -c -9 $stepinfile > $permdir/llview_LMLraw.xml.gz" />
-</step>
-
-<step
-   id           = "genLML_std" 
-   active       = "1"
-   exec_after   = "cppermfile1"		
-   type         = "execute" 
-   >		
-  <cmd exec="$instdir/LML2LML/LML2LML.pl -v -layout $permdir/layout_std.xml -output $stepoutfile $stepinfile" />
-</step>
-
-<step
-   id           = "cppermfile2" 
-   active       = "1"
-   exec_after   = "genLML_std"          
-   type         = "execute" 
-   >            
-  <cmd exec="cp $stepinfile  $permdir/llview_LML.xml" />
-  <cmd exec="/usr/bin/gzip -c -9 $stepinfile > $permdir/llview_LML.xml.gz" />
-</step>
-
-
-</LML_da_workflow>
diff --git a/rms/org.eclipse.ptp.rm.lml.da/samples/LML_layout_LL.xml b/rms/org.eclipse.ptp.rm.lml.da/samples/LML_layout_LL.xml
deleted file mode 100644
index e715095..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/samples/LML_layout_LL.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<lml:lgui xmlns:lml="http://www.llview.de" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://www.llview.de lgui.xsd " version="1.0"> 
-
-<nodedisplaylayout id="nodedisplay" gid="1">
-  <el0 rows="0" cols="0">
-  </el0>
-
-
-<tablelayout id="tl_RUN" gid="joblist_RUN">
- <column cid="1" pos="0" width="0.1" active="true" key="totalcores" />
- <column cid="2" pos="1" width="1" active="true" key="owner" />
- <column cid="3" pos="2" width="1" active="true" key="queue" />
- <column cid="4" pos="3" width="1" active="true" key="wall" />
- <column cid="5" pos="5" width="1" active="true" key="queuedate" />
- <column cid="6" pos="6" width="1" active="true" key="dispatchdate" />
-</tablelayout>
-
-
-<tablelayout id="tl_WAIT" gid="joblist_WAIT">
- <column cid="1" pos="0" width="0.3" active="true" key="size_req" />
- <column cid="2" pos="1" width="1" active="true" key="owner" />
- <column cid="3" pos="2" width="1" active="true" key="queue" />
- <column cid="4" pos="3" width="1" active="true" key="wall" />
- <column cid="5" pos="5" width="1" active="true" key="queuedate" />
- <column cid="6" pos="6" width="1" active="true" key="name" />
-</tablelayout>
-
-</lml:lgui>
diff --git a/rms/org.eclipse.ptp.rm.lml.da/samples/LML_layout_torque.xml b/rms/org.eclipse.ptp.rm.lml.da/samples/LML_layout_torque.xml
deleted file mode 100644
index e715095..0000000
--- a/rms/org.eclipse.ptp.rm.lml.da/samples/LML_layout_torque.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<lml:lgui xmlns:lml="http://www.llview.de" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://www.llview.de lgui.xsd " version="1.0"> 
-
-<nodedisplaylayout id="nodedisplay" gid="1">
-  <el0 rows="0" cols="0">
-  </el0>
-
-
-<tablelayout id="tl_RUN" gid="joblist_RUN">
- <column cid="1" pos="0" width="0.1" active="true" key="totalcores" />
- <column cid="2" pos="1" width="1" active="true" key="owner" />
- <column cid="3" pos="2" width="1" active="true" key="queue" />
- <column cid="4" pos="3" width="1" active="true" key="wall" />
- <column cid="5" pos="5" width="1" active="true" key="queuedate" />
- <column cid="6" pos="6" width="1" active="true" key="dispatchdate" />
-</tablelayout>
-
-
-<tablelayout id="tl_WAIT" gid="joblist_WAIT">
- <column cid="1" pos="0" width="0.3" active="true" key="size_req" />
- <column cid="2" pos="1" width="1" active="true" key="owner" />
- <column cid="3" pos="2" width="1" active="true" key="queue" />
- <column cid="4" pos="3" width="1" active="true" key="wall" />
- <column cid="5" pos="5" width="1" active="true" key="queuedate" />
- <column cid="6" pos="6" width="1" active="true" key="name" />
-</tablelayout>
-
-</lml:lgui>
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/.classpath b/rms/org.eclipse.ptp.rm.lml.ui/.classpath
deleted file mode 100644
index 3b812d6..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/.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/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.ptp.rm.lml.core"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/.project b/rms/org.eclipse.ptp.rm.lml.ui/.project
deleted file mode 100644
index c7ac1a4..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rm.lml.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/rms/org.eclipse.ptp.rm.lml.ui/.settings/org.eclipse.jdt.core.prefs b/rms/org.eclipse.ptp.rm.lml.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 0d5b70f..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Wed Jan 26 13:47:16 CET 2011
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/META-INF/MANIFEST.MF b/rms/org.eclipse.ptp.rm.lml.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index a9e0185..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,33 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.rm.lml.ui;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Localization: plugin
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Import-Package: org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.jface.util,
- org.eclipse.jface.viewers,
- org.eclipse.ptp.rm.lml.core,
- org.eclipse.ptp.rm.lml.core.events,
- org.eclipse.ptp.rm.lml.core.util,
- org.eclipse.search.ui,
- org.eclipse.swt.graphics,
- org.eclipse.swt.widgets,
- org.eclipse.ui,
- org.eclipse.ui.console,
- org.eclipse.ui.plugin,
- org.osgi.framework
-Require-Bundle: org.eclipse.ui;bundle-version="3.6.1",
- org.eclipse.core.runtime;bundle-version="3.6.0",
- org.eclipse.ptp.rm.lml.core
-Bundle-Vendor: %pluginProvider
-Bundle-ActivationPolicy: lazy
-Bundle-Activator: org.eclipse.ptp.rm.lml.ui.LMLUIPlugin
-Export-Package: org.eclipse.ptp.rm.lml.ui,
- org.eclipse.ptp.rm.lml.ui.actions,
- org.eclipse.ptp.rm.lml.ui.managers,
- org.eclipse.ptp.rm.lml.ui.views,
- org.eclipse.ptp.rm.lml.ui.wizards
-Bundle-ClassPath: lmlui.jar
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/build.properties b/rms/org.eclipse.ptp.rm.lml.ui/build.properties
deleted file mode 100644
index 413c914..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-bin.includes = plugin.xml,\
-               plugin.properties,\
-               META-INF/,\
-               icons/,\
-               lmlui.jar
-source.lmlui.jar = src/
-jars.compile.order = lmlui.jar
-source.lmlui.jar = src/
-output.lmlui.jar = bin/
-
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/abort_disable.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/abort_disable.gif
deleted file mode 100644
index 67c491f..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/abort_disable.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/abort_hover.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/abort_hover.gif
deleted file mode 100644
index 8670a38..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/abort_hover.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/abort_normal.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/abort_normal.gif
deleted file mode 100644
index bfa7987..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/abort_normal.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/c_app.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/c_app.gif
deleted file mode 100644
index 67c491f..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/c_app.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/environment_tab.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/environment_tab.gif
deleted file mode 100644
index 65d63ec..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/environment_tab.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/exit_disable.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/exit_disable.gif
deleted file mode 100644
index 67c491f..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/exit_disable.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/exit_hover.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/exit_hover.gif
deleted file mode 100644
index 8670a38..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/exit_hover.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/exit_normal.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/exit_normal.gif
deleted file mode 100644
index bfa7987..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/exit_normal.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/icon_terminate_all.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/icon_terminate_all.gif
deleted file mode 100644
index ec56a24..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/icon_terminate_all.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/debug_job_completed.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/job/debug_job_completed.gif
deleted file mode 100644
index 71d05bc..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/debug_job_completed.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/debug_job_running.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/job/debug_job_running.gif
deleted file mode 100644
index f0a74da..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/debug_job_running.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/debug_job_starting.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/job/debug_job_starting.gif
deleted file mode 100644
index c0d8536..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/debug_job_starting.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/debug_job_suspended.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/job/debug_job_suspended.gif
deleted file mode 100644
index ece7d8a..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/debug_job_suspended.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/job_completed.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/job/job_completed.gif
deleted file mode 100644
index 13fc542..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/job_completed.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/job_running.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/job/job_running.gif
deleted file mode 100644
index 57f4102..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/job_running.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/job_starting.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/job/job_starting.gif
deleted file mode 100644
index 555b36e..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/job_starting.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/job_suspended.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/job/job_suspended.gif
deleted file mode 100644
index b7cb969..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/job/job_suspended.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/legend.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/legend.gif
deleted file mode 100644
index 2cbc4d3..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/legend.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_alert.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_alert.gif
deleted file mode 100644
index 85efa41..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_alert.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_down.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_down.gif
deleted file mode 100644
index d97e210..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_down.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_error.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_error.gif
deleted file mode 100644
index 716ebb1..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_error.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_unknown.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_unknown.gif
deleted file mode 100644
index 43e38b6..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_unknown.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_up.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_up.gif
deleted file mode 100644
index d9858d7..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/machine/machine_up.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_alloc_other.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_alloc_other.gif
deleted file mode 100644
index 43fd341..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_alloc_other.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_alloc_other_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_alloc_other_sel.gif
deleted file mode 100644
index 4eca90d..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_alloc_other_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_alloc_user.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_alloc_user.gif
deleted file mode 100644
index c4424cf..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_alloc_user.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_alloc_user_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_alloc_user_sel.gif
deleted file mode 100644
index ca2784f..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_alloc_user_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_down.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_down.gif
deleted file mode 100644
index ba8541e..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_down.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_down_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_down_sel.gif
deleted file mode 100644
index b179dec..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_down_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_error.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_error.gif
deleted file mode 100644
index 608ab0d..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_error.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_error_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_error_sel.gif
deleted file mode 100644
index 963cce1..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_error_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_exited.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_exited.gif
deleted file mode 100644
index f534a21..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_exited.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_exited_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_exited_sel.gif
deleted file mode 100644
index 741c2f5..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_exited_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_other_excl.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_other_excl.gif
deleted file mode 100644
index 43fd341..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_other_excl.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_other_excl_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_other_excl_sel.gif
deleted file mode 100644
index 4eca90d..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_other_excl_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_other_shared.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_other_shared.gif
deleted file mode 100644
index dbc85ab..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_other_shared.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_other_shared_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_other_shared_sel.gif
deleted file mode 100644
index 894d32c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_other_shared_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_running.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_running.gif
deleted file mode 100644
index 0840008..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_running.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_running_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_running_sel.gif
deleted file mode 100644
index 5df579e..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_running_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_unknown.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_unknown.gif
deleted file mode 100644
index a27714c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_unknown.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_unknown_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_unknown_sel.gif
deleted file mode 100644
index b62c977..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_unknown_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_up.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_up.gif
deleted file mode 100644
index 193b932..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_up.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_up_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_up_sel.gif
deleted file mode 100644
index e11dd48..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_up_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_user_excl.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_user_excl.gif
deleted file mode 100644
index 9c8c92a..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_user_excl.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_user_excl_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_user_excl_sel.gif
deleted file mode 100644
index c0c1d4f..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_user_excl_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_user_shared.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_user_shared.gif
deleted file mode 100644
index c3567a5..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_user_shared.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_user_shared_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_user_shared_sel.gif
deleted file mode 100644
index 8273b53..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/node/node_user_shared_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/parallel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/parallel.gif
deleted file mode 100644
index 6facfb9..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/parallel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/parallel_perspective.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/parallel_perspective.gif
deleted file mode 100644
index 828a539..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/parallel_perspective.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_completed.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_completed.gif
deleted file mode 100644
index 075c8c9..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_completed.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_completed_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_completed_sel.gif
deleted file mode 100644
index 156f507..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_completed_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_running.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_running.gif
deleted file mode 100644
index 30749b2..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_running.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_running_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_running_sel.gif
deleted file mode 100644
index 5261fbf..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_running_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_starting.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_starting.gif
deleted file mode 100644
index a1361f1..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_starting.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_starting_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_starting_sel.gif
deleted file mode 100644
index ed782a7..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_starting_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_suspended.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_suspended.gif
deleted file mode 100644
index e0af6b9..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_suspended.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_suspended_sel.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_suspended_sel.gif
deleted file mode 100644
index 5c4f0fa..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/process/proc_suspended_sel.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_error.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_error.gif
deleted file mode 100644
index bafa401..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_error.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_started.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_started.gif
deleted file mode 100644
index e1ff863..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_started.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_starting.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_starting.gif
deleted file mode 100644
index 6f70c02..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_starting.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_stopped.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_stopped.gif
deleted file mode 100644
index 85d8115..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_stopped.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_view.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_view.gif
deleted file mode 100644
index 0cd3d1c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/rm_view.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/start.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/start.gif
deleted file mode 100644
index 0aa4a43..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/start.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/stop.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/stop.gif
deleted file mode 100644
index 95b0ea4..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/rm/stop.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/search.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/search.gif
deleted file mode 100644
index d540a01..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/search.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/search_dim.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/search_dim.gif
deleted file mode 100644
index f246a63..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/search_dim.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/changeset_normal.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/changeset_normal.gif
deleted file mode 100644
index acdf80a..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/changeset_normal.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/changeset_normal.png b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/changeset_normal.png
deleted file mode 100644
index 8bf9036..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/changeset_normal.png
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/createset_normal.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/createset_normal.gif
deleted file mode 100644
index a16b026..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/createset_normal.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/createset_normal.png b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/createset_normal.png
deleted file mode 100644
index b84cf32..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/createset_normal.png
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/deleteelement_normal.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/deleteelement_normal.gif
deleted file mode 100644
index 074ec54..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/deleteelement_normal.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/deleteelement_normal.png b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/deleteelement_normal.png
deleted file mode 100644
index d8ccbc2..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/deleteelement_normal.png
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/deleteset_normal.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/deleteset_normal.gif
deleted file mode 100644
index 5ce5f7b..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/deleteset_normal.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/deleteset_normal.png b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/deleteset_normal.png
deleted file mode 100644
index 77382fa..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/deleteset_normal.png
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/job_focus_disable.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/job_focus_disable.gif
deleted file mode 100644
index 61615d5..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/job_focus_disable.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/job_focus_enable.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/job_focus_enable.gif
deleted file mode 100644
index ec50b70..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/job_focus_enable.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/remove_all_terminated_disable.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/remove_all_terminated_disable.gif
deleted file mode 100644
index ecd1be5..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/remove_all_terminated_disable.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/remove_all_terminated_normal.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/remove_all_terminated_normal.gif
deleted file mode 100644
index 28a3785..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/remove_all_terminated_normal.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/remove_terminated_disable.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/remove_terminated_disable.gif
deleted file mode 100644
index 559e462..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/remove_terminated_disable.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/remove_terminated_normal.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/remove_terminated_normal.gif
deleted file mode 100644
index 2cd9c54..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/remove_terminated_normal.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/terminate_job_disable.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/terminate_job_disable.gif
deleted file mode 100644
index 1a33ac8..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/terminate_job_disable.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/terminate_job_normal.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/terminate_job_normal.gif
deleted file mode 100644
index 6d47276..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/terminate_job_normal.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/zoomin_normal.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/zoomin_normal.gif
deleted file mode 100644
index e9287db..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/zoomin_normal.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/zoomout_normal.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/zoomout_normal.gif
deleted file mode 100644
index 2ee7c6b..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/tool/zoomout_normal.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/viewstatus_disable.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/viewstatus_disable.gif
deleted file mode 100644
index 67c491f..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/viewstatus_disable.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/viewstatus_hover.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/viewstatus_hover.gif
deleted file mode 100644
index 8670a38..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/viewstatus_hover.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/icons/viewstatus_normal.gif b/rms/org.eclipse.ptp.rm.lml.ui/icons/viewstatus_normal.gif
deleted file mode 100644
index bfa7987..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/icons/viewstatus_normal.gif
+++ /dev/null
Binary files differ
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/plugin.properties b/rms/org.eclipse.ptp.rm.lml.ui/plugin.properties
deleted file mode 100644
index c31d6cc..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/plugin.properties
+++ /dev/null
@@ -1,40 +0,0 @@
-pluginName=LML User Interface
-pluginProvider=FZ Juelich GmbH
-
-ParallelMachinesView.name=Machines
-ParallelMachineView.name=Machines (old)
-ParallelJobsView.name=Jobs
-ParallelJobView.name=Jobs (old)
-JobListView.name=Job List
-LMLView.name=LML
-NodesView.name=Nodedisplay
-
-TerminateAllAction.label=Terminate &All
-TerminateAllAction.tooltip=Terminate All
-
-ParallelViewCategory.name=LML
-ParallelControlView.name=Parallel Processes Panel
-ParallelProcessView.name=Parallel Runtime (LML)
-Perspective.name = Parallel Runtime (LML)
-
-preferencePages.name=Parallel Tools
-SimulationpreferencePage.name=Simulation
-OMPIpreferencePage.name=Open RTE
-MPICH2preferencePage.name=MPICH2
-ViewerpreferencePage.name=Viewer
-RMpreferencePage.name=Resource Manager
-
-actionSets.name=PTP
-actionSetsMenu.name=Menu name
-
-searchAction.name=Search
-searchAction.tooltip=Search Node or Process
-
-legendAction.name=Legend dialog
-legendAction.tooltip=Show status icons of node and process
-
-PSearchPage.label=PTP Search
-
-ResourceManagersMenu.label=Resource Managers
-StopResourceManagersAction.label=Stop Resource Manager
-StartResourceManagersAction.label=Start Resource Manager
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/plugin.xml b/rms/org.eclipse.ptp.rm.lml.ui/plugin.xml
deleted file mode 100644
index 616f79a..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/plugin.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            id="org.eclipse.ptp.rm.lml.ui.views"
-            name="%ParallelViewCategory.name">
-      </category>
-      <view
-            allowMultiple="true"
-            category="org.eclipse.ptp.rm.lml.ui.views"
-            class="org.eclipse.ptp.rm.lml.ui.views.NodesView"
-            icon="icons/parallel_perspective.gif"
-            id="org.eclipse.ptp.rm.lml.ui.views.NodesView"
-            name="%NodesView.name"
-            restorable="false">
-      </view>
-      <view
-            category="org.eclipse.ptp.rm.lml.ui.views"
-            class="org.eclipse.ptp.rm.lml.ui.views.LMLView"
-            icon="icons/rm/rm_view.gif"
-            id="org.eclipse.ptp.rm.lml.ui.views.LMLView"
-            name="%LMLView.name">
-      </view>
-      <view
-            allowMultiple="true"
-            category="org.eclipse.ptp.rm.lml.ui.views"
-            class="org.eclipse.ptp.rm.lml.ui.views.TableView"
-            icon="icons/parallel_perspective.gif"
-            id="org.eclipse.ptp.rm.lml.ui.views.TableView"
-            name="org.eclipse.ptp.rm.lml.ui.views.TableView"
-            restorable="false">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            class="org.eclipse.ptp.rm.lml.internal.ui.LMLRuntimePerspectiveFactory"
-            icon="icons/parallel_perspective.gif"
-            id="org.eclipse.ptp.rm.lml.ui.LMLRunPerspective"
-            name="%Perspective.name">
-      </perspective>
-   </extension>
-
-</plugin>
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/internal/ui/LMLRuntimePerspectiveFactory.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/internal/ui/LMLRuntimePerspectiveFactory.java
deleted file mode 100644
index 59d2e5b..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/internal/ui/LMLRuntimePerspectiveFactory.java
+++ /dev/null
@@ -1,40 +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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- */
-
-package org.eclipse.ptp.rm.lml.internal.ui;
-
-import org.eclipse.ptp.rm.lml.ui.ILMLUIConstants;
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-public class LMLRuntimePerspectiveFactory implements IPerspectiveFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui
-	 * .IPageLayout)
-	 */
-	public void createInitialLayout(IPageLayout layout) {
-		String editorArea = layout.getEditorArea();
-		layout.setEditorAreaVisible(false);
-
-		IFolderLayout lguiFolder = layout.createFolder("lguiFolder", IPageLayout.LEFT, (float) 0.4, editorArea); //$NON-NLS-1$
-		IFolderLayout tableFolder = layout.createFolder("jobsFolder", IPageLayout.BOTTOM, (float) 0.25, "lguiFolder"); //$NON-NLS-1$ //$NON-NLS-2$
-		IFolderLayout machinesFolder = layout.createFolder("machinesFolder", IPageLayout.BOTTOM, (float) 0, editorArea); //$NON-NLS-1$ //$NON-NLS-2$
-		
-		lguiFolder.addView(ILMLUIConstants.VIEW_LML);
-		tableFolder.addPlaceholder(ILMLUIConstants.VIEW_TABLE + ":*");
-		machinesFolder.addPlaceholder(ILMLUIConstants.VIEW_PARALLELNODES + ":*");
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/internal/ui/LguiSelectionPersistence.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/internal/ui/LguiSelectionPersistence.java
deleted file mode 100644
index 82a0538..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/internal/ui/LguiSelectionPersistence.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * Copyright (c) 2009 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial Implementation
- *
- *
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- */
-
-package org.eclipse.ptp.rm.lml.internal.ui;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-
-import org.eclipse.ptp.rm.lml.core.LMLCorePlugin;
-import org.eclipse.ptp.rm.lml.ui.LMLUIPlugin;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.XMLMemento;
-
-public class LguiSelectionPersistence {
-	private final static String TAG_DEFAULT_LGUI = "DefaultLgui"; //$NON-NLS-1$
-	private final static String TAG_LGUI = "Lgui"; //$NON-NLS-1$
-	private final static String TAG_LGUI_ID = "LguiID"; //$NON-NLS-1$
-	private final static String MEMENTO_FILE = "defaultLgui.xml"; //$NON-NLS-1$
-	private final static String NULL_ID = "null"; //$NON-NLS-1$
-
-	/**
-	 * Create a resource mananger selection persistence object
-	 */
-	public LguiSelectionPersistence() {
-	}
-
-	/**
-	 * Get the default resource mananger ID from persistent storage
-	 * 
-	 * @return - the default resource mananger ID or null if no default resource
-	 *         mananger set
-	 */
-	public String getDefaultLguiID() {
-		File file;
-		FileReader reader = null;
-		String rmId = null;
-
-		file = getPersistenceFile();
-		try {
-			IMemento rmSelectionInfo;
-			IMemento child;
-
-			reader = new FileReader(file);
-			rmSelectionInfo = XMLMemento.createReadRoot(reader);
-			child = rmSelectionInfo.getChild(TAG_LGUI);
-			if (child != null) {
-				rmId = child.getString(TAG_LGUI_ID);
-			}
-		} catch (FileNotFoundException e) {
-			// ignored... Default resource manager not set yet
-		} catch (WorkbenchException e) {
-			// ignored... Default resource manager not set yet
-		} finally {
-			try {
-				if (reader != null) {
-					reader.close();
-				}
-			} catch (IOException e) {
-				LMLCorePlugin.log(e);
-			}
-		}
-		return rmId;
-	}
-
-	/*
-	 * Record the identity of the current default resource manager in persistent
-	 * storage
-	 * 
-	 * @param rm - The default resource manager
-	 */
-	public void saveDefaultLguiID(String rmId) {
-		XMLMemento memento;
-		FileWriter writer;
-		File file;
-
-		file = getPersistenceFile();
-		memento = createMemento(rmId);
-		writer = null;
-		try {
-			writer = new FileWriter(file);
-			memento.save(writer);
-		} catch (IOException e) {
-			LMLCorePlugin.log(e);
-		} finally {
-			try {
-				if (writer != null) {
-					writer.close();
-				}
-			} catch (IOException e) {
-				LMLCorePlugin.log(e);
-			}
-		}
-	}
-
-	/**
-	 * Create the persistent data object which stores the identity of the
-	 * default resource mananger
-	 * 
-	 * @param rmId
-	 *            - the default resource manager or null if there is no default
-	 *            resource manager
-	 * @return - the persistent data object used to store the resource manager
-	 *         id
-	 */
-	private XMLMemento createMemento(String rmId) {
-		XMLMemento memento;
-		IMemento child;
-
-		memento = XMLMemento.createWriteRoot(TAG_DEFAULT_LGUI);
-		child = memento.createChild(TAG_LGUI);
-		if (rmId == null) {
-			child.putString(TAG_LGUI_ID, NULL_ID);
-		} else {
-			child.putString(TAG_LGUI_ID, rmId);
-		}
-		return memento;
-	}
-
-	/**
-	 * Get the location of the file holding the resource manager data
-	 * 
-	 * @return - file object for resource manager data
-	 */
-	private File getPersistenceFile() {
-		final LMLUIPlugin plugin;
-
-		plugin = LMLUIPlugin.getDefault();
-		return plugin.getStateLocation().append(MEMENTO_FILE).toFile();
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/ILMLUIConstants.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/ILMLUIConstants.java
deleted file mode 100644
index aef8dba..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/ILMLUIConstants.java
+++ /dev/null
@@ -1,71 +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
- * 
- * Modified by:
- * 		Claudia Konbloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.ui;
-
-public interface ILMLUIConstants {
-	public static final String PLUGIN_ID = LMLUIPlugin.getUniqueIdentifier();
-	public static final String PREFIX = PLUGIN_ID + "."; //$NON-NLS-1$
-	
-	public static final String VIEW_PARALLELNODES = PREFIX + "views.NodesView"; //$NON-NLS-1$
-	public static final String VIEW_PARALLELNODES2 = PREFIX + "views.NodedisplayView";//$NON-NLS-1$
-	public static final String VIEW_PARALLELJOBS = PREFIX + "views.parallelJobsView"; //$NON-NLS-1$
-	public static final String VIEW_TABLE = PREFIX + "views.TableView"; //$NON-NLS-1$
-	public static final String VIEW_PARALLELProcess = PREFIX + "views.parallelProcessView"; //$NON-NLS-1$
-	public static final String VIEW_LML = PREFIX + "views.LMLView"; //$NON-NLS-1$
-
-	public static final String RM_REMOTE_SERVICES = PREFIX + "remoteServices"; //$NON-NLS-1$
-	
-	public static final String PERSPECTIVE_RUN = PREFIX + "PTPRunPerspective"; //$NON-NLS-1$
-
-	public static final String SEARCH_PAGE = PREFIX + "PSearchPage"; //$NON-NLS-1$
-	public static final String SEARCH_RESULT_PAGE = PREFIX + "PSearchResultPage"; //$NON-NLS-1$
-	
-    public static final String ACTION_SET = PREFIX + "actionSets"; //$NON-NLS-1$
-    public static final String ACTION_SHOW_LEGEND = PREFIX + "actions.showLegendAction"; //$NON-NLS-1$
-    
-    public static final String IUINAVIGATORGROUP = "navigatorgroup"; //$NON-NLS-1$
-    public static final String IUISETGROUP = "setgroup"; //$NON-NLS-1$
-    public static final String IUICHANGESETGROUP = "changesetgroup"; //$NON-NLS-1$
-    public static final String IUIVIEWGROUP = "viewgroup"; //$NON-NLS-1$
-    public static final String IUIZOOMGROUP = "zoomgroup"; //$NON-NLS-1$
-    public static final String IUIEMPTYGROUP = "emptygroup"; //$NON-NLS-1$
-    public static final String IUIJOBGROUP = "jobgroup"; //$NON-NLS-1$
- 	
-	public static final int INTERNAL_ERROR = 150;
-	public static final int STATUS_CODE_QUESTION = 10000;
-	public static final int STATUS_CODE_INFO = 10001;
-	public static final int STATUS_CODE_ERROR = 10002;
-	
-	//preferences
-	public static final String VIEW_ICON_SPACING_X = "icon_spacing_x"; //$NON-NLS-1$
-	public static final String VIEW_ICON_SPACING_Y = "icon_spacing_y"; //$NON-NLS-1$
-	public static final String VIEW_ICON_WIDTH = "icon_width"; //$NON-NLS-1$
-	public static final String VIEW_ICON_HEIGHT = "icon_height"; //$NON-NLS-1$
-	public static final String VIEW_TOOLTIP_SHOWALLTIME = "tt_show_all_time"; //$NON-NLS-1$
-	public static final String VIEW_TOOLTIP_TIMEOUT = "tt_timeout"; //$NON-NLS-1$
-	public static final String VIEW_TOOLTIP_ISWRAP = "tt_iswap"; //$NON-NLS-1$
-	public static final int DEFAULT_VIEW_ICON_SPACING_X = 4;
-	public static final int DEFAULT_VIEW_ICON_SPACING_Y = 4;
-	public static final int DEFAULT_VIEW_ICON_WIDTH = 16;
-	public static final int DEFAULT_VIEW_ICON_HEIGHT = 16;
-	public static final long DEFAULT_VIEW_TOOLTIP = 5000;
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/ILguiSelectionListener.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/ILguiSelectionListener.java
deleted file mode 100644
index d3aaffe..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/ILguiSelectionListener.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Copyright (c) 2009 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial Implementation
- *
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- */
-package org.eclipse.ptp.rm.lml.ui;
-
-import org.eclipse.jface.viewers.ISelection;
-
-public interface ILguiSelectionListener {
-	/**
-	 * Notify the listener that a resource manager has been selected as the
-	 * default
-	 * 
-	 * @param rm
-	 *            selected resource manager
-	 * @since 5.0
-	 */
-	public void setDefault(Object rm);
-
-	/**
-	 * Notify the listener that the selection has changed in the RM view
-	 * 
-	 * @param selection
-	 *            new selection
-	 */
-	public void selectionChanged(ISelection selection);
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/IRuntimeModelPresentation.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/IRuntimeModelPresentation.java
deleted file mode 100644
index bb0ffd1..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/IRuntimeModelPresentation.java
+++ /dev/null
@@ -1,29 +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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.ui;
-
-import org.eclipse.swt.graphics.Image;
-
-
-public interface IRuntimeModelPresentation {
-	/*
-	 * Returns an image for the element, or null if a default image should be used.
-	 */
-	public Image getImage(Object element);
-	
-	/*
-	 * Returns a label for the element, or null if a default label should be used.
-	 */
-	public String getText(Object element);
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/LMLUIPlugin.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/LMLUIPlugin.java
deleted file mode 100644
index e0cb40e..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/LMLUIPlugin.java
+++ /dev/null
@@ -1,186 +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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.ui;
-
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ptp.rm.lml.core.util.DebugUtil;
-import org.eclipse.ptp.rm.lml.ui.managers.ViewManager;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-public class LMLUIPlugin extends AbstractUIPlugin{
-	public static final String PLUGIN_ID = "org.eclipse.ptp.rm.lml.ui"; //$NON-NLS-1$
-	public static final String RUNTIME_MODEL_PRESENTATION_EXTENSION_POINT_ID = "runtimeModelPresentations"; //$NON-NLS-1$
-
-	// The shared instance.
-	private static LMLUIPlugin plugin;
-
-	/**
-	 * Get the currently active workbench page from the active workbench window.
-	 * 
-	 * @return currently active workbench page
-	 */
-	public static IWorkbenchPage getActivePage() {
-		IWorkbenchWindow w = getActiveWorkbenchWindow();
-		if (w != null) {
-			return w.getActivePage();
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the currently active workbench window
-	 * 
-	 * @return the active workbench window
-	 */
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		return getDefault().getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static LMLUIPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Get the display instance.
-	 * 
-	 * @return the display instance
-	 */
-	public static Display getDisplay() {
-		Display display = Display.getCurrent();
-		if (display == null) {
-			display = Display.getDefault();
-		}
-		return display;
-	}
-
-	/**
-	 * Get a unique identifier for this plugin (used for logging)
-	 * 
-	 * @return unique identifier
-	 */
-	public static String getUniqueIdentifier() {
-		if (getDefault() == null)
-			return PLUGIN_ID;
-
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	/**
-	 * Generate a log message given an IStatus object
-	 * 
-	 * @param status
-	 *            IStatus object
-	 */
-	public static void log(IStatus status) {
-		getDefault().getLog().log(status);
-	}
-
-	/**
-	 * Generate a log message
-	 * 
-	 * @param msg
-	 *            message to log
-	 */
-	public static void log(String msg) {
-		log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, msg, null));
-	}
-
-	/**
-	 * Generate a log message for an exception
-	 * 
-	 * @param e
-	 *            exception used to generate message
-	 */
-	public static void log(Throwable e) {
-		log(new Status(IStatus.ERROR, getUniqueIdentifier(), ILMLUIConstants.INTERNAL_ERROR, "Internal Error", e)); //$NON-NLS-1$
-	}
-
-	// Resource bundle.
-	private final HashMap<String, IRuntimeModelPresentation> runtimeModelPresentations = new HashMap<String, IRuntimeModelPresentation>();
-	private ViewManager lguiManager = null;
-
-	public LMLUIPlugin() {
-		super();		
-		plugin = this;
-		
-	}
-
-	/**
-	 * Get the RM manager instance
-	 * 
-	 * @return RM manager
-	 */
-	public ViewManager getLguiManager() {
-		return lguiManager;
-	}
-	
-	/**
-	 * Get the runtime model presentation for the given resource manager
-	 * 
-	 * @param id
-	 *            resource manager ID
-	 * @return runtime model presentation
-	 */
-	public IRuntimeModelPresentation getRuntimeModelPresentation(String id) {
-		return runtimeModelPresentations.get(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext
-	 * )
-	 */
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		DebugUtil.configurePluginDebugOptions();
-		lguiManager = new ViewManager();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext
-	 * )
-	 */
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		lguiManager.shutdown();
-		lguiManager = null;
-		plugin = null;
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/UIUtils.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/UIUtils.java
deleted file mode 100644
index 5c83abe..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/UIUtils.java
+++ /dev/null
@@ -1,199 +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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschunszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.ui;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.ptp.rm.lml.core.LMLCorePlugin;
-import org.eclipse.ptp.rm.lml.ui.messages.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.WorkbenchException;
-
-public class UIUtils {
-	public static final int NORMAL = 0;
-	public static final int ASYNC = 1;
-
-	protected static void showDialog(final Shell shell, final String title, final String message, final int style) {
-		MessageBox dialog = new MessageBox(shell, style);
-		dialog.setMessage(message);
-		dialog.setText(title);
-		dialog.open();
-	}
-
-	protected static void showDialogAsync(final Shell shell, final String title, final String message, final int style) {
-		shell.getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				showDialog(shell, title, message, style);
-			}
-		});
-	}
-
-	public static void showWarningDialog(final Shell shell, final String title, final String message, int flag) {
-		if (flag == NORMAL)
-			showDialog(shell, title, message, SWT.ICON_WARNING | SWT.OK);
-		else
-			showDialogAsync(shell, title, message, SWT.ICON_WARNING | SWT.OK);
-	}
-
-	public static void showInformationDialog(final Shell shell, final String title, final String message, int flag) {
-		if (flag == NORMAL)
-			showDialog(shell, title, message, SWT.ICON_INFORMATION | SWT.OK);
-		else
-			showDialogAsync(shell, title, message, SWT.ICON_INFORMATION | SWT.OK);
-	}
-
-	public static void showErrorDialog(final Shell shell, final String title, final String message, int flag) {
-		if (flag == NORMAL)
-			showDialog(shell, title, message, SWT.ICON_ERROR | SWT.OK);
-		else
-			showDialogAsync(shell, title, message, SWT.ICON_ERROR | SWT.OK);
-	}
-
-	// IStatus can be retrieved from CoreException e.getStatus()
-	public static void showDetailErrorDialog(final Shell shell, final String title, final String message, final IStatus status) {
-		shell.getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				ErrorDialog.openError(shell, title, message, status);
-			}
-		});
-	}
-
-	public static void showErrorDialog(final String title, final String message, final IStatus status) {
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				final Shell shell = Display.getDefault().getActiveShell();
-				if (status == null)
-					MessageDialog.openError(shell, title, message);
-				else
-					ErrorDialog.openError(shell, title, message, status);
-			}
-		});
-	}
-
-	public static boolean showQuestionDialog(final String title, final String message) {
-		final Shell shell = Display.getDefault().getActiveShell();
-		return MessageDialog.openQuestion(shell, title, message);
-	}
-
-	public static void showView(final String viewID) {
-		BusyIndicator.showWhile(null, new Runnable() {
-			public void run() {
-				Display.getDefault().syncExec(new Runnable() {
-					public void run() {
-						try {
-							displayView(viewID);
-						} catch (NullPointerException e) {
-							System.out.println("Show View err: " + e.getMessage()); //$NON-NLS-1$
-						}
-					}
-				});
-			}
-		});
-	}
-
-	public static void switchPerspectiveTo(final String perspectiveID) {
-		Display.getDefault().syncExec(new Runnable() {
-			public void run() {
-				IWorkbenchPage page = getActivePage();
-				if (page.getPerspective().getId().equals(perspectiveID))
-					return;
-				IWorkbench bench = LMLUIPlugin.getDefault().getWorkbench();
-				try {
-					bench.showPerspective(perspectiveID, LMLUIPlugin.getActiveWorkbenchWindow());
-				} catch (WorkbenchException e) {
-					showErrorDialog(Messages.UIUtils_1, Messages.UIUtils_2 + perspectiveID, e.getStatus());
-				}
-			}
-		});
-	}
-
-	public static IWorkbenchPage getActivePage() {
-		return LMLUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
-	}
-
-	public static void displayView(String viewID) throws NullPointerException {
-		IWorkbenchPage page = getActivePage();
-		try {
-			page.showView(viewID);
-		} catch (PartInitException e) {
-			showErrorDialog(Messages.UIUtils_3, Messages.UIUtils_4 + viewID, e.getStatus());
-		}
-	}
-
-	public static IViewPart findView(String viewID) {
-		IWorkbenchPage page = getActivePage();
-		return page.findView(viewID);
-	}
-
-	public static void closeView(String viewID) {
-		IViewPart viewPart = findView(viewID);
-		if (viewPart == null)
-			return;
-		viewPart.dispose();
-	}
-
-	public static void safeRunAsyncInUIThread(final ISafeRunnable safeRunnable) {
-		if (LMLUIPlugin.getDisplay().isDisposed()) {
-			try {
-				safeRunnable.run();
-			} catch (Exception e) {
-				LMLCorePlugin.log(e);
-			}
-		} else {
-			LMLUIPlugin.getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					SafeRunnable.run(safeRunnable);
-				}
-			});
-		}
-	}
-
-	/**
-	 * @since 5.0
-	 */
-	public static void safeRunSyncInUIThread(final ISafeRunnable safeRunnable) {
-		if (LMLUIPlugin.getDisplay().isDisposed()) {
-			try {
-				safeRunnable.run();
-			} catch (Exception e) {
-				LMLCorePlugin.log(e);
-			}
-		} else {
-			LMLUIPlugin.getDisplay().syncExec(new Runnable() {
-				public void run() {
-					SafeRunnable.run(safeRunnable);
-				}
-			});
-		}
-	}
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/actions/AddLguiAction.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/actions/AddLguiAction.java
deleted file mode 100644
index 79741bc..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/actions/AddLguiAction.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Foprschungszentrum Juelich GmbH
- *******************************************************************************/
-
-package org.eclipse.ptp.rm.lml.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.ptp.rm.lml.ui.messages.Messages;
-import org.eclipse.ptp.rm.lml.ui.wizards.SelectFilesWizard;
-import org.eclipse.swt.widgets.Shell;
-
-public class AddLguiAction extends Action {
-	
-	private final Shell shell;
-
-	public AddLguiAction(Shell shell) {
-		super(Messages.AddLguiAction);
-		this.shell = shell;
-	}
-
-	public void dispose() {
-	}
-
-	public void run() {
-		final SelectFilesWizard wizard = new SelectFilesWizard();
-		
-		final WizardDialog dialog = new WizardDialog(shell, wizard);
-		int status = dialog.open();
-		if (status != Dialog.OK) {
-			return;
-		}
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-	
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/actions/RemoveLguiAction.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/actions/RemoveLguiAction.java
deleted file mode 100644
index 9c9d382..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/actions/RemoveLguiAction.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Foprschungszentrum Juelich GmbH
- *******************************************************************************/
-
-package org.eclipse.ptp.rm.lml.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ptp.rm.lml.core.LMLCorePlugin;
-import org.eclipse.ptp.rm.lml.ui.messages.Messages;
-import org.eclipse.swt.widgets.Shell;
-
-public class RemoveLguiAction extends Action{
-
-	private final Shell shell;
-
-	public RemoveLguiAction(Shell shell) {
-		super(Messages.RemoveLguiAction_0);
-		this.shell = shell;
-	}
-
-	public void dispose() {
-	}
-
-	public void run() {
-		String lguiName = LMLCorePlugin.getDefault().getLMLManager().getSelectedLguiItem().toString();
-		boolean remove = MessageDialog.openConfirm(shell, Messages.RemoveLguiAction_0,
-				Messages.RemoveLguiAction_1 + lguiName);
-		
-		if (remove) {
-			LMLCorePlugin.getDefault().getLMLManager().removeLgui(lguiName);
-		}
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-	
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/actions/TableViewPullDownMenuAction.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/actions/TableViewPullDownMenuAction.java
deleted file mode 100644
index c1e83e3..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/actions/TableViewPullDownMenuAction.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch
- */
-package org.eclipse.ptp.rm.lml.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Display;
-
-public class TableViewPullDownMenuAction extends Action {
-	
-	public TableViewPullDownMenuAction(String name) {
-		setText(name);
-	}
-	
-	public void run() {
-		MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Click!", "There will be an update and an additional tablecolumn ("+ getText()+") will be seen");
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/actions/UpdateLguiAction.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/actions/UpdateLguiAction.java
deleted file mode 100644
index 188154b..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/actions/UpdateLguiAction.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-package org.eclipse.ptp.rm.lml.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ptp.rm.lml.ui.messages.Messages;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Shell;
-
-public class UpdateLguiAction extends Action{
-
-	private final Shell shell;
-
-	public UpdateLguiAction(Shell shell) {
-		super(Messages.UpdateLguiAction_0);
-		this.shell = shell;
-	}
-
-	public void dispose() {
-	}
-
-	public void run() {
-		MessageBox messageBox = new MessageBox(shell);
-		messageBox.setMessage("Later there will be an update");
-		messageBox.open();
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-	
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/managers/ViewManager.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/managers/ViewManager.java
deleted file mode 100644
index d5d4361..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/managers/ViewManager.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/**
- * Copyright (c) 2009 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial Implementation
- *
- * Modified by:
- * 		Claudia Konbloch, Forschungszentrum Juelich GmbH
- */
-
-package org.eclipse.ptp.rm.lml.ui.managers;
-
-import org.eclipse.ptp.rm.lml.core.ILMLManager;
-import org.eclipse.ptp.rm.lml.core.LMLCorePlugin;
-import org.eclipse.ptp.rm.lml.core.events.ILguiAddedEvent;
-import org.eclipse.ptp.rm.lml.core.events.ILguiRemovedEvent;
-import org.eclipse.ptp.rm.lml.core.events.ILguiSelectedEvent;
-import org.eclipse.ptp.rm.lml.core.listeners.IViewListener;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.ui.ILMLUIConstants;
-import org.eclipse.ptp.rm.lml.ui.LMLUIPlugin;
-import org.eclipse.ptp.rm.lml.ui.providers.LMLViewPart;
-import org.eclipse.ptp.rm.lml.ui.views.TableView;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-
-public class ViewManager {
-	
-	public class ViewListener implements IViewListener {
-
-		public void handleEvent(ILguiAddedEvent e) {
-			deleteOldViews();
-			selectedLgui = e.getLguiItem();
-			generateNewViews();
-		}
-
-		public void handleEvent(ILguiRemovedEvent e) {
-				
-		}
-
-		public void handleEvent(ILguiSelectedEvent e) {
-			deleteOldViews();
-			selectedLgui = e.getLguiItem();
-			if (selectedLgui != null) {
-				generateNewViews();
-			}
-		}
-		
-	}
-	
-	protected ILguiItem selectedLgui = null;
-	
-	public ILMLManager lmlManager = null;
-	
-	public IViewListener viewListener = new ViewListener();
-	
-	public int viewsAtStart = 0;
-	
-	
-	public ViewManager() {
-		lmlManager = LMLCorePlugin.getDefault().getLMLManager();
-		lmlManager.addListener(viewListener);
-	}
-	
-	public void shutdown() {
-		lmlManager.removeListener(viewListener);
-	}
-	
-	private void deleteOldViews() {
-		if (selectedLgui == null) {
-			return;
-		}
-		IWorkbenchPage activePage = LMLUIPlugin.getActiveWorkbenchWindow().getActivePage();
-		IViewReference[] views = activePage.getViewReferences();
-		
-		for (IViewReference view : views) {
-			if(!view.getPartName().equals("LML")) {
-				if (view.getView(false) instanceof LMLViewPart) {
-					((LMLViewPart) view.getView(false)).prepareDispose();
-				}
-				activePage.hideView(view);
-				view = null;
-			}
-		}	
-	}
-	
-	public void setViewsAtStart() {
-		viewsAtStart = LMLUIPlugin.getActivePage().getViewReferences().length - 1;
-	}
-	
-	private void generateNewViews() {
-		IWorkbenchPage activePage = LMLUIPlugin.getActiveWorkbenchWindow().getActivePage();
-		for (int i = 0; i < selectedLgui.getTableHandler().getNumberOfTables();  i++) {
-			try {
-				IViewPart view = activePage.showView(ILMLUIConstants.VIEW_TABLE, Integer.toString(i), activePage.VIEW_VISIBLE);
-				((TableView) view).generateTable(i);
-				view.setFocus();
-			} catch (PartInitException e) {
-				e.printStackTrace();
-			}
-		}
-		for (int i = 0; i < selectedLgui.getNodedisplayAccess().getNodedisplayNumbers(); i ++) {
-			try {
-				activePage.showView(ILMLUIConstants.VIEW_PARALLELNODES, Integer.toString(i), activePage.VIEW_VISIBLE);
-			} catch (PartInitException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/messages/Messages.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/messages/Messages.java
deleted file mode 100644
index ab42509..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/messages/Messages.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-package org.eclipse.ptp.rm.lml.ui.messages;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rm.lml.ui.messages.messages"; //$NON-NLS-1$
-	public static String AddLguiAction;
-	public static String RemoveLguiAction_0;
-	public static String RemoveLguiAction_1;
-	public static String UIUtils_1;
-	public static String UIUtils_2;
-	public static String UIUtils_3;
-	public static String UIUtils_4;
-	public static String UpdateLguiAction_0;
-	
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/messages/messages.properties b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/messages/messages.properties
deleted file mode 100644
index dc134ee..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/messages/messages.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-AddLguiAction = Add Lgui...
-RemoveLguiAction_0=Remove Lgui
-RemoveLguiAction_1=Are you sure you want to remove the following lgui:
-UIUtils_1 = Display Error
-UIUtils_2 = Cannot switch Perspective to: 
-UIUtils_3 = Display Error
-UIUtils_4 = Cannot show View ID:
-UpdateLguiAction_0 = Update Lgui
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/BorderComposite.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/BorderComposite.java
deleted file mode 100644
index 05a45ee..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/BorderComposite.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.ui.providers;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * This is a composite with a border. The border's width can be altered at runtime.
- * The same for background-color. This composite uses a FillLayout as layout. 
- *
- */
-public class BorderComposite extends Composite{
-	
-	/**
-	 * The used layout for this composite
-	 */
-	private FillLayout filllayout;
-	
-	/**
-	 * Create a composite with black border. The border has width 1 px in every direction.
-	 * @param parent parent composite
-	 * @param style SWT-style
-	 */
-	public BorderComposite(Composite parent, int style){
-		super(parent, style);
-		
-		filllayout=new FillLayout();
-		filllayout.marginWidth=1;
-		filllayout.marginHeight=1;
-		
-		setLayout(filllayout);
-		
-		setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
-	}
-	
-	/**
-	 * Set the border's color
-	 * @param c SWT-color for the border
-	 */
-	public void setBorderColor(Color c){
-		setBackground(c);
-	}
-	
-	/**
-	 * Alter width of border
-	 * @param width border-width
-	 */
-	public void setBorderWidth(int width){
-		filllayout.marginHeight=width;
-		filllayout.marginWidth=width;
-		
-		this.layout(true);
-	}
-	
-
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/BorderLayout.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/BorderLayout.java
deleted file mode 100644
index 203d9e3..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/BorderLayout.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.ui.providers;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Layout;
-
-class BorderLayout extends Layout {
-  public static final int NWFIELD = 0;
-  public static final int NFIELD = 1;
-  public static final int NEFIELD = 2;
-  public static final int WFIELD = 3;
-  public static final int MFIELD = 4;
-  public static final int EFIELD = 5;
-  public static final int SWFIELD = 6;
-  public static final int SFIELD = 7;
-  public static final int SEFIELD = 8;
-
-  public static class BorderData {
-    public int field;
-    
-    public static final BorderData NORTH=new BorderData(NFIELD);
-    public static final BorderData WEST=new BorderData(WFIELD);
-    public static final BorderData EAST=new BorderData(EFIELD);
-    public static final BorderData SOUTH=new BorderData(SFIELD);
-    public static final BorderData CENTER=new BorderData(MFIELD);
-    
-    public static final BorderData NORTHWEST=new BorderData(NWFIELD);
-    public static final BorderData NORTHEAST=new BorderData(NEFIELD);
-    public static final BorderData SOUTHWEST=new BorderData(SWFIELD);
-    public static final BorderData SOUTHEAST=new BorderData(SEFIELD);
-
-    public BorderData() {
-	  this.field = MFIELD;
-    }
-
-    public BorderData(int field) {
-      this.field = field;
-    }
-  }
-
-  Point[] points;
-  Control[] controls;
-  
-  
-  int width;
-  int height;
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.eclipse.swt.widgets.Layout#computeSize(org.eclipse.swt.widgets.Composite,
-   *      int, int, boolean)
-   */
-  protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
-	  if (flushCache || points == null) {
-		  getControlsAndPoints(composite.getChildren(), flushCache);
-	  }
-	  
-	  width = max(
-			  points[NWFIELD].x + points[NFIELD].x + points[NEFIELD].x, 
-			  points[WFIELD].x + points[MFIELD].x + points[EFIELD].x,
-			  points[SWFIELD].x + points[SFIELD].x + points[SEFIELD].x);
-	  height = max(
-			  points[NWFIELD].y + points[NFIELD].y + points[NEFIELD].y, 
-			  points[WFIELD].y + points[MFIELD].y + points[EFIELD].y,
-			  points[SWFIELD].y + points[SFIELD].y + points[SEFIELD].y);
-
-	  return new Point(wHint == SWT.DEFAULT ? width : wHint, hHint == SWT.DEFAULT ? height : hHint);
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.eclipse.swt.widgets.Layout#layout(org.eclipse.swt.widgets.Composite,
-   *      boolean)
-   */
-  protected void layout(Composite composite, boolean flushCache) {
-	  if (flushCache || points == null) {
-		  getControlsAndPoints(composite.getChildren(), flushCache);  
-	  }
-	  Rectangle clientArea = composite.getClientArea();
-
-	  if (controls[NWFIELD] !=  null) {
-		  controls[NWFIELD].setBounds(
-				  clientArea.x, 
-				  clientArea.y, 
-				  points[WFIELD].x, 
-				  points[NFIELD].y);
-	  }
-	  if (controls[NFIELD] != null) {
-		  controls[NFIELD].setBounds(
-				  clientArea.x + points[WFIELD].x, 
-				  clientArea.y, 
-				  clientArea.width - points[WFIELD].x - points[EFIELD].x, 
-				  points[NFIELD].y); 
-	  }
-	  if (controls[NEFIELD] != null) {
-		  controls[NEFIELD].setBounds(
-				  clientArea.x + clientArea.width - points[EFIELD].x, 
-				  clientArea.y, 
-				  points[EFIELD].x, 
-				  points[NFIELD].y); 
-	  }
-	  if (controls[WFIELD] != null) {
-		  controls[WFIELD].setBounds(
-				  clientArea.x, 
-				  clientArea.y + points[NFIELD].y, 
-				  points[WFIELD].x, 
-				  clientArea.height - points[NFIELD].y - points[SFIELD].y); 
-	  }
-	  if (controls[MFIELD] != null) {
-		  controls[MFIELD].setBounds(
-				  clientArea.x + points[WFIELD].x, 
-				  clientArea.y + points[NFIELD].y, 
-				  clientArea.width - points[WFIELD].x - points[EFIELD].x, 
-				  clientArea.height - points[NFIELD].y - points[SFIELD].y); 
-	  }
-	  if (controls[EFIELD] != null) {
-		  controls[EFIELD].setBounds(
-				  clientArea.x + clientArea.width - points[EFIELD].x, 
-				  clientArea.y + points[NFIELD].y, 
-				  points[EFIELD].x, 
-				  clientArea.height - points[NFIELD].y - points[SFIELD].y); 
-	  }
-	  if (controls[SWFIELD] != null) {
-		  controls[SWFIELD].setBounds(
-				  clientArea.x, 
-				  clientArea.y + clientArea.height - points[NFIELD].y, 
-				  points[WFIELD].x, 
-				  points[SFIELD].y); 
-	  }
-	  if (controls[SFIELD] != null) {
-		  controls[SFIELD].setBounds(
-				  clientArea.x + points[WFIELD].x, 
-				  clientArea.y + clientArea.height - points[SFIELD].y, 
-				  clientArea.width - points[WFIELD].x - points[EFIELD].x, 
-				  points[SFIELD].y); 
-	  }
-	  if (controls[SEFIELD] != null) {
-		  controls[SEFIELD].setBounds(
-				  clientArea.x + clientArea.width - points[EFIELD].x, 
-				  clientArea.y + clientArea.height - points[SFIELD].y, 
-				  points[EFIELD].x, 
-				  points[SFIELD].y); 
-	  }
-
-
-  }
-  
-  private int max(int i1, int i2, int i3) {
-	  int j = i1 >= i2 ? i1 : i2;
-	  return j >= i3 ? j : i3;
-  }
-
-  private void getControlsAndPoints(Control[] children, boolean flushCache) {
-	  controls = new Control[9];
-	  points = new Point[9]; 
-	  for (int i = 0; i < children.length; i++) {
-		  BorderData borderData = (BorderData) children[i].getLayoutData();
-		  if (borderData != null &&  borderData.field >= 0 && borderData.field <= 8) {
-			  controls[borderData.field] = children[i];
-			  points[borderData.field] = children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT, flushCache);
-		  }
-	  }
-	  	
-	  for (int i = 0; i < controls.length; i++) {
-		  Control control = controls[i];
-		  if (control == null) {
-			  points[i] = new Point(0, 0);
-		  } 
-	  }
-  }
-
-}
-
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/ColorConversion.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/ColorConversion.java
deleted file mode 100644
index 02353d5..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/ColorConversion.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.ui.providers;
-
-import java.util.HashMap;
-
-import org.eclipse.ptp.rm.lml.internal.core.model.LMLColor;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-
-/**
- * This class is used to convert swing-colors to swt-colors.
- * The created colors are managed by this class. They dont have to
- * be disposed on your own. Just call disposeColors() for disposing all colors
- * when you are finished with using all of them.
- * @author karbach
- *
- */
-public class ColorConversion {
-	
-	//Mapping of integer-id of a color to swt-color-instances
-	//The id is created by red<<16 | green<<8 | blue, so color-values are collected in one Integer
-	private static HashMap<Integer, Color> colormap=new HashMap<Integer, Color>();
-	
-	/**
-	 * Create a integer-ID from three color-values.
-	 * 
-	 * @param red red value 0..255
-	 * @param green green value 0..255
-	 * @param blue blue value 0..255
-	 * @return id identifying this color
-	 */
-	private static int getId(int red, int green, int blue){
-		return red<<16 | green<<8 | blue;
-	}
-	
-	/**
-	 * Create a swt-color defined by red, green and blue color
-	 * values. Take the color from the colormap, if the color was
-	 * already created. Otherwise create a new color
-	 * 
-	 * @param red
-	 * @param green
-	 * @param blue
-	 * @return swt-color defined by the three color-values
-	 */
-	public static Color getColor(int red, int green, int blue){
-		
-		int id=getId(red, green, blue);
-		
-		if(colormap.containsKey(id))
-			return colormap.get(id);
-		
-		Color res=new org.eclipse.swt.graphics.Color(Display.getCurrent(), 
-				red, green, blue );
-		
-		colormap.put(id, res);
-		
-		return res;
-	}
-	
-	/**
-	 * Convert abstract LMLcolor-instance to swt-color.
-	 * @param lmlcolor abstract color instance
-	 * @return corresponding swt-color
-	 */
-	public static Color getColor(LMLColor lmlcolor){
-		return getColor(lmlcolor.getRed(), lmlcolor.getGreen(), lmlcolor.getBlue());
-	}
-	
-	/**
-	 * Delete all colors from memory after usage.
-	 * Call this method, if the colors created by this class
-	 * are not needed any more
-	 */
-	public static void disposeColors(){
-		for (org.eclipse.swt.graphics.Color col:colormap.values()){
-			col.dispose();
-		}
-	}
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/DisplayNode.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/DisplayNode.java
deleted file mode 100644
index a9e761d..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/DisplayNode.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, FZ Juelich
- */
-
-
-package org.eclipse.ptp.rm.lml.ui.providers;
-
-import java.util.ArrayList;
-
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataElement;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplay;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ObjectType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement;
-import org.eclipse.ptp.rm.lml.internal.core.model.LMLColor;
-import org.eclipse.ptp.rm.lml.internal.core.nodedisplay.FastImpCheck;
-import org.eclipse.ptp.rm.lml.internal.core.nodedisplay.LMLCheck;
-import org.eclipse.ptp.rm.lml.internal.core.nodedisplay.LMLCheck.SchemeAndData;
-
-/**
- * A node which is input for the nodedisplaytreepanel
- * 
- * This DisplayNode can be implicitly or explicitly defined
- * (means there could be a data-element for this node, but must not) 
- * 
- * Collects information for one node in the NodedisplayTreePanel
- * @author karbach
- *
- */
-public class DisplayNode implements Comparable<DisplayNode>{
-
-	private String tagname;//What type of Node is this
-	
-	private DataElement data;//Is there an explicit data-element for this node?
-	//otherwise upper-level data-element is saved here
-	
-	private SchemeElement scheme;//corresponding scheme-element
-	
-	private ArrayList<Integer> level;//contains for every level the id-number of this node
-	
-	private SchemeAndData referencedData;//null if this element is placed in a base nodedisplay
-	//contains referenced scheme and data-elements given by refid
-	
-	private Nodedisplay nodedisplay;//model for surrounding nodedisplay, needed for full implicit name
-	
-	private ILguiItem lml;//LML-data-manager
-	
-	/**
-	 * Generate a DisplayNode just from its implicit name
-	 * @param plml wrapper instance around LguiType-instance -- provides easy access to lml-information
-	 * @param impname implicit name identifying a node within the tree
-	 * @param model Nodedisplay as data-root
-	 * @return DisplayNode for this implicit name
-	 */
-	public static DisplayNode getDisplayNodeFromImpName(ILguiItem plml, String impname, Nodedisplay model) {
-		ArrayList<Integer> ids = new ArrayList<Integer>();
-		ids = FastImpCheck.impnameToOneLevel(impname, model.getScheme(), ids);
-		
-		if (ids == null) {
-			return null;//Name could not be converted into ids
-		}
-		
-		//Goes as far as data and scheme are available
-		SchemeAndData schemedata = LMLCheck.getSchemeAndDataByLevels(LMLCheck.copyArrayList(ids), model.getData(), model.getScheme());
-		//Goes down to exactly the scheme where this node is defined by
-		SchemeElement scheme = LMLCheck.getSchemeByLevels(LMLCheck.copyArrayList(ids), model.getScheme());
-		
-		if (schemedata == null || scheme == null) {
-			return null;//No scheme and data found for these ids => impname not allowed in this nodedisplay
-		}
-		
-		return new DisplayNode(plml, scheme.getTagname(), schemedata.data, scheme, ids, model);
-	}
-	
-	/**
-	 * @param plml wrapper instance around LguiType-instance -- provides easy access to lml-information
-	 * @param ptag tagname-attribute for this DisplayNode
-	 * @param pdata data-tag-reference, which gives information for this DisplayNode
-	 * @param pscheme scheme-tag-reference, which gives information for this DisplayNode
-	 * @param plevel list of ids, which identify this node on every level of the lml-tree
-	 * @param pnodedisplay surrounding lml-nodedisplay-instance. This DisplayNode is a physical part of the nodedisplay.
-	 */
-	public DisplayNode(ILguiItem plml, String ptag, DataElement pdata, SchemeElement pscheme, ArrayList<Integer> plevel, Nodedisplay pnodedisplay) {
-		lml = plml;
-		
-		data = pdata;
-		
-		tagname = ptag;
-		
-		scheme = pscheme;
-		//Deep copy of plevel-numbers
-		level = new ArrayList<Integer>();
-		if (plevel != null) {
-			for (int i = 0; i < plevel.size(); i++){
-				level.add(plevel.get(i));
-			}
-		}
-		
-		nodedisplay = pnodedisplay;
-	}
-	
-	//Defined by refid
-	/**
-	 * Set referenced data of this DisplayNode. This is only needed
-	 * for Nodedisplay-References
-	 * @param pref collects scheme- and data in one instance
-	 */
-	public void setReferencedData(SchemeAndData pref) {
-		referencedData = pref;
-	}
-	
-	/**
-	 * Call this method only for Nodedisplay-references
-	 * @return combined scheme- and data-reference
-	 */
-	public SchemeAndData getReferencedData() {
-		return referencedData;
-	}
-	
-	/**
-	 * @return corresponding color for this data-Element
-	 */
-	public LMLColor getObjectColor() {
-		
-		ObjectType refob = getConnectedObject();
-		
-		if (refob == null)  {
-			return lml.getOIDToObject().getColorById(null);
-		}
-		
-		return lml.getOIDToObject().getColorById(refob.getId());
-	}
-	
-	/**
-	 * @return Depth in the data-tree where to find this node
-	 */
-	public int getLevel() {
-		return level.size();
-	}
-	
-	/**
-	 * @return Object which is connected with this node through oid or refid
-	 */
-	public ObjectType getConnectedObject() {
-		//Return referenced object
-		if (referencedData != null) {
-			if (referencedData.data != null) {
-				return lml.getOIDToObject().getObjectById(referencedData.data.getOid());
-			}
-		}
-		
-		if (data == null) {
-			return null;
-		}
-		return lml.getOIDToObject().getObjectById(data.getOid());
-	}
-	
-	//Create a nice output for a displaynode
-	public String toString() {
-		if (scheme != null && level.size() > 0) {
-			String impname = String.format( scheme.getMask(), level.get(level.size()-1));
-			
-			String connection = "";
-			String refid = "";
-			
-			if (data != null) {
-				if (data.getOid() != null) {
-					connection = data.getOid() + " ";
-				}
-				if (data.getRefid() != null) {
-					refid = data.getRefid();
-				}
-			}
-			
-			if (referencedData != null) {
-				connection = referencedData.data.getOid() + " ";
-			}
-			
-			return impname + " " + connection + refid;
-		}
-		else {
-			return tagname;
-		}
-	}
-	
-	/**
-	 * @return relative name of referenced data-element just for last level
-	 */
-	public String getImplicitName() {
-		if (scheme == null) {
-			return "";
-		}
-		return LMLCheck.getLevelName(scheme, level.get(level.size()-1));
-	}
-	
-	/**
-	 * Generates a name, which identifies the referenced physical element
-	 * in the whole lml-tree.
-	 * @return absolute name of the element within the tree
-	 */
-	public String getFullImplicitName() {
-		if (nodedisplay == null ) {
-			return getImplicitName();
-		}
-		return LMLCheck.getImplicitName( LMLCheck.copyArrayList(level) , nodedisplay.getScheme());
-	}
-	
-	/**
-	 * @return referenced scheme-element, by which this DisplayNode is defined in nodedisplay
-	 */
-	public SchemeElement getScheme() {
-		return scheme;
-	}
-	
-	/**
-	 * @return referenced data-element, by which this DisplayNode's data is defined in nodedisplay
-	 */
-	public DataElement getData() {
-		return data;
-	}
-	
-	/**
-	 * @return list of ids, which identify this DisplayNode on every level
-	 */
-	public ArrayList<Integer> getLevelNrs() {
-		return level;
-	}
-
-	//Make this DisplayNode comparable to other DisplayNodes
-	//This is mainly used to identify equality
-	public int compareTo(DisplayNode o) {
-		
-		if (o.level == null) {
-			if (level == null) {
-				return 0;
-			}
-			else {
-				return 1;
-			}
-		}
-		
-		if (level == null) {
-			return -1;
-		}
-		
-		if (level.size() != o.level.size() ) {
-			return level.size() - o.level.size();
-		}
-		
-		for (int i = 0; i < level.size(); i++){
-			if(level.get(i) != o.level.get(i)){
-				return level.get(i) - o.level.get(i);
-			}
-		}
-		
-		return 0;
-	}
-	
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/ImageComp.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/ImageComp.java
deleted file mode 100644
index 8dcb06c..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/ImageComp.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.ui.providers;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.HashMap;
-
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * SWT-Conversion of class ImagePanel
- * 
- * Just a composite with an background image loaded from an url
- */
-public class ImageComp extends Composite {
-	
-	private Image img;//Image which is painted on this Composite
-	
-	private static HashMap<URL, Image> urlToImage = new HashMap<URL, Image>();
-	
-	private double prefwidth, prefheight;//Preferred with and height 0..1 in percentage of parent component
-	
-	/**
-	 * @param parent parent Component
-	 * @param style SWT-Style
-	 * @param imageurl url of background image
-	 * @param pwidth preferred percentage width 0..1
-	 * @param pheight preferred percentage height 0..1
-	 * @throws IOException
-	 */
-	public ImageComp(Composite parent, int style, URL imageurl, double pwidth, double pheight) throws IOException {
-		
-		super(parent, style );
-		
-		if (urlToImage.containsKey(imageurl)) {
-			init(urlToImage.get(imageurl));
-		}
-		else {
-			Image img = new Image(Display.getCurrent(), imageurl.openConnection().getInputStream());
-			urlToImage.put(imageurl, img);
-			init(img);
-		}
-		
-		setPreferredPercentageSize(pwidth, pheight);
-	}
-	
-	/**
-	 * Set percentage values for height an width
-	 * Defines dimensions of pictures
-	 * @param pwith
-	 * @param pheight
-	 */
-	public void setPreferredPercentageSize(double pwidth, double pheight) {
-		prefwidth = pwidth;
-		prefheight = pheight;
-	}
-	
-	
-	public Point computeSize(int wHint, int hHint) {
-		
-		return computeSize(wHint, hHint, true);
-	}
-	
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		
-		Point psize = this.getParent().getSize();//size of parent component
-		
-		return new Point( (int)Math.round(psize.x*prefwidth), (int)Math.round(psize.y*prefheight) );
-	}
-	
-	
-	
-	/**
-	 * @param parent from Composite constructor
-	 * @param style from Composite constructor
-	 * @param pimg Image-instance
-	 * @throws IOException
-	 */
-	public void init(Image pimg) {
-
-		setLayout(new FillLayout());
-
-		img = pimg;
-		
-		//Paint image if component is painted
-		addPaintListener(new PaintListener() {
-
-			public void paintControl(PaintEvent e) {
-
-				e.gc.drawImage(img, 0, 0, img.getBounds().width, img.getBounds().height,
-						0, 0, getSize().x, getSize().y);
-
-			}
-		});
-
-	}
-	
-	public Image getImage() {
-		return img;
-	}
-	
-	public static void disposeAll() {
-		for (Image img: urlToImage.values()) {
-			img.dispose();
-		}
-		urlToImage.clear();
-	}
-	
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/LMLJobsTableLabelProvider.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/LMLJobsTableLabelProvider.java
deleted file mode 100644
index f19dd09..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/LMLJobsTableLabelProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch
- */
-package org.eclipse.ptp.rm.lml.ui.providers;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.ptp.rm.lml.internal.core.elements.CellType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.RowType;
-import org.eclipse.swt.graphics.Image;
-
-public class LMLJobsTableLabelProvider extends LabelProvider implements ITableLabelProvider{
-
-	@Override
-	public Image getColumnImage(Object element, int index) {
-		return null;
-	}
-
-	@Override
-	public String getColumnText(Object element, int index) {
-		RowType row = (RowType) element;
-		List<CellType> cells = row.getCell();
-		String returnValue = cells.get(index).getValue();
-		return returnValue;
-	}
-
-	
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/LMLListLabelProvider.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/LMLListLabelProvider.java
deleted file mode 100644
index 2c4aab3..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/LMLListLabelProvider.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch
- */
-package org.eclipse.ptp.rm.lml.ui.providers;
-
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.internal.core.model.LguiItem;
-import org.eclipse.swt.graphics.Image;
-
-public class LMLListLabelProvider extends LabelProvider {
-
-	public String getText(Object obj) {
-		return (String) obj;
-	}
-	
-	
-	public Image getImage(Object obj, int index) {
-		return null;
-	}
-	
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/LMLViewPart.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/LMLViewPart.java
deleted file mode 100644
index 8bc69ab..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/LMLViewPart.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.ui.providers;
-
-import org.eclipse.ui.part.ViewPart;
-
-public abstract class LMLViewPart extends ViewPart{
-	
-	public abstract void prepareDispose();
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/LMLWidget.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/LMLWidget.java
deleted file mode 100644
index 60aefd4..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/LMLWidget.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, Claudia Knobloch, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.ui.providers;
-
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.swt.widgets.Composite;
-
-
-/**
- * This class is super-class of all Composites showing LML-components with SWT. Every Composite
- * administrates an instance of LML to access important data in an
- * easy way. Every component should initialize the lml-instance by calling
- * the LMLWidget-constructor.
- */ 
-public class LMLWidget extends Composite{
-	
-	private static final long serialVersionUID = 1L;
-	
-	protected ILguiItem lguiItem;//wrapper instance around LguiType-instance -- provides easy access to lml-information
-	
-	/**
-	 * Create the smallest possible LMLWidget by passing the lml-model
-	 * wrapper class plml, which manages all important data.
-	 * 
-	 * @param lguiItem LML-Manager
-	 * @param parent parent of this component
-	 * @param style SWT-Style
-	 */
-	public LMLWidget(ILguiItem lguiItem, Composite parent, int style){
-		super(parent, style);
-		this.lguiItem = lguiItem;
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/NodedisplayComp.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/NodedisplayComp.java
deleted file mode 100644
index a53d181..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/providers/NodedisplayComp.java
+++ /dev/null
@@ -1,1117 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, Claudia Knobloch, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.ui.providers;
-
-import java.io.IOException;
-import java.math.BigInteger;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.security.AccessControlException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-
-import javax.swing.ImageIcon;
-
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.internal.core.elements.AlignType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.DataElement;
-import org.eclipse.ptp.rm.lml.internal.core.elements.InfoType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.InfodataType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplay;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplayelement;
-import org.eclipse.ptp.rm.lml.internal.core.elements.NodedisplaylayoutType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ObjectFactory;
-import org.eclipse.ptp.rm.lml.internal.core.elements.ObjectType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.PictureType;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeElement;
-import org.eclipse.ptp.rm.lml.internal.core.elements.SchemeType;
-import org.eclipse.ptp.rm.lml.internal.core.model.LMLColor;
-import org.eclipse.ptp.rm.lml.internal.core.model.NodedisplayAccess;
-import org.eclipse.ptp.rm.lml.internal.core.model.ObjectStatus.Updatable;
-import org.eclipse.ptp.rm.lml.internal.core.nodedisplay.LMLCheck;
-import org.eclipse.ptp.rm.lml.internal.core.nodedisplay.LMLCheck.SchemeAndData;
-import org.eclipse.ptp.rm.lml.ui.views.NodedisplayView;
-import org.eclipse.ptp.rm.lml.ui.providers.BorderLayout;
-import org.eclipse.ptp.rm.lml.ui.providers.BorderLayout.BorderData;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-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;
-
-
-
-/**
- * SWT-Translation of NodedisplayPanel, which is a Swing-Component
- * 
- * Composite to create output of a nodedisplay.
- * 
- * Inner composites are NodedisplayComp again (recursive)
- * 
- * A NodedisplayComp represents one physical element within the nodedisplay-tag.
- * This might be a row, midplane, node or cpu. Through NodedisplayComp the reduced
- * collapsed tree of lml is fully expanded to maxlevel. Every visible component
- * in the nodedisplay is shown by a NodedisplayComp.
- * There is one exception: For performance reasons the lowest-level rectangles are
- * painted directly. So for the rectangles (physical elements) in the lowest level
- * no composites are created.
- * 
- * The look of the nodedisplay is defined by the lml-Nodedisplay-Layout.
-
- */
-public class NodedisplayComp extends LMLWidget implements Updatable{ 
-
-	private NodedisplayView nodeview;//parent composite for zooming
-	
-	//Parameters which are not in apref yet
-	private static int iconwidth=15;
-	
-	private String title;//implicit name of this node
-	private Color jobcolor;//Color of the job, to which this panel is connected
-	
-	private Font fontobject;
-	private Nodedisplay model;//surrounding lml-Nodedisplay
-	
-	private DisplayNode node;//Node-model which has to be displayed
-	private int maxlevel; //Deepest level, which should be displayed
-	
-	private Composite pictureframe;//this panel contains pictures as direct children and the mainpanel in center 
-	private Composite mainpanel;//Important panel where everything but pictures is in
-	
-	private Composite innerpanel;
-	private Label titlelabel;//For title-line
-	
-	//Settings for lower level
-	private Nodedisplayelement apref;
-	
-	//current level, which is displayed
-	private int currentlevel;
-	
-	private GridData gridData;//layout definitions for gridlayouts, makes inner panels resize
-	
-	private Color backgroundcolor;//Current backgroundcolor
-	private Color titlebackgroundcolor;
-	
-	//Borders
-	private BorderComposite borderframe;//The only frame which has a border, borderwidth changes when mouse touches the panel
-	
-	private ArrayList<ImageComp> pictures;
-	private Image centerpic;//Picture in center is special
-	
-	private ArrayList<NodedisplayComp> innercomps;//Save created inner NodedisplayComp-instances for disposing them if needed
-	
-	private static final int httpsport=4444;//Special port for https-access
-	
-	/**
-	 * Class for comparing integer-values in ascending or descending way.
-	 *
-	 */
-	public static class NumberComparator implements Comparator<Integer>{
-
-		private boolean asc;//if true => sort ascending, otherwise descending
-		
-		public NumberComparator(boolean ascending){
-			asc=ascending;
-		}
-		
-		public int compare(Integer o1, Integer o2) {
-			if(asc){
-				return o1-o2;
-			}
-			else return o2-o1;
-		}
-		
-	}
-	
-	public NodedisplayComp(ILguiItem lguiItem, Nodedisplay pmodel, NodedisplayView pnodeview, int style){
-
-		this(lguiItem, pmodel, null, pnodeview, style);
-		
-	}
-	
-	public NodedisplayComp(ILguiItem lguiItem, Nodedisplay pmodel, DisplayNode pnode, NodedisplayView pnodeview, int rellevel, Composite parent, int style){
-		
-		super(lguiItem, parent, style);
-		
-		//Calculate maxlevel with rellevel
-		
-		//Set Preferences
-		calculateCurrentlevel(pnode);
-		
-		maxlevel=currentlevel+rellevel;
-		
-		init(pmodel,pnode, pnodeview);		
-	}
-	
-	public NodedisplayComp(ILguiItem lguiItem, Nodedisplay pmodel, DisplayNode pnode, NodedisplayView pnodeview, int style){
-		
-		super(lguiItem, pnodeview, style);
-		
-		//get maxlevel from lml-file
-		calculateCurrentlevel(pnode);		
-		
-		model=pmodel;
-		node=pnode;
-		
-		apref=findLayout();//Searches for corresponding layout-definitions
-		
-		maxlevel=10;
-		if(apref.getMaxlevel()!=null)
-			maxlevel=apref.getMaxlevel().intValue();
-		
-		init(pmodel, pnode, pnodeview);
-	}
-	
-	/**
-	 * Calculates current level and saves it to currentlevel
-	 * @param pnode
-	 */
-	private void calculateCurrentlevel(DisplayNode pnode){
-		currentlevel=0;
-		if(pnode!=null){
-			currentlevel=pnode.getLevel();
-		}
-	}
-	
-	/**
-	 * @return implicit name of node within nodedisplay, which is shown by this NodedisplayPanel
-	 */
-	public String getShownImpname(){
-		if(node==null)
-			return null;
-		
-		return node.getFullImplicitName();
-	}
-	
-	/**
-	 * Part of constructor, which is equal in two constructors
-	 * therefore outsourced
-	 * @param pmodel
-	 */
-	private void init(Nodedisplay pmodel, DisplayNode pnode, NodedisplayView pnodeview){
-		
-		nodeview=pnodeview;
-		
-		setLayout(new FillLayout());
-		
-		innercomps=new ArrayList<NodedisplayComp>();
-		//Do extra stuff when disposing
-		this.addDisposeListener(new DisposeListener() {
-
-	         public void widgetDisposed(DisposeEvent e) {
-	        	 removeUpdatable();
-	        	 
-	        	 if(titlelabel!=null)
-	        		 titlelabel.dispose();
-	         }
-
-	     });
-		
-		
-		//Transfer parameters
-		node=pnode;
-		model=pmodel;
-		if(apref==null)
-			apref=findLayout();//Searches for corresponding layout-definitions
-		
-//		if(apref.getMaxlevel() != null){//Overwrite maxlevel-definition from upper levels, if maxlevel is defined
-//			maxlevel=apref.getMaxlevel().intValue();
-//		}
-		
-		//Check if maxlevel is bigger than deepest possible level within this scheme-part
-		if(node!=null){
-			//calculation of absolute maximal level within this part of tree
-			//realmax=current node level + deepest possible level
-			int realmax=LMLCheck.getSchemeLevel(node.getScheme()) + LMLCheck.getDeepestSchemeLevel(node.getScheme() ) - 1 ;
-			if(realmax < maxlevel){
-				maxlevel=realmax;
-			}
-		}
-		
-		backgroundcolor=ColorConversion.getColor( LMLColor.stringToColor(apref.getBackground()) );
-		
-		pictureframe=new Composite(this, SWT.None);
-		pictureframe.setLayout(new BorderLayout());
-		//Redo layout when resized
-		pictureframe.addListener(SWT.Resize, new Listener(){
-
-			public void handleEvent(Event event) {
-				pictureframe.layout(true);
-			}
-			  
-		  });
-		
-		insertPictures();
-		
-//		if(centerpic==null)
-//			mainpanel=new JPanel();
-//		else{
-//			ImagePanel picturepanel=new ImagePanel(centerpic.getPic(), centerpic.getPercentWidth(), centerpic.getPercentHeight());
-//			picturepanel.setAlign(centerpic.getAlign());			
-//			
-//			mainpanel=picturepanel;
-//		}
-		
-		mainpanel=new Composite(pictureframe, SWT.None);
-		
-		if(node!=null)
-			jobcolor=ColorConversion.getColor( lguiItem.getOIDToObject().getColorById(node.getData().getOid()) );
-		else jobcolor=ColorConversion.getColor( lguiItem.getOIDToObject().getColorById(null) );
-			
-		fontobject=this.getDisplay().getSystemFont();
-		
-		//Create output
-		mainpanel.setLayout(new BorderLayout());
-		mainpanel.setLayoutData( BorderData.CENTER );
-		
-		//Insert title if needed
-		if(node!=null)
-			title=apref.isShowfulltitle()?node.getFullImplicitName():node.getImplicitName();
-		else title=model.getTitle();
-		
-		//Get an imageicon for showing power load
-		ImageIcon icon=getPowerLoadImageIcon();
-		
-		if(apref.isShowtitle()){
-			
-			titlebackgroundcolor=ColorConversion.getColor( LMLColor.stringToColor(apref.getTitlebackground()) );
-			
-			titlelabel=new Label(mainpanel, SWT.None);
-			titlelabel.setText(title);
-			titlelabel.setFont(fontobject);
-			titlelabel.setBackground(titlebackgroundcolor);
-			titlelabel.setLayoutData(BorderData.NORTH);
-			
-			addZoomFunction();
-			
-//			titlelabel.setOpaque(true);
-
-//			if(icon!=null){
-//				titlelabel.setImage(icon.getImage());
-//			}
-			
-			
-		}
-		
-		innerpanel=null;
-		
-		if(node!=null)
-			insertInnerPanel();
-		else
-			insertInnerPanel(0, model.getScheme(), model.getData(), new ArrayList<Integer>());
-		
-		lguiItem.getObjectStatus().addComponent(this);
-		
-		addListener();
-		
-		pictureframe.setBackground(backgroundcolor);
-
-	}
-	
-	/**
-	 * Remove recursively this component and all inner NodedisplayComp-instances
-	 * from ObjectStatus. Call this function before this Composite is disposed
-	 */
-	private void removeUpdatable(){
-		
-		lguiItem.getObjectStatus().removeComponent(this);
-		
-		for(NodedisplayComp nd:innercomps){
-			nd.removeUpdatable();
-		}
-	}
-	
-	/**
-	 * Add Listener to titlelabel, which allow to zoom in and zoom out
-	 */
-	private void addZoomFunction(){
-		
-		//Zoom in by clicking on title-panels
-		titlelabel.addMouseListener(new MouseListener() {
-			
-			@Override
-			public void mouseUp(MouseEvent e) {
-				// TODO Auto-generated method stub
-				
-			}
-			
-			@Override
-			public void mouseDown(MouseEvent e) {
-				
-				titlelabel.setBackground(titlebackgroundcolor);
-				
-				if(node==null) return;
-				
-				if(nodeview.getRootNodedisplay()==NodedisplayComp.this){
-					nodeview.zoomOut();
-				}
-				else nodeview.zoomIn(node.getFullImplicitName());
-				
-			}
-			
-			@Override
-			public void mouseDoubleClick(MouseEvent e) {
-				// TODO Auto-generated method stub
-				
-			}
-		});
-		
-		titlelabel.addMouseMoveListener(new MouseMoveListener() {
-			
-			public void mouseMove(MouseEvent e) {
-				titlelabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_GREEN));
-			}
-		});
-		
-		titlelabel.addListener(SWT.MouseExit, new Listener(){
-
-			public void handleEvent(Event event) {
-				titlelabel.setBackground(titlebackgroundcolor);
-			}
-		});
-		
-	}
-	
-	/**
-	 * Create an icon which displayes power load
-	 * @return ImageIcon for placing into a title-label
-	 */
-	private ImageIcon getPowerLoadImageIcon(){
-		
-		ImageIcon icon=null;
-		
-		if(lguiItem.getOIDToObject().getObjectById(title) != null){
-			//Show power usage
-			double curpower=0;//current power usage in percent
-			double maxpower=1;//maximal power usage
-			
-			//get power information from info-tags
-			List<InfoType> infos=lguiItem.getOIDToInformation().getInfosById(title);
-			
-			if(infos!=null){				
-				for(InfoType inftype: infos){//<info>
-					List<InfodataType> data=inftype.getData();
-					for(InfodataType date:data){//<data>
-						if( date.getKey().equals("maxpower") ){//<data key="maxpower" value="100"/>
-							maxpower=Double.parseDouble(date.getValue());
-						}
-						else if(date.getKey().equals("curpower")){
-							curpower=Double.parseDouble(date.getValue());
-						}
-					}
-				}
-
-				//Create Buffered Image filled with a pie-chart
-//				PieChart pc=new PieChart(PieChart.anydataToPercentValues(new double[]{maxpower-curpower, curpower}),
-//						new Color[]{Color.gray, getColorForPowerPie(curpower/maxpower)}, null);
-//
-//				BufferedImage bufImage =  new BufferedImage(iconwidth,iconwidth,BufferedImage.TYPE_INT_ARGB );
-//				Graphics g =  bufImage.getGraphics();
-//
-//				pc.paint(g, new Dimension(iconwidth,iconwidth));
-//
-//				icon=new ImageIcon(bufImage);
-			}
-		}
-		
-		return icon;
-	}
-	
-	//Some colors for pie charts presenting power usage
-	private static Color lowcolor=Display.getCurrent().getSystemColor(SWT.COLOR_GREEN), middlecolor=Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW), highcolor=Display.getCurrent().getSystemColor(SWT.COLOR_RED);
-	
-	/**
-	 * 
-	 * @param percent power usage in percent
-	 * @return Color for usage within pie chart, for fast overview of power load
-	 */
-	private static Color getColorForPowerPie(double percent){
-		
-		if(percent<0.3)
-			return lowcolor;
-		
-		if(percent<0.6)
-			return middlecolor;
-		
-		return highcolor;
-	}
-	
-	/**
-	 * Search for pictures in layout-definition and add them at right position
-	 */
-	private void insertPictures(){
-		
-		pictures=new ArrayList<ImageComp>();
-		
-		//insert pictures
-		List<PictureType> lmlpictures=apref.getImg();
-		for(PictureType picture:lmlpictures){
-			
-			URL aurl=null;
-			
-			try{
-				//Get picture from url and put it into a panel
-				try {
-					URL httpURL=new URL(picture.getSrc());
-					aurl = new URL( "https", httpURL.getHost(), httpsport, httpURL.getFile() );
-				} catch (MalformedURLException e) {
-					continue;
-				}
-			}
-			catch(AccessControlException er){
-				aurl=null;
-			}
-			
-			if(aurl==null) continue;
-			
-			ImageComp icomp;
-			try {
-				icomp = new ImageComp(pictureframe, SWT.None, aurl,picture.getWidth(), picture.getHeight());
-			} catch (IOException e) {
-				continue;
-			}
-			
-			if(node==null)
-				icomp.setBackground(backgroundcolor);
-			else icomp.setBackground(this.getParent().getBackground());
-			
-			//Set inner alignment
-//			ipan.setAlign(picture.getInneralign());
-			
-			if( picture.getAlign()==AlignType.CENTER )//Add borderpics to pictures and save center-pic in centerpic-variable
-				centerpic=icomp.getImage();
-			else pictures.add(icomp);
-			
-			switch(picture.getAlign()){
-			case WEST: icomp.setLayoutData(BorderData.WEST);break;
-			case EAST: icomp.setLayoutData(BorderData.EAST);break;
-			case NORTH: icomp.setLayoutData(BorderData.NORTH);break;
-			case SOUTH: icomp.setLayoutData(BorderData.SOUTH);break;
-			}			
-		}
-	}
-	
-	/**
-	 * Search for a layout-section for this nodedisplay-panel
-	 * @return lml-Nodedisplay-layout-section for this displaynode, or default-layout if no layout is defined
-	 */
-	public Nodedisplayelement findLayout(){
-		
-		ArrayList<NodedisplaylayoutType> allnodedisplaylayouts=lguiItem.getNodedisplayAccess().getLayouts(model.getId());
-		
-		//Is there any Layout for this nodedisplay?
-		if( allnodedisplaylayouts==null || allnodedisplaylayouts.size()==0 )
-			return NodedisplayAccess.getDefaultLayout();
-		//Later it should be possible to choose one of possibly multiple defined layouts
-		NodedisplaylayoutType first=allnodedisplaylayouts.get(0);
-		
-		if(node==null){//Root-level => return el0-Nodedisplayelement
-			if(first.getEl0() != null){
-				return first.getEl0();
-			}
-			else return NodedisplayAccess.getDefaultLayout();
-		}
-		
-		if(first.getEl0()==null) return NodedisplayAccess.getDefaultLayout();
-		
-		//Copy level-numbers
-		ArrayList<Integer> levelnrs=LMLCheck.copyArrayList(node.getLevelNrs());
-		
-		//deeper-level => traverse layout-tree
-		Nodedisplayelement res=LMLCheck.getNodedisplayElementByLevels(levelnrs , first.getEl0());
-		
-		if(res==null) return NodedisplayAccess.getDefaultLayout();
-		else return res;
-		
-	}
-	
-	/**
-	 * Add listener which react when user focuses this panel
-	 */
-	public void addListener(){
-		
-		if(currentlevel==maxlevel){
-			
-			MouseMoveListener mousemove=new MouseMoveListener() {
-
-				public void mouseMove(MouseEvent e) {
-					if(node!=null)
-						lguiItem.getObjectStatus().mouseover(node.getConnectedObject());
-				}
-			};
-			
-			MouseListener mouselistener=new MouseListener() {
-				
-				public void mouseUp(MouseEvent e) {
-					if(e.x>=0 && e.x<=getSize().x &&
-							e.y>=0 && e.y<=getSize().y ){
-						if(node!=null)
-							lguiItem.getObjectStatus().mouseup(node.getConnectedObject());					
-					}
-				}
-				
-				@Override
-				public void mouseDown(MouseEvent e) {
-					if(node!=null)
-						lguiItem.getObjectStatus().mousedown(node.getConnectedObject());
-				}
-				
-				public void mouseDoubleClick(MouseEvent e) {
-					// TODO Auto-generated method stub
-					
-				}
-			};
-			
-			Listener mouseexit=new Listener(){
-
-				public void handleEvent(Event event) {
-					lguiItem.getObjectStatus().mouseExitLast();
-				}
-				
-			};
-			
-			borderframe.addMouseMoveListener(mousemove);
-			borderframe.addMouseListener(mouselistener);
-			borderframe.addListener(SWT.MouseExit, mouseexit);
-			
-			innerpanel.addMouseMoveListener(mousemove);
-			innerpanel.addMouseListener(mouselistener);
-			innerpanel.addListener(SWT.MouseExit, mouseexit);
-		}
-		
-		pictureframe.addListener( SWT.Resize,  new Listener () {
-		    public void handleEvent (Event e) {
-		    	resizePictures();
-		      }
-		   });
-		
-	}
-	
-	/**
-	 * Resize pictures after resize of surrounding Panel
-	 */
-	public void resizePictures(){
-		
-		Point asize=getSize();
-		
-		//Resize all inner panels with pictures in it
-//		for(ImagePanel ipan: pictures){
-//			ipan.setPreferredSize(new Dimension( (int)Math.round(ipan.getPercentWidth()*asize.width) ,
-//					 (int)Math.round(ipan.getPercentHeight()*asize.height )));
-//		}
-//		//Also resize centerpic
-//		if(centerpic!=null){
-//			((ImagePanel) mainpanel).setCurrentPictureSize(new Dimension( (int)Math.round(centerpic.getPercentWidth()*asize.width) ,
-//					 (int)Math.round(centerpic.getPercentHeight()*asize.height )));
-//		}
-//		
-//		if(pictures.size()>0 || centerpic!=null){
-//			updateUI();
-//		}
-	}
-	
-	/**
-	 * Find maximum count of elements per level
-	 * Traverses the whole scheme
-	 * @param scheme lml-scheme
-	 * @param level current level (first is 1)
-	 * @param maxcounts array with length at least scheme.depth 
-	 */
-	private static void findMaximum(Object scheme, int level, int[] maxcounts){
-		
-		List subschemes=LMLCheck.getLowerSchemeElements(scheme);
-		
-		int sum=0;
-		
-		for(Object subscheme: subschemes){
-			
-			SchemeElement sub=(SchemeElement)subscheme;
-			
-			if(sub.getList()!=null){//list-attribute
-				sum+=LMLCheck.getNumbersFromNumberlist(sub.getList()).length;
-			}
-			else{//min- max-attributes
-				
-				int min=sub.getMin().intValue();
-				int max=min;
-				if(sub.getMax()!=null){
-					max=sub.getMax().intValue();
-				}
-
-				int step=sub.getStep().intValue();
-				
-				sum+=(max-min)/step+1;
-			}
-			//Recursive call for lower level
-			findMaximum(sub, level+1, maxcounts);
-		}
-		
-		if(sum>0 && sum > maxcounts[level-1]){
-			maxcounts[level-1]=sum;
-		}
-		
-	}
-	
-	
-	/**
-	 * Parses through scheme and generates suitable preferences
-	 * for every level of the nodedisplay-tree
-	 * @param scheme scheme of nodedisplay
-	 * @return preferences for every level
-	 */
-	public static ArrayList<Nodedisplayelement> generatePrefsFromScheme(SchemeType scheme){
-		int depth=LMLCheck.getDeepestSchemeLevel(scheme);
-		
-		ArrayList<Nodedisplayelement> res=new ArrayList<Nodedisplayelement>();
-		ObjectFactory objf=new ObjectFactory();//For creating lml-objects
-	
-		int[] maxcounts=new int[depth];
-		for(int i=0; i<maxcounts.length; i++){
-			maxcounts[i]=0;
-		}
-		//Search for maximum amount of elements defined in scheme
-		findMaximum(scheme, 1, maxcounts);
-		
-		for(int i=0; i<depth; i++){
-			
-			int cols=8;
-			if(maxcounts[i] < cols){
-				cols=maxcounts[i];
-			}
-			
-			Nodedisplayelement apref=objf.createNodedisplayelement();
-			apref.setCols(BigInteger.valueOf(cols));
-			
-			//Only level 1 shows title
-			if(i!=1) apref.setShowtitle(false);
-			//bigger Level-0 gap between level1-panels
-			if(i==0){
-				apref.setHgap(BigInteger.valueOf(3));
-				apref.setHgap(BigInteger.valueOf(4));
-			}
-			
-			res.add(apref);
-		}
-		
-		//For last level, which does not have inner elements
-		res.add(NodedisplayAccess.getDefaultLayout() );
-		
-		return res;
-	}
-	
-	/**
-	 * Generates DisplayNodes for every visible component, which
-	 * is a child of the element identified by the level-ids.
-	 * @param ascheme current lml-scheme describing a node 
-	 * @param adata current lml-data for this node
-	 * @param levels ids for every level to identify a node in the lml-tree (1,1,1) means first cpu in first nodecard in first row
-	 * @param model full LML-Model for a nodedisplay
-	 * @param highestRowfirst defines how the result will be sorted, true=> descending, false ascending
-	 * @return list of DisplayNodes
-	 */
-	public ArrayList<DisplayNode> getLowerDisplayNodes( Object ascheme, Object adata, ArrayList<Integer> levels, Nodedisplay model, boolean highestRowfirst ){
-		
-		int alevel=levels.size();
-		ArrayList<DisplayNode> res=new ArrayList<DisplayNode>();
-		
-		HashMap<Integer, SchemeElement> schemesForIds=new HashMap<Integer, SchemeElement>();
-		
-		ArrayList<Integer> numbers=new ArrayList<Integer>();//Indices within scheme of lower elements
-		List lscheme=LMLCheck.getLowerSchemeElements(ascheme);
-		for(int i=0; i<lscheme.size(); i++){
-
-			//getNumbers
-			SchemeElement lascheme=(SchemeElement)lscheme.get(i);
-			if(lascheme.getList()!=null){//get list-elements
-
-				int[] anumbers=LMLCheck.getNumbersFromNumberlist(lascheme.getList());
-				for(int j=0; j<anumbers.length; j++){
-					numbers.add(anumbers[j]);
-					schemesForIds.put(anumbers[j], lascheme);
-				}
-
-			}
-			else{//min- max-attributes
-
-				int min=lascheme.getMin().intValue();
-				int max=min;
-				if(lascheme.getMax()!=null){
-					max=lascheme.getMax().intValue();
-				}
-
-				int step=lascheme.getStep().intValue();
-
-				for(int j=min; j<=max; j+=step){
-					numbers.add(j);
-					schemesForIds.put(j, lascheme);
-				}
-
-			}
-		}
-		
-
-		Collections.sort(numbers, new NumberComparator(! highestRowfirst));
-
-		//Process numbers
-		for(int j=0; j<numbers.size(); j++){
-			int aid=numbers.get(j);
-			//Get all information for new DisplayNode
-			SchemeAndData schemedata=LMLCheck.getSchemeAndDataByLevels(aid, adata, ascheme);
-
-			DataElement lowdata=schemedata.data;
-
-			if(LMLCheck.getDataLevel(adata) < LMLCheck.getSchemeLevel(ascheme) //Was adata already not at the right level (inheritance of attributes) ?
-					&& adata instanceof DataElement){
-				lowdata=(DataElement)adata;//Then do not go deeper , makes no sense
-			}
-
-			levels.add(aid);
-
-			DisplayNode dispnode=new DisplayNode(lguiItem, lguiItem.getNodedisplayAccess().getTagname(model.getId(), alevel+1),
-					lowdata, schemesForIds.get(aid), levels, model );
-
-			levels.remove(levels.size()-1);
-
-			res.add(dispnode);			
-		}
-		
-		return res;
-		
-	}
-	
-	/**
-	 * A listener, which paints dispnodes within a panel. This is used for the lowest level
-	 * rectangles. It is faster to paint rects than using a gridlayout and inserting nodedisplay-
-	 * composites for every rectangle. Problem is less general layouts (for example: it is more
-	 * difficult to react for cursor-focus on these rectangles, texts as titles have to be painted
-	 * and cant be inserted by using a layout-manager)
-	 *
-	 */
-	private class RectPaintListener implements Listener{
-
-		private ArrayList<DisplayNode> dispnodes;//nodes which are painted in the composite
-		private HashMap<DisplayNode, Color> dispnodetocolor;//map for fast access to displaynode-colors
-		private HashMap<DisplayNode, Rectangle> dispnodetorectangle;//map containing positions of dispnodes, they might change in every paint
-		private int COLUMNCOUNT;//count of columns in the grid
-		private Composite composite;//The composite which is painted by this listener
-		
-		public Color bordercolor=Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
-		
-		public int marginWidth=1;//space around the grid in x-direction
-		public int marginHeight=1;//space around the grid in y-direction
-		public int horizontalSpacing=1;//space between two rectangles in x
-		public int verticalSpacing=1;//space between two rectangles in y
-		
-		public int normalborder=0;//Border shown if displaynodes are not focussed
-		public int mouseborder=1;//Border shown if displaynodes are focussed
-		
-		/**
-		 * Create the listener, initialize attributes and generate dispnodetocolor-map
-		 * @param pdispnodes nodes, which should be painted
-		 * @param pcolumncount count of columns in the grid
-		 * @param pcomposite composite, to which this listener is added
-		 */
-		public RectPaintListener( ArrayList<DisplayNode> pdispnodes, int pcolumncount, Composite pcomposite){
-			dispnodes=pdispnodes;
-			COLUMNCOUNT=pcolumncount;
-			composite=pcomposite;
-			
-			dispnodetocolor=new HashMap<DisplayNode, Color>();
-			for(DisplayNode dispnode:dispnodes){
-				dispnodetocolor.put(dispnode, ColorConversion.getColor(lguiItem.getOIDToObject().getColorById(dispnode.getData().getOid()) ));
-			}
-			
-			dispnodetorectangle=new HashMap<DisplayNode, Rectangle>();
-		}
-		
-		/**
-		 * Pass a relative mouse-position on the composite, which uses this listener.
-		 * Then the displaynode on focus will be returned. If no node is focussed
-		 * null is returned.
-		 * @param px x-position of cursor within the composite
-		 * @param py y-position of cursor within the composite
-		 * @return focussed DisplayNode or null, if nothing is focussed
-		 */
-		public DisplayNode getDisplayNodeAtPos(int px, int py){
-			
-			int x=px-marginWidth;
-			int y=py-marginHeight;
-			
-			if(x<0 || y<0) return null;//Outside grid, left or top
-			
-			if(rectwidth==0 || rectheight==0) return null;
-			
-			int col=x/rectwidth;
-			int row=y/rectheight;
-			
-			if( col >= COLUMNCOUNT || row>=rowcount )//Outside grid, right or bottom
-				return null;
-			
-			int index=row*COLUMNCOUNT+col;
-			
-			if(index>=dispnodes.size())
-				return null;
-			
-			return dispnodes.get(index);			
-		}
-		
-		private int w,h,rowcount,rectwidth,rectheight;//Parameters, which are changed when painting, they can be used by getDisplayNodeAtPos
-		
-		public void handleEvent(Event event) {
-			
-			Point size=composite.getSize();
-			//Generate available size
-			w=size.x-marginWidth*2;
-			h=size.y-marginHeight*2;
-			
-			if(COLUMNCOUNT<=0)
-				COLUMNCOUNT=1;
-			
-			//Calculate how many rows have to be painted
-			rowcount=dispnodes.size() / COLUMNCOUNT;
-			if(dispnodes.size() % COLUMNCOUNT != 0)
-				rowcount++;
-			
-			if(rowcount==0)
-				return;
-			
-			rectwidth=w/COLUMNCOUNT;
-			
-			rectheight=h/rowcount;
-			
-			for(int x=0; x<COLUMNCOUNT; x++){
-				
-				for(int y=0; y<rowcount; y++){
-					//get index of displaynode
-					int index=y*COLUMNCOUNT+x;
-					if(index>=dispnodes.size())
-						break;
-					
-					//Rectangle frame
-					Rectangle r=new Rectangle(marginWidth+rectwidth*x ,  marginHeight+ rectheight*y,
-							rectwidth-horizontalSpacing, rectheight-verticalSpacing);
-					
-					//Paint outer rectangle
-					event.gc.setBackground( bordercolor);
-					event.gc.fillRectangle( r.x, r.y, r.width, r.height );
-					
-					DisplayNode dispnode=dispnodes.get(index);
-					//Paint it
-					if(lguiItem.getObjectStatus().isAnyMousedown() && !lguiItem.getObjectStatus().isMousedown(dispnode.getConnectedObject())){//Change color
-						event.gc.setBackground( ColorConversion.getColor( lguiItem.getOIDToObject().getColorById(null) ) );
-					}
-					else event.gc.setBackground( dispnodetocolor.get(dispnode) );
-					
-					int border=normalborder;
-					
-					if( lguiItem.getObjectStatus().isMouseover(dispnode.getConnectedObject()) ){
-						border=mouseborder;
-					}
-					
-					event.gc.fillRectangle( r.x+border, r.y+border, r.width-2*border, r.height-2*border );
-					
-					dispnodetorectangle.put(dispnode, r);//save the current rectangle 
-				}
-				
-			}
-		}
-		
-	}
-	
-	/**
-	 * Call this function if displaynode != null
-	 */
-	private void insertInnerPanel(){
-		insertInnerPanel(node.getLevel(), node.getScheme(), node.getData(), node.getLevelNrs());
-	}
-	
-	/**
-	 * If inner panels exist and maxlevel is greater than alevel, then insert lower level-panels
-	 */
-	private void insertInnerPanel(int alevel, Object ascheme, Object adata, ArrayList<Integer> levels){
-
-		//At least insert one panel with backgroundcolor as bordercomposite
-		borderframe=new BorderComposite(mainpanel, SWT.NONE);
-		//Bordercolor is defined by this parameter
-		Color bordercolor=ColorConversion.getColor( LMLColor.stringToColor(apref.getBordercolor()) );
-		
-		borderframe.setBorderColor( bordercolor );
-		borderframe.setBorderWidth(apref.getBorder().intValue());
-		borderframe.setLayoutData(BorderData.CENTER);
-		
-		if(maxlevel <= alevel){//Do other panels have to be inserted?
-			innerpanel=new Composite(borderframe, SWT.NONE);
-			innerpanel.setBackground(jobcolor);			
-			return;
-		}
-
-		innerpanel=new Composite(borderframe, SWT.NONE);
-		
-		innerpanel.setBackground(backgroundcolor);
-		
-		if(centerpic!=null){
-			innerpanel.setBackgroundImage(centerpic);
-		}
-		
-		//Generate all displaynodes for elements in lml-tree which are childs of the current node
-		ArrayList<DisplayNode> dispnodes=getLowerDisplayNodes(ascheme, adata, levels, model, apref.isHighestrowfirst());
-		
-		
-		if(alevel==maxlevel-1){//Paint rects instead of use composites for lowest-level-rectangles
-			
-			final RectPaintListener listener= new RectPaintListener(dispnodes, apref.getCols().intValue(), innerpanel);
-			listener.horizontalSpacing=apref.getHgap().intValue();
-			listener.verticalSpacing=apref.getVgap().intValue();
-			
-			listener.normalborder=apref.getBorder().intValue();
-			listener.mouseborder=apref.getMouseborder().intValue();
-			
-			listener.bordercolor=bordercolor;
-			
-			//Add all listeners to the innerpanel now
-			innerpanel.addListener(SWT.Paint, listener);
-			
-			innerpanel.addMouseMoveListener(new MouseMoveListener() {
-				
-				public void mouseMove(MouseEvent e) {
-					
-					DisplayNode focussed=listener.getDisplayNodeAtPos(e.x, e.y);
-					
-					if(focussed!=null)
-						lguiItem.getObjectStatus().mouseover(focussed.getConnectedObject());
-					
-				}
-			});
-			
-			innerpanel.addMouseListener(new MouseListener() {
-				
-				@Override
-				public void mouseUp(MouseEvent e) {
-					DisplayNode focussed=listener.getDisplayNodeAtPos(e.x, e.y);
-					
-					if(focussed!=null)
-						lguiItem.getObjectStatus().mouseup(focussed.getConnectedObject());
-				}
-				
-				@Override
-				public void mouseDown(MouseEvent e) {
-					DisplayNode focussed=listener.getDisplayNodeAtPos(e.x, e.y);
-					
-					if(focussed!=null)
-						lguiItem.getObjectStatus().mousedown(focussed.getConnectedObject());
-				}
-				
-				@Override
-				public void mouseDoubleClick(MouseEvent e) {
-				}
-			});
-			
-			innerpanel.addListener(SWT.MouseExit, new Listener(){
-
-				@Override
-				public void handleEvent(Event event) {
-					lguiItem.getObjectStatus().mouseExitLast();
-				}
-				
-			});
-		}		
-		else{ //insert lower nodedisplays, nest composites
-			
-			//Set Gridlayout only if needed
-			GridLayout layout=new GridLayout(apref.getCols().intValue(), true);
-			layout.horizontalSpacing=apref.getHgap().intValue();
-			layout.verticalSpacing=apref.getVgap().intValue();
-			
-			layout.marginWidth=1;
-			layout.marginHeight=1;
-			
-			innerpanel.setLayout(layout);
-			
-			for(DisplayNode dispnode: dispnodes){
-
-				NodedisplayComp ainner=new NodedisplayComp(lguiItem, model, dispnode, nodeview, maxlevel-currentlevel-1, innerpanel, SWT.NONE);
-				innercomps.add(ainner);
-
-				if(gridData==null){
-					gridData = new GridData();
-					gridData.grabExcessHorizontalSpace = true;
-					gridData.grabExcessVerticalSpace = true;
-					gridData.horizontalAlignment = GridData.FILL;
-					gridData.verticalAlignment = GridData.FILL;
-				}
-
-				ainner.setLayoutData(gridData);
-
-			}
-		}
-	}
-		
-	
-	/**
-	 * Show title or name for this panel
-	 */
-	public void showTitle(){
-		titlelabel.setVisible(true);
-		apref.setShowtitle(true);
-	}
-	
-	/**
-	 * Hide title or name for this panel
-	 */
-	public void hideTitle(){
-		titlelabel.setVisible(false);
-		apref.setShowtitle(false);
-	}
-
-	//Needed for actions at firstpaint, right after reading the lguiItem-model
-	private boolean firstpaint=true;
-	
-	public void updateStatus(ObjectType j, boolean mouseover, boolean mousedown) {
-		
-		if(node==null) return;
-		
-		ObjectType conobject=node.getConnectedObject();
-		if(currentlevel==maxlevel){
-			
-			if(lguiItem.getObjectStatus().isMouseover(conobject)){
-				borderframe.setBorderWidth(apref.getMouseborder().intValue());
-			}
-			else borderframe.setBorderWidth(apref.getBorder().intValue());
-			
-			if(lguiItem.getObjectStatus().isAnyMousedown() && !lguiItem.getObjectStatus().isMousedown(conobject)){//Change color
-				innerpanel.setBackground( ColorConversion.getColor( lguiItem.getOIDToObject().getColorById(null) ) );
-			}
-			else innerpanel.setBackground(jobcolor);
-		}
-		else if(currentlevel==maxlevel-1){//For rectangle-paint of lowest-level-elements
-			innerpanel.redraw();
-		}
-	}
-	
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/views/LMLView.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/views/LMLView.java
deleted file mode 100644
index 52cae75..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/views/LMLView.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.ui.views;
-
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ptp.rm.lml.core.ILMLManager;
-import org.eclipse.ptp.rm.lml.core.LMLCorePlugin;
-import org.eclipse.ptp.rm.lml.core.events.ILguiAddedEvent;
-import org.eclipse.ptp.rm.lml.core.events.ILguiRemovedEvent;
-import org.eclipse.ptp.rm.lml.core.events.ILguiSelectedEvent;
-import org.eclipse.ptp.rm.lml.core.listeners.IViewListener;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.ui.actions.AddLguiAction;
-import org.eclipse.ptp.rm.lml.ui.actions.RemoveLguiAction;
-import org.eclipse.ptp.rm.lml.ui.actions.UpdateLguiAction;
-import org.eclipse.ptp.rm.lml.ui.providers.LMLListLabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.part.ViewPart;
-
-public class LMLView extends ViewPart {
-	private final class LMLViewListener implements IViewListener {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see
-		 * org.eclipse.ptp.rm.lml.core.listeners.ILguiListener#
-		 * handleEvent
-		 * (org.eclipse.ptp.core.events.ILguiAddedEvent)
-		 */
-		@Override
-		public synchronized void handleEvent(ILguiAddedEvent e) {
-			fSelected = e.getLguiItem();
-			createList();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see
-		 * org.eclipse.ptp.rm.lml.core.listeners.ILguiListener#
-		 * handleEvent
-		 * (org.eclipse.ptp.core.events.ILguiRemovedEvent)
-		 */
-		@Override
-		public synchronized void handleEvent(ILguiRemovedEvent e) {
-			fSelected = e.getLguiItem();
-			createList();
-		}
-
-		@Override
-		public void handleEvent(ILguiSelectedEvent e) {
-			fSelected = e.getLguiItem();
-			createList();
-			
-		}
-
-	}
-	
-	public final class ListSelectionListener implements SelectionListener {
-
-		@Override
-		public void widgetSelected(SelectionEvent e) {
-			int selectedItem = list.getSelectionIndex();
-			lmlManager.selectLgui(selectedItem);
-		}
-
-		@Override
-		public void widgetDefaultSelected(SelectionEvent e) {
-			lmlManager.selectLgui(0);
-		}
-
-	}
-
-	/**
-	 * 
-	 */
-	public ListViewer viewer;
-	private AddLguiAction addLguiAction;
-	private RemoveLguiAction removeLguiAction;
-	private UpdateLguiAction updateLguiAction;
-	private ILguiItem fSelected = null;
-	private final ILMLManager lmlManager = LMLCorePlugin.getDefault().getLMLManager();
-	private LMLViewListener lmlViewListener = null;
-	private List list = null;
-	private final ListSelectionListener listListener = new ListSelectionListener();
-
-	public LMLView() {
-
-	}
-
-	@Override
-	public void createPartControl(Composite parent) {
-		viewer = new ListViewer(parent, SWT.SINGLE);
-		viewer.setLabelProvider(new LMLListLabelProvider());
-		viewer.setContentProvider(new IStructuredContentProvider() {
-
-			@Override
-			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			}
-
-			@Override
-			public void dispose() {
-			}
-
-			@Override
-			public Object[] getElements(Object parent) {
-				return null;
-			}
-		});
-		
-		lmlViewListener = (LMLViewListener) lmlManager.getListener(this.getClass().getName());
-		if (lmlViewListener == null) {
-			lmlViewListener = new LMLViewListener();
-			lmlManager.addListener(lmlViewListener, this.getClass().getName());
-		}
-		
-		fSelected = lmlManager.getSelectedLguiItem();
-		createList();
-	}
-	
-	private void createList() {
-		list = viewer.getList();
-		list.removeAll();
-		list.removeSelectionListener(listListener);
-
-		createContextMenu();
-		if (fSelected != null) {
-			for (String lgui : lmlManager.getLguis()) {
-				viewer.add(lgui);
-			}
-			list.setSelection(lmlManager.getSelectedLguiIndex(fSelected.toString()));
-		}
-		list.addSelectionListener(listListener);
-	}
-
-	@Override
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-
-	@Override
-	public void dispose() {
-	}
-	
-	private void createContextMenu(){
-		final Shell shell = getSite().getShell();
-		addLguiAction = new AddLguiAction(shell);
-		removeLguiAction = new RemoveLguiAction(shell);
-		updateLguiAction = new UpdateLguiAction(shell);
-
-		MenuManager menuManager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
-		menuManager.setRemoveAllWhenShown(true);
-		menuManager.addMenuListener(new IMenuListener() {
-			@Override
-			public void menuAboutToShow(IMenuManager manager) {
-				fillContextMenu(manager);
-			}
-		});
-
-		Menu menu = menuManager.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(menuManager, viewer);
-	}
-	
-	private void fillContextMenu(IMenuManager manager) {
-		final IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
-		manager.add(addLguiAction);
-		boolean inContextForLgui = selection.size() > 0;
-		boolean inContextForRemoveLgui = inContextForLgui;
-		boolean inContextForUpdateLgui = inContextForLgui;
-		manager.add(removeLguiAction);
-		removeLguiAction.setEnabled(inContextForRemoveLgui);
-		manager.add(new Separator());
-		manager.add(updateLguiAction);
-		updateLguiAction.setEnabled(inContextForUpdateLgui);
-	}
-
-}
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/views/NodedisplayView.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/views/NodedisplayView.java
deleted file mode 100644
index 0b28944..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/views/NodedisplayView.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Carsten Karbach, Claudia Knobloch, FZ Juelich
- */
-package org.eclipse.ptp.rm.lml.ui.views;
-
-import java.util.ArrayDeque;
-import java.util.Deque;
-
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.internal.core.elements.Nodedisplay;
-import org.eclipse.ptp.rm.lml.ui.providers.DisplayNode;
-import org.eclipse.ptp.rm.lml.ui.providers.LMLWidget;
-import org.eclipse.ptp.rm.lml.ui.providers.NodedisplayComp;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Parent composite of NodedisplayComp
- * This class allows to zoom or switch the viewports of
- * nodedisplaycomps. Every nodedisplaycomp is connected with
- * one instance of this class. NodedisplayView represents one zoomable
- * NodedisplayComp.
- */
-public class NodedisplayView extends LMLWidget{
-
-	private Nodedisplay model;//LML-Data-model for this view
-	
-	private NodedisplayComp root;//root nodedisplay which is currently shown
-	
-	private Deque<String> zoomstack=new ArrayDeque<String>();//Saves zoom-levels to zoom out later, saves full-implicit name of nodes to create Displaynodes from these ids
-	
-	/**
-	 * Create a composite as surrounding component for NodedisplayComps.
-	 * This class encapsulates zooming functionality. It saves a stack
-	 * 
-	 * @param pmodel
-	 * @param parent
-	 */
-	public NodedisplayView(ILguiItem lguiItem, Nodedisplay pmodel, Composite parent){
-		
-		super(lguiItem, parent, SWT.None);
-		
-		model=pmodel;
-		
-		setLayout(new FillLayout());
-		
-		root=new NodedisplayComp(lguiItem, model, this, SWT.None);
-		
-	}
-	
-	/**
-	 * The stack which saves the last zoom-levels is restarted
-	 */
-	public void restartZoom(){
-		zoomstack=new ArrayDeque<String>();
-	}
-	
-	/**
-	 * Go one level higher in zoomstack
-	 */
-	public void zoomOut(){
-		if(! zoomstack.isEmpty()){
-			String impname=zoomstack.pop();
-			//Get back null-values
-			if(impname.equals(""))
-				impname=null;
-			
-			//Switch view to node with impname
-			goToImpname(impname);
-		}
-	}
-	
-	public void zoomIn(String impname){
-		String oldshown=root.getShownImpname();
-		
-		if(goToImpname(impname)){
-			if(oldshown==null)//Not allowed to insert null-values into ArrayDeque
-				oldshown="";
-			zoomstack.push(oldshown);
-		}
-	}
-	
-	/**
-	 * @return currently shown nodedisplaycomp
-	 */
-	public NodedisplayComp getRootNodedisplay(){
-		return root;
-	}
-	
-	
-	/**
-	 * Set node with impname as implicit name as root-node within this nodedisplay-panel
-	 * @param impname implicit name of a node, which identifies every node within a nodedisplay
-	 * @return true, if root was changed, otherwise false
-	 */
-	public boolean goToImpname(String impname){
-		
-		String shownimpname=root.getShownImpname();
-		
-		//Do not create a new panel if panel is already on the right view
-		if(shownimpname==null){
-			if(impname==null){
-				return false;
-			}
-		}
-		else if(shownimpname.equals(impname)){//Do not create new panel, if current viewport is the same to which this panel should be set
-			return false;
-		}
-		
-		NodedisplayComp newcomp=null;
-		
-		root.dispose();//Delete old root-element
-		System.gc();
-		
-		if(impname!=null){
-			DisplayNode newnode=DisplayNode.getDisplayNodeFromImpName(lguiItem, impname, model);
-			
-			newcomp=new NodedisplayComp(lguiItem, model, newnode, this, SWT.None);
-		}
-		else newcomp=new NodedisplayComp(lguiItem, model, this, SWT.None);//if impname is null => go up to root-level
-		
-		root=newcomp;
-		
-		this.layout();
-		
-		return true;
-	}
-	
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/views/NodesView.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/views/NodesView.java
deleted file mode 100644
index 5c18021..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/views/NodesView.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch, Carsten Karbach, FZ Juelich
- */
-
-package org.eclipse.ptp.rm.lml.ui.views;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ptp.rm.lml.core.ILMLManager;
-import org.eclipse.ptp.rm.lml.core.LMLCorePlugin;
-import org.eclipse.ptp.rm.lml.core.events.IJobListSortedEvent;
-import org.eclipse.ptp.rm.lml.core.listeners.ILMLListener;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.ui.providers.LMLViewPart;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * @author Claudia Knobloch, Carsten Karbach
- * 
- *         Based on original work by Greg Watson, Clement Chu and Daniel (JD) Barboza
- * 
- */
-public class NodesView extends LMLViewPart {
-	private final class LguiListener implements ILMLListener {
-		public void handleEvent(IJobListSortedEvent e) {
-		}
-	}
-	
-	private Composite composite = null;
-	private Composite nodedisplayView = null;
-	public Viewer viewer;
-	public ILguiItem fLguiItem = null;
-	private final ILMLListener lguiListener = new LguiListener();
-	private final ILMLManager lmlManager = LMLCorePlugin.getDefault().getLMLManager(); 
-	
-	/**
-	 * 
-	 */
-	public NodesView() {
-		super();
-	}
-
-	public void createPartControl(final Composite parent) {
-		composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new FillLayout());
-		composite.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_WHITE));	
-		
-		ILMLManager lmlManager = LMLCorePlugin.getDefault().getLMLManager();
-		fLguiItem = lmlManager.getSelectedLguiItem();
-		createNodedisplayView();
-		lmlManager.addListener(lguiListener, this.getClass().getName());
-	}
-
-	/*
-	 * Method required so the class can extends ViewPart
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-	}
-
-	
-	private void createNodedisplayView() {
-	
-		if (fLguiItem != null) {
-			this.setPartName(fLguiItem.getNodedisplayAccess().toString());
-			nodedisplayView = new NodedisplayView(fLguiItem, fLguiItem.getNodedisplayAccess().getNodedisplays().get(0), composite);
-			composite.layout();
-		} else {
-			setPartName("NodedisplayView");
-		}
-
-	}
-
-	public void prepareDispose() {
-		lmlManager.removeListener(lguiListener);
-	}
-	
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/views/TableView.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/views/TableView.java
deleted file mode 100644
index b53e1c0..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/views/TableView.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/**
- * Copyright (c) 2011 Forschungszentrum Juelich GmbH
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Claudia Knobloch
- */
-
-package org.eclipse.ptp.rm.lml.ui.views;
-
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.ptp.rm.lml.core.ILMLManager;
-import org.eclipse.ptp.rm.lml.core.LMLCorePlugin;
-import org.eclipse.ptp.rm.lml.core.events.IJobListSortedEvent;
-import org.eclipse.ptp.rm.lml.core.listeners.ILMLListener;
-import org.eclipse.ptp.rm.lml.core.model.ILguiItem;
-import org.eclipse.ptp.rm.lml.core.model.ITableColumnLayout;
-import org.eclipse.ptp.rm.lml.ui.actions.TableViewPullDownMenuAction;
-import org.eclipse.ptp.rm.lml.ui.providers.LMLViewPart;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * 
- * @author Claudia Knobloch
- *
- */
-public class TableView extends LMLViewPart {
-	private final class LMLJobsListListener implements ILMLListener {
-		
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see
-		 * org.eclipse.ptp.rm.lml.core.listeners.ILguiListener#
-		 * handleEvent
-		 * (org.eclipse.ptp.core.events.IJobListSortEvent)
-		 */
-		public void handleEvent(IJobListSortedEvent e) {
-			viewer.getTable().removeAll();
-			viewer.add(fSelectedLguiItem.getTableHandler().getTableData(tableType));
-		}
-	}
-	
-	private Composite composite;
-	private Table table;
-	private TableColumn[] tableColumns;
-	public TableViewer viewer;
-	public Point sizeViewer;
-	public ILguiItem fSelectedLguiItem = null;
-	public int tableNumber = 0;
-	public String tableType = null;
-	private ILMLListener lmlListener = new LMLJobsListListener();
-	private ILMLManager lmlManager = LMLCorePlugin.getDefault().getLMLManager();
-	
-	public void createPartControl(Composite parent) {
-		this.composite = parent;
-		parent.setLayout(new FillLayout());
-		viewer = new TableViewer(parent, SWT.V_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER| SWT.Resize);
-		viewer.setLabelProvider(new ITableLabelProvider() {
-			public void addListener(ILabelProviderListener listener) {				
-			}
-			public void dispose() {
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-			public void removeListener(ILabelProviderListener listener) {
-				
-			}
-
-			public Image getColumnImage(Object element, int columnIndex) {
-				return null;
-			}
-
-			public String getColumnText(Object element, int columnIndex) {
-				return ((String[]) element)[columnIndex];
-			}
-			
-		});
-		viewer.setContentProvider(new ArrayContentProvider());
-		lmlManager.addListener(lmlListener, this.getClass().getName());
-		composite.addControlListener(new ControlAdapter() {
-			public void controlResized(ControlEvent e) {
-				if (fSelectedLguiItem == null) {
-					return;
-				}
-				TableColumn[] tableColumns = table.getColumns();
-				Double[] widths = new Double[tableColumns.length];
-				Double widthColumn = Integer.valueOf(sizeViewer.x).doubleValue() / tableColumns.length;
-				for (int i = 0; i < tableColumns.length; i++) {
-					widths[i] = tableColumns[i].getWidth() / widthColumn;
-					fSelectedLguiItem.getTableHandler().changeTableColumnsWidth(widths, tableType);
-				}
-				disposeTable();
-				createTable();
-			}
-		});
-	}
-	
-	public void generateTable(int tableNumber) {
-		this.tableNumber = tableNumber;
-		fSelectedLguiItem = lmlManager.getSelectedLguiItem();
-		createTable();
-	}
-	
-	private void disposeTable() {
-		if (fSelectedLguiItem != null) {
-			viewer.getTable().removeAll();
-			
-			TableColumn[] oldColumns = viewer.getTable().getColumns();
-			for (int i = 0; i < oldColumns.length; i++) {
-				Listener[]  oldListeners = oldColumns[i].getListeners(SWT.Selection);
-				for (int j = 0; j < oldListeners.length; j++) {
-					oldColumns[i].removeListener(SWT.Selection, oldListeners[j]);
-				}
-				oldColumns[i].dispose();
-			}
-		}
-		this.getViewSite().getActionBars().getMenuManager().removeAll();
-	}
-	
-	private void createTable() {
-		table = viewer.getTable();
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-		tableType = fSelectedLguiItem.getTableHandler().getTableTitle(tableNumber);
-		createColumns();
-		viewer.add(fSelectedLguiItem.getTableHandler().getTableData(tableType));
-	}
-
-	public void setFocus() {
-	}
-	
-	private int getColumnAlignment(String alignment) {
-		if (alignment.equals("LEFT")) {
-			return SWT.LEAD;
-		}
-		if (alignment.equals("RIGHT")) {
-			return SWT.TRAIL;
-		}
-			
-		return 0;
-	}
-	
-	/**
-	 * 
-	 * @param tableViewer
-	 * @param fSelected
-	 */
-	private void createColumns() {
-		this.setPartName(tableType);
-		tableColumns = new TableColumn[fSelectedLguiItem.getTableHandler().getTableColumnNumber(tableType)];
-		sizeViewer = composite.getSize();
-		ITableColumnLayout[] jobTableColumnLayouts = fSelectedLguiItem.getTableHandler().getTableColumnLayout(tableType, sizeViewer.x);
-		if (fSelectedLguiItem.isLayout()) {
-			return;
-		}
-		for (int i = 0; i < jobTableColumnLayouts.length; i++) {
-			TableColumn tableColumn = new TableColumn(table, getColumnAlignment(jobTableColumnLayouts[i].getStyle()));
-			
-			tableColumn.setText(jobTableColumnLayouts[i].getTitle());
-			tableColumn.setWidth(jobTableColumnLayouts[i].getWidth());
-			tableColumn.setMoveable(true);
-			tableColumns[i] = tableColumn;	
-		}
-		Listener sortListener = new Listener() {
-			public void handleEvent(Event e) {
-				TableColumn currentColumn = (TableColumn) e.widget;		
-				if (table.getSortColumn() == currentColumn) {
-					table.setSortDirection(table.getSortDirection() == SWT.UP ? SWT.DOWN : SWT.UP);
-				} else {
-					table.setSortColumn(currentColumn);
-					table.setSortDirection(SWT.UP);
-				}
-				int sortIndex = 0;
-				for (int i = 0; i < tableColumns.length; i++) {
-					if (tableColumns[i] == table.getSortColumn()) {
-						sortIndex = i;
-					}
-				}
-				fSelectedLguiItem.getTableHandler().sort(tableType, SWT.UP, sortIndex, table.getSortDirection());
-				table.setSortDirection(table.getSortDirection());
-				LMLCorePlugin.getDefault().getLMLManager().sortLgui();
-			}
-		}; 
-		for (int i = 0; i < tableColumns.length; i++) {
-			tableColumns[i].addListener(SWT.Selection, sortListener);
-		}
-		String[] tableColumnNonActive = fSelectedLguiItem.getTableHandler().getTableColumnNonActive(tableType);
-		for (int i = 0; i < tableColumnNonActive.length; i++) {
-			this.getViewSite().getActionBars().getMenuManager().add(new TableViewPullDownMenuAction(tableColumnNonActive[i]));
-		}
-
-	}
-	public void prepareDispose() {
-		TableColumn[] tableColumns = table.getColumns();
-		Double[] widths = new Double[tableColumns.length];
-		Double widthColumn = Integer.valueOf(sizeViewer.x).doubleValue() / tableColumns.length;
-		for (int i = 0; i < tableColumns.length; i++) {
-			widths[i] = tableColumns[i].getWidth() / widthColumn;
-			fSelectedLguiItem.getTableHandler().changeTableColumnsWidth(widths, tableType);
-		}
-		lmlManager.removeListener(lmlListener);
-	}
-
-}
diff --git a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/wizards/SelectFilesWizard.java b/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/wizards/SelectFilesWizard.java
deleted file mode 100644
index e056a00..0000000
--- a/rms/org.eclipse.ptp.rm.lml.ui/src/org/eclipse/ptp/rm/lml/ui/wizards/SelectFilesWizard.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 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
- * 
- * Modified by:
- * 		Claudia Knobloch, Forschungszentrum Juelich GmbH
- *******************************************************************************/
-package org.eclipse.ptp.rm.lml.ui.wizards;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.ptp.rm.lml.core.LMLCorePlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-public class SelectFilesWizard extends Wizard {
-	
-	public class SelectFilesWizardPage extends WizardPage {
-		
-		private Text xmlFileField;
-		
-		public SelectFilesWizardPage() {
-			super("Select Files");
-			wizardPage = this;
-			setTitle("Select XML-files");
-			setDescription("Select the XML file");
-			
-		}
-
-		@Override
-		public void createControl(Composite parent) {
-			
-			Composite container = new Composite(parent, SWT.NULL);
-			final  GridLayout gridLayout = new GridLayout();
-			gridLayout.numColumns = 3;
-			container.setLayout(gridLayout);
-			setControl(container);
-			
-			final Label label_1 = new Label(container, SWT.NONE);
-			final GridData gridData_1 = new GridData();
-			gridData_1.horizontalSpan = 3;
-			label_1.setLayoutData(gridData_1);
-			label_1.setText("Select the XML file to generate an Object");
-			
-			final Label label_2 = new Label(container, SWT.NONE);
-			final GridData gridData_2 = new GridData(GridData.HORIZONTAL_ALIGN_END);
-			label_2.setLayoutData(gridData_2);
-			label_2.setText("XML File: ");
-			
-			xmlFileField = new Text(container, SWT.BORDER);
-			xmlFileField.addModifyListener( new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					updatePageComplete();
-				}
-			});
-			xmlFileField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			final Button button = new Button(container, SWT.NONE);
-			button.addSelectionListener(new SelectionAdapter(){
-				public void widgetSelected(SelectionEvent e) {
-					browseForXmlFile();
-				}
-			});
-			button.setText("Browse...");
-			
-			updatePageComplete();
-			
-		}
-		
-		private void updatePageComplete() {
-			setPageComplete(false);
-			
-			IPath xmlFileLocation = getXmlLocation();
-			if (xmlFileLocation == null) {
-				setMessage(null);
-				setErrorMessage("Please select a XML file.");
-				return;
-			}
-
-			if (!xmlFileLocation.lastSegment().endsWith(".xml")) {
-				setMessage(null);
-				setErrorMessage("Select an XML-file!");
-				return;
-			}
-			
-			setPageComplete(true);
-			setMessage(null);
-			setErrorMessage(null);
-		}
-		
-		protected void browseForXmlFile() {
-			IPath path = browse(getXmlLocation(), false);
-			if (path == null) {
-				return;
-			}
-			IPath rootLoc = ResourcesPlugin.getWorkspace().getRoot().getLocation();
-			if (rootLoc.isPrefixOf(path)) {
-				path = path.setDevice(null).removeFirstSegments(rootLoc.segmentCount());
-			}
-			xmlFileField.setText(path.toString());
-			try{
-				xmlFile = path.toFile().toURI().toURL();
-			}
-			catch (MalformedURLException e) {
-				e.printStackTrace();
-				setMessage(null);
-				setErrorMessage("URL (XML file) not allowed");
-			}
-		}
-		
-		private IPath browse(IPath path, boolean mustExist) {
-			FileDialog dialog = new FileDialog(getShell(), mustExist ? SWT.OPEN : SWT.SAVE);
-			if (path != null) {
-				if (path.segmentCount() > 1) {
-					dialog.setFilterPath(path.removeLastSegments(1).toOSString());
-				}
-				if (path.segmentCount() > 0) {
-					dialog.setFileName(path.lastSegment());
-				}
-			}
-			String result = dialog.open();
-			if (result == null) {
-				return null;
-			}
-			return new Path(result);
-		}
-		
-		public IPath getXmlLocation() {
-			String text = xmlFileField.getText().trim();
-			if (text.length() == 0) {
-				return null;
-			}
-			IPath path = new Path(text);
-			if (!path.isAbsolute()) {
-				path = ResourcesPlugin.getWorkspace().getRoot().getLocation().append(path);
-			}
-			return path;
-		}
-
-	}
-
-	private final SelectFilesWizardPage fSelectFilesPage = new SelectFilesWizardPage();
-
-	private URL xmlFile = null;
-	
-	private WizardPage wizardPage;
-
-	/*
-	 * Constructor used when creating a new resource manager.
-	 */
-	public SelectFilesWizard() {
-	}
-	
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	@Override
-	public void addPages() {
-		addPage(fSelectFilesPage);
-		super.addPages();
-	}
-
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	@Override
-	public boolean performFinish() {
-		boolean existingLgui = LMLCorePlugin.getDefault().getLMLManager().addLgui(xmlFile);
-		if (!existingLgui) {
-			wizardPage.setErrorMessage("This XML-File is already loaded. Choose another XML-File!");
-		} else {
-			wizardPage.setErrorMessage(null);
-		}
-		return existingLgui;
-	}
-}
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 f6603e2..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Sample
-Bundle-SymbolicName: org.eclipse.ptp.etfw.feedback.sample; singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.ptp.etfw.feedback.sample.Activator
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.ptp.etfw.feedback;bundle-version="1.0.0",
- org.eclipse.core.resources;bundle-version="3.5.1"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/build.properties b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/build.properties
deleted file mode 100644
index 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 4aba3bb..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/plugin.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-  
-   <extension
-         point="org.eclipse.ui.menus">
-         
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.main.menu?after=additions">
-         <menu
-               label="Feedback"
-               mnemonic="%menu.mnemonic"
-               id="org.eclipse.ptp.etfw.feedback.actions.menus.sampleMenu">
-            <command
-                  commandId="org.eclipse.ptp.etfw.feedback.actions.commands.sampleCommand"
-                  mnemonic="%command.mnemonic"
-                  id="org.eclipse.ptp.etfw.feedback.actions.menus.sampleCommand">
-            </command>
-         </menu>
-      </menuContribution>
-      <menuContribution
-            locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
-         <toolbar
-               id="org.eclipse.ptp.etfw.feedback.actions.toolbars.sampleToolbar">
-            <command
-                  commandId="org.eclipse.ptp.etfw.feedback.actions.commands.sampleCommand"
-                  icon="icons/feedback_action.gif"
-                  tooltip="Show ETFw Feedback view for selected XML file"
-                  id="org.eclipse.ptp.etfw.feedback.actions.toolbars.sampleCommand">
-            </command>
-         </toolbar>
-      </menuContribution>
-   </extension>
-      <extension
-         id="sampleParser"
-         name="Sample PTP Feedback view report items"
-         point="org.eclipse.ptp.etfw.feedback.parser">
-      <feedtype
-            class="org.eclipse.ptp.etfw.feedback.sample.SampleFeedbackParser"
-            id="org.eclipse.ptp.etfw.feedback.sample.parser"
-            name="Sample feedback parser"
-            nodeName="SampleXMLRoot">
-      </feedtype>
-   </extension>
-     <extension
-         point="org.eclipse.ui.views">
-   <!--   <category
-            name="Sample Feedback View"
-            id="org.eclipse.ptp.etfw.feedback">
-      </category>
-      -->
-      <view
-            name="Sample Feedback items"
-            icon="icons/feedback_view.gif"
-            category="org.eclipse.ptp.etfw.feedback"
-            class="org.eclipse.ptp.etfw.feedback.sample.SampleFeedbackView"
-            id="org.eclipse.ptp.etfw.feedback.sample.view">
-      </view>
-   </extension>
-      <extension
-         id="sampleAction"
-         name="Sample Added Action"
-         point="org.eclipse.ptp.etfw.feedback.action">
-      <action
-            class="org.eclipse.ptp.etfw.feedback.sample.actions.SampleFeedbackAction"
-            icon="icons/feedback_action.gif"
-            id="sampleFeedbackAction1"
-            name="Sample Feedback Action"
-            viewID="org.eclipse.ptp.etfw.feedback.sample.view">
-      </action>
-   </extension>
-
-</plugin>
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/Activator.java b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/Activator.java
deleted file mode 100644
index 6bb582f..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/Activator.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2009 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ptp.etfw.feedback.sample;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Activator extends AbstractUIPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.ptp.etfw.feedback.sample";
-	public static final String MARKER_ID = "org.eclipse.ptp.etfw.feedback.sample.marker";
-	public static final String VIEW_ID = "org.eclipse.ptp.etfw.feedback.sample.view";
-
-	// The shared instance
-	private static Activator plugin;
-
-	/**
-	 * The constructor
-	 */
-	public Activator() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static Activator getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return imageDescriptorFromPlugin(PLUGIN_ID, path);
-	}
-}
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackItem.java b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackItem.java
deleted file mode 100644
index f438172..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackItem.java
+++ /dev/null
@@ -1,123 +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.FeedbackIDs;
-import org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem;
-
-/**
- * @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 9f9182f..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackParser.java
+++ /dev/null
@@ -1,180 +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 c014148..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackView.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2009 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ptp.etfw.feedback.sample;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ptp.etfw.feedback.FeedbackIDs;
-import org.eclipse.ptp.etfw.feedback.preferences.PreferenceConstants;
-import org.eclipse.ptp.etfw.feedback.views.SimpleTreeTableMarkerView;
-
-
-
-/**
- * Expose xlC compiler transformation information in an eclipse view
- * 
- * @author beth 
- * 
- */
-public class SampleFeedbackView extends SimpleTreeTableMarkerView {
-	/**
-	 * Assure that parent nodes will get created as needed: that is,
-	 * we don't have IFeedbackItem objects for the parents. Parent "nodes"
-	 * are created for each unique parentID, thus "categorizing" the items
-	 * automatically
-	 */
-	private static boolean CREATE_PARENT_NODES=true;
-	
-
-	/**
-	 * Attribute names, used to store info in the marker, corresponding to each column in the view.
-	 * Use these constants or values of your own.
-	 * To add/remove a column, modify this: (1)
-	 */
-	private static String[] attrNames=new String[] {
-		FeedbackIDs.FEEDBACK_ATTR_NAME,
-		FeedbackIDs.FEEDBACK_ATTR_FILENAME,
-		FeedbackIDs.FEEDBACK_ATTR_ID,
-		FeedbackIDs.FEEDBACK_ATTR_FUNCTION_CALLEE,
-		IMarker.LINE_NUMBER, // Note: currently column 5 (index=4) must be an int value, presumably line number.
-		                     // This restriction will be lifted and generalized later.
-		/*IMarker.CHAR_START,IMarker.CHAR_END*/
-		FeedbackIDs.FEEDBACK_ATTR_DESC};
-	/** To add/remove a column, modify this: (2)*/
-	private static String[] colNames=new String[] {"Type/Name","File",  "ID", "blank", "LineNo",
-		/*"Char start","Char end"*/ "Description*" };
-	/** To add/remove a column, modify this: (3)*/
-	private static int[] widths = new int[] { 160, 100, 50, 50, 80, 200  };
-	
-	protected IPreferenceStore preferenceStore;
-	protected boolean maintainExpandCollapseState;
-	
-	
-	/**
-	 * Use the ctor that allows an arbitrary number of extra columns.
-	 * This ctor is called (1). FIXME need to generalize the name "Xform" used here?
-	 */
-	public SampleFeedbackView() {
-		super(Activator.getDefault(), "XForm", "XForms", attrNames,colNames,widths,
-				Activator.MARKER_ID, "parent",CREATE_PARENT_NODES);
-		preferenceStore = Activator.getDefault().getPreferenceStore();
-		maintainExpandCollapseState=preferenceStore.getBoolean(PreferenceConstants.P_MAINTAIN_EXPAND_COLLAPSE_STATE);
-
-	}
-
-	/**
-	 * Provide something for the "Info" popup action, based on the marker
-	 * <br>Since we didn't use the Artifact, Artifact Manager, etc in the base class we need something to look useful here.
-	 */
-	@Override
-	public String extractMarkerInfo(IMarker marker) {
-		StringBuffer infoBuffer= new StringBuffer();
-		String filename = marker.getResource().getName();
-		String name=getStrAttr(marker, FeedbackIDs.FEEDBACK_ATTR_NAME);
-		infoBuffer.append("\nThis information provided by SampleFeedbackView.extractMarkerInfo()");
-		infoBuffer.append("\nFile name: ").append(filename);
-		
-		infoBuffer.append("\nLine number: ").append(getStrAttr(marker,IMarker.LINE_NUMBER));
-		infoBuffer.append("\nName: ").append(name);
-		String parent=getStrAttr(marker, FeedbackIDs.FEEDBACK_ATTR_PARENT);
-		infoBuffer.append("\nParent (Item type): ").append(parent);
-		infoBuffer.append("\nDescription: ").append(getStrAttr(marker,FeedbackIDs.FEEDBACK_ATTR_DESC));
-		return infoBuffer.toString();
-	}
-	public String getStrAttr(IMarker marker, String attrName) {
-		try {
-		String str=marker.getAttribute(attrName).toString();
-		
-		return str;
-		}catch(CoreException e) {
-			System.out.println("Exception getting marker attr in CompilerXFormTreeTableView.getStrAttr() "+e.getMessage());  
-			return "*error*";
-		}
-		
-	}
-
-	/**
-	 * 
-	 */
-	@Override
-	protected void maintainExpandCollapseStatus() {
-		// re-query each time, in case prefs have changed
-		maintainExpandCollapseState = preferenceStore.getBoolean(PreferenceConstants.P_MAINTAIN_EXPAND_COLLAPSE_STATE);
-		if (maintainExpandCollapseState) {
-			switch (expandCollapseStatus) {
-			case EXPAND_COLLAPSE_EXPANDALL:
-				expandAllAction.run();
-				break;
-			case EXPAND_COLLAPSE_COLLAPSEALL:
-				collapseAllAction.run();
-				break;
-			case EXPAND_COLLAPSE_NONE:
-				// do nothing: user hasn't done expandAll or collapseAll yet.
-			}
-		}
-	}
-
-}
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleShowFeedbackHandler.java b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleShowFeedbackHandler.java
deleted file mode 100644
index b32824d..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleShowFeedbackHandler.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2009 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ptp.etfw.feedback.sample;
-
-import org.eclipse.ptp.etfw.feedback.actions.handlers.ShowFeedbackHandler;
-
-/**
- * Handler to handle actions from this plug-in to show its data in the Feedback View
- * 
- * @author beth tibbitts
- *
- */
-public class SampleShowFeedbackHandler extends ShowFeedbackHandler {
-
-}
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/actions/SampleFeedbackAction.java b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/actions/SampleFeedbackAction.java
deleted file mode 100644
index 80d75ff..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/actions/SampleFeedbackAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2010 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.etfw.feedback.sample.actions;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ptp.etfw.feedback.AbstractFeedbackAction;
-import org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem;
-import org.eclipse.ptp.etfw.feedback.sample.Activator;
-
-/**
- * A sample action that can be added to the ETFw Feedback view
- * @author beth
- *
- */
-public class SampleFeedbackAction extends AbstractFeedbackAction {
-
-	
-
-	public void run(IMarker marker) {
-		String name="(unknown)";
-		try {
-			name = (String)marker.getAttribute("name");
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		MessageDialog.openInformation(null, "Sample action", "Do something interesting here with marker: "+name);
-
-	}
-
-	public void run(IFeedbackItem item) {
-		MessageDialog.openInformation(null, "Sample action", "Do something interesting here with IFeedbackItem");
-
-	}
-
-
-	public String getToolTip() {
-		return "SampleFeedbackAction tooltip";
-	}
-
-	@Override
-	public String getText() {
-		return "SampleFeedbackAction text";
-	}
-
-	@Override
-	public String getPluginId() {
-		return Activator.PLUGIN_ID;
-	}
-
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/.classpath b/tools/pldt/org.eclipse.ptp.pldt.tests/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/.project b/tools/pldt/org.eclipse.ptp.pldt.tests/.project
deleted file mode 100644
index edd88d3..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.pldt.tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/.settings/org.eclipse.jdt.core.prefs b/tools/pldt/org.eclipse.ptp.pldt.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9fda8be..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Thu Jun 19 09:17:08 EDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/META-INF/MANIFEST.MF b/tools/pldt/org.eclipse.ptp.pldt.tests/META-INF/MANIFEST.MF
deleted file mode 100644
index 4a3f091..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: PLDT Tests Plug-in
-Bundle-SymbolicName: org.eclipse.ptp.pldt.tests
-Bundle-Version: 1.0.0
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.junit;bundle-version="3.8.2",
- org.eclipse.cdt.core.tests,
- org.eclipse.core.resources,
- org.eclipse.cdt.core,
- org.eclipse.ptp.pldt.common,
- org.eclipse.ptp.pldt.mpi.core,
- org.eclipse.ptp.pldt.openmp.core,
- org.eclipse.ptp.pldt.openmp.analysis;bundle-version="4.0.0",
- org.eclipse.ptp.pldt.openmp.ui.pv;bundle-version="4.0.0",
- org.eclipse.ptp.pldt.mpi.analysis;bundle-version="4.0.0"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-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/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/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 6310c88..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Activator.java
+++ /dev/null
@@ -1,31 +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 e057b1b..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.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 d5c4587..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/TestFortran.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.pldt.tests;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ptp.pldt.common.IDs;
-import org.eclipse.ptp.pldt.mpi.core.MpiIDs;
-import org.eclipse.ptp.pldt.mpi.core.actions.RunAnalyseMPIcommandHandler;
-import org.eclipse.ptp.pldt.openmp.core.OpenMPPlugin;
-import org.eclipse.ptp.pldt.openmp.core.actions.RunAnalyseOpenMPcommandHandler;
-import org.eclipse.ptp.pldt.tests.PldtBaseTestFramework.ArtifactWithLine;
-
-
-
-/**
- * @author Beth Tibbitts
- *
- */
-public class TestFortran extends PldtBaseTestFramework{
-
-	@SuppressWarnings("unused")
-	public void testMPIartifacts_Fortran() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-			IFile file = importFile("resources", "HelloFortranMPI.f90");
-			assertNotNull(file);
-			// include file really not needed for Fortran but needed as arg to runResource
-			IFile mpiInclude = importFile("resources/includes","mpi.h");
-			assertNotNull(mpiInclude);
-			String tempPath = mpiInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-			System.out.println("tempPath="+tempPath);
-			String includePath = mpiInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-				+ mpiInclude.getFullPath().toFile().getAbsolutePath();
-			System.out.println("includePath= "+includePath);
-			 
-			assertTrue(file instanceof IAdaptable);
-	
-			CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-	
-			assertNotNull(cproject);
-			ICElement ce = cproject.findElement(file.getFullPath());
-	
-			// ICElement covers folders and translationunits
-			//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-			assertNotNull(ce);
-			List<String> includes = Arrays.asList(new String[] {includePath});
-			RunAnalyseMPIcommandHandler racm = new RunAnalyseMPIcommandHandler();
-			
-			racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-			
-			IMarker[] markers=file.findMarkers(MpiIDs.MARKER_ID, true, IResource.DEPTH_INFINITE);
-			assertNotNull(markers);
-			System.out.println("numMarkers: "+markers.length);
-			String temp="{";
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-				System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-				temp+="\""+marker.getAttribute(IDs.NAME)+"\",";
-				
-			}
-			temp+="}";
-			System.out.println(temp);
-			
-			assertEquals(23, markers.length);
-			
-			IMarker m = markers[0];
-			String name= m.getAttribute(IDs.NAME).toString();
-			for (int i = 0; i < markers.length; i++) {
-				
-			}
-	
-			 
-			int[] expectedLinenos = {29,29,29,44,44,44,45,63,70,73,73,76,76,82,82,83,87,87,88,96,96,96,106};
-			String[] expectedMpiTypes = { "MPI_BCAST", "MPI_INTEGER",
-					"MPI_COMM_WORLD", "MPI_REDUCE", "MPI_DOUBLE_PRECISION",
-					"MPI_SUM", "MPI_COMM_WORLD", "MPI_STATUS_SIZE", "MPI_INIT",
-					"MPI_COMM_RANK", "MPI_COMM_WORLD", "MPI_COMM_SIZE",
-					"MPI_COMM_WORLD", "MPI_SEND", "MPI_CHARACTER",
-					"MPI_COMM_WORLD", "MPI_RECV", "MPI_CHARACTER",
-					"MPI_COMM_WORLD", "MPI_BCAST", "MPI_CHARACTER",
-					"MPI_COMM_WORLD", "MPI_FINALIZE" };
-
-			ArtifactWithLine[] expectedArts = new ArtifactWithLine[expectedLinenos.length];
-			ArtifactWithLine[] markerArts = new ArtifactWithLine[markers.length];
-			for (int i = 0; i < expectedArts.length; i++) {
-				expectedArts[i]=new ArtifactWithLine(expectedLinenos[i],expectedMpiTypes[i]);		
-			}
-			for (int i = 0; i < markerArts.length; i++) {
-				markerArts[i]=new ArtifactWithLine(markers[i]);
-			}
-			 
-			Arrays.sort(expectedArts);
-			Arrays.sort(markerArts);
-			
-			assertEquals(expectedArts.length, markerArts.length);
- 
-			// Since these tests are in a loop, if one fails, must inspect the Console output to know which ones finished and which one failed.
-			for (int i = 0; i < markers.length; i++) {
-				// Marker should be on the line number we expect
-				System.out.println(i+". "+expectedArts[i].getLineNo()+" = "+markerArts[i].getLineNo());			
-				assertEquals(expectedArts[i].getLineNo(), markerArts[i].getLineNo());
-				
-				// Marker should be of the type name we expect
-				System.out.println("    "+expectedArts[i].getName()+" = "+markerArts[i].getName());			
-				assertEquals(expectedArts[i].getName(), markerArts[i].getName());
-				
-				boolean test=markerArts[i].equals(expectedArts[i]);
-				//the following never works, so we'll be happy enough with the two assertEquals above.
-				//assertEquals(expectedArts[i], markerArts[i]);
-			}
-
-		}
-
-	public void testOpenMPartifacts_Fortran() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-			IFile file = importFile("resources", "openMP.f90");
-			assertNotNull(file);
-			// include file really not needed for Fortran but needed as arg to runResource
-			IFile mpiInclude = importFile("resources/includes","mpi.h");
-			assertNotNull(mpiInclude);
-			String tempPath = mpiInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-			System.out.println("tempPath="+tempPath);
-			String includePath = mpiInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-				+ mpiInclude.getFullPath().toFile().getAbsolutePath();
-			System.out.println("includePath= "+includePath);
-			 
-			assertTrue(file instanceof IAdaptable);
-	
-			CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-	
-			assertNotNull(cproject);
-			ICElement ce = cproject.findElement(file.getFullPath());
-	
-			// ICElement covers folders and translationunits
-			//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-			assertNotNull(ce);
-			List<String> includes = Arrays.asList(new String[] {includePath});
-			RunAnalyseOpenMPcommandHandler racm = new RunAnalyseOpenMPcommandHandler();
-			
-			racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-			
-			IMarker[] markers=file.findMarkers(OpenMPPlugin.MARKER_ID, true, IResource.DEPTH_INFINITE);
-			assertNotNull(markers);
-			System.out.println("numMarkers: "+markers.length);
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-				System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-			}
-			// the only test of "correctness" now is the number of markers it finds
-			int expectedNum=4;
-			System.out.println("found "+markers.length+" markers, expected "+expectedNum);
-			assertEquals(expectedNum, markers.length);
-			
-			// See other tests for ideas on how to test more details in the markers found.
-			
-
-		}
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI.java b/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI.java
deleted file mode 100644
index 8e78fba..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.pldt.tests;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.cdt.core.dom.IName;
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.internal.core.model.TranslationUnit;
-import org.eclipse.core.internal.resources.Marker;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ptp.pldt.common.IDs;
-import org.eclipse.ptp.pldt.mpi.core.MpiIDs;
-import org.eclipse.ptp.pldt.mpi.core.MpiPlugin;
-import org.eclipse.ptp.pldt.mpi.core.actions.RunAnalyseMPIcommandHandler;
-import org.eclipse.ptp.pldt.openmp.core.OpenMPIDs;
-import org.eclipse.ptp.pldt.openmp.core.OpenMPPlugin;
-import org.eclipse.ptp.pldt.openmp.core.actions.RunAnalyseOpenMPcommandHandler;
-
-
-/**
- * @author beth
- *
- */
-public class Test_MPI extends PldtBaseTestFramework{
-	
-	public void testMPIartifacts() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-		
-//		ArtifactWithLine a = new ArtifactWithLine(1, "foo");
-//		ArtifactWithLine b = new ArtifactWithLine(1, "bar");
-//		ArtifactWithLine c= new ArtifactWithLine(2,"foo");
-//		ArtifactWithLine aa = new ArtifactWithLine(1,"foo");
-//		a.compareTo(b);
-//		b.compareTo(a);
-//		a.compareTo(c);
-//		c.compareTo(a);
-//		b.compareTo(c);
-//		c.compareTo(b);
-//		a.compareTo(aa);
-//		b.compareTo(b);
-//		c.compareTo(c);
-		
-		
-		IFile file = importFile("resources", "testMPI.c");
-		assertNotNull(file);
-		
-		IFile mpiInclude = importFile("resources/includes","mpi.h");
-		assertNotNull(mpiInclude);
-		String tempPath = mpiInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-		System.out.println("tempPath="+tempPath);
-		String includePath = mpiInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-			+ mpiInclude.getFullPath().toFile().getAbsolutePath();
-		System.out.println("includePath= "+includePath);
-
-		assertTrue(file instanceof IAdaptable);
-
-		CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-
-		assertNotNull(cproject);
-		ICElement ce = cproject.findElement(file.getFullPath());
-
-		// ICElement covers folders and translationunits
-		//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-		assertNotNull(ce);
-		List<String> includes = Arrays.asList(new String[] {includePath});
-		RunAnalyseMPIcommandHandler racm = new RunAnalyseMPIcommandHandler();
-		
-		racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-		
-		IMarker[] markers=file.findMarkers(MpiIDs.MARKER_ID, true, IResource.DEPTH_INFINITE);
-		assertNotNull(markers);
-		System.out.println("numMarkers: "+markers.length);
-		// need to sort markers, since they are not returned in a pre-determined order??
-		
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
-			int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-			System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-		}
-
-
-		//When strings don't match, click on the first entry (ComparisonFailure) in the Failure Trace in the JUnit view to get a diff view
-		//assertEquals("This\nis\na\ntest", "This\nwas\na\ntest");
-
-		int[] expectedLinenos = {17,20,23,31,37,43};
-		String[] expectedMpiTypes= {"MPI_Init", "MPI_Comm_rank", "MPI_Comm_size", "MPI_Send", "MPI_Recv", "MPI_Finalize"};
-		ArtifactWithLine[] expectedArts = new ArtifactWithLine[expectedLinenos.length];
-		ArtifactWithLine[] markerArts = new ArtifactWithLine[markers.length];
-		for (int i = 0; i < expectedArts.length; i++) {
-			expectedArts[i]=new ArtifactWithLine(expectedLinenos[i],expectedMpiTypes[i]);		
-		}
-		for (int i = 0; i < markerArts.length; i++) {
-			markerArts[i]=new ArtifactWithLine(markers[i]);
-		}
-		Arrays.sort(expectedArts);
-		Arrays.sort(markerArts);
-		
-		assertEquals(expectedArts.length, markerArts.length);
-		// Since these tests are in a loop, if one fails, must inspect the Console output to know which ones finished and which one failed.
-		for (int i = 0; i < markers.length; i++) {
-			// Marker should be on the line number we expect
-			System.out.println(i+". "+expectedArts[i].getLineNo()+" = "+markerArts[i].getLineNo());			
-			assertEquals(expectedArts[i].getLineNo(), markerArts[i].getLineNo());
-			
-			// Marker should be of the type name we expect
-			System.out.println("    "+expectedArts[i].getName()+" = "+markerArts[i].getName());			
-			assertEquals(expectedArts[i].getName(), markerArts[i].getName());
-			
-			boolean test=markerArts[i].equals(expectedArts[i]);
-			//the following never works, so we'll be happy enough with the two assertEquals above.
-			//assertEquals(expectedArts[i], markerArts[i]);
-
-		}
-
-	}
-
-
-
-	public void testMPI_CPPartifacts() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-			IFile file = importFile("resources", "helloMPIcpp.cpp");
-			assertNotNull(file);
-			
-			IFile mpiInclude = importFile("resources/includes","mpi.h");
-			assertNotNull(mpiInclude);
-			String tempPath = mpiInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-			System.out.println("tempPath="+tempPath);
-			String includePath = mpiInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-				+ mpiInclude.getFullPath().toFile().getAbsolutePath();
-			System.out.println("includePath= "+includePath);
-	
-			assertTrue(file instanceof IAdaptable);
-	
-			CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-	
-			assertNotNull(cproject);
-			ICElement ce = cproject.findElement(file.getFullPath());
-	
-			// ICElement covers folders and translationunits
-			//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-			assertNotNull(ce);
-			List<String> includes = Arrays.asList(new String[] {includePath});
-			RunAnalyseMPIcommandHandler racm = new RunAnalyseMPIcommandHandler();
-			
-			racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-			
-			IMarker[] markers=file.findMarkers(MpiIDs.MARKER_ID, true, IResource.DEPTH_INFINITE);
-			assertNotNull(markers);
-			System.out.println("numMarkers: "+markers.length);
-			int max= markers.length; //Math.min(10, markers.length);
-			for (int i = 0; i < max; i++) {
-				IMarker marker = markers[i];
-				int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-				System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-			}
-			int[] expectedLinenos = {22,23,24,26,37,49,57};
-			final String mpiCW="MPI::COMM_WORLD";
-			String[] expectedMpiTypes= {"MPI::Init", mpiCW, mpiCW, "MPI_Comm_rank", mpiCW, mpiCW, "MPI::Finalize"};
-			//////////////////
-			ArtifactWithLine[] expectedArts = new ArtifactWithLine[expectedLinenos.length];
-			ArtifactWithLine[] markerArts = new ArtifactWithLine[markers.length];
-			for (int i = 0; i < expectedArts.length; i++) {
-				expectedArts[i]=new ArtifactWithLine(expectedLinenos[i],expectedMpiTypes[i]);		
-			}
-			for (int i = 0; i < markerArts.length; i++) {
-				markerArts[i]=new ArtifactWithLine(markers[i]);
-			}
-			Arrays.sort(expectedArts);
-			Arrays.sort(markerArts);
-			
-			assertEquals(expectedArts.length, markerArts.length);
- 
-			// Since these tests are in a loop, if one fails, must inspect the Console output to know which ones finished and which one failed.
-			for (int i = 0; i < markers.length; i++) {
-				// Marker should be on the line number we expect
-				System.out.println(i+". "+expectedArts[i].getLineNo()+" = "+markerArts[i].getLineNo());			
-				assertEquals(expectedArts[i].getLineNo(), markerArts[i].getLineNo());
-				
-				// Marker should be of the type name we expect
-				System.out.println("    "+expectedArts[i].getName()+" = "+markerArts[i].getName());			
-				assertEquals(expectedArts[i].getName(), markerArts[i].getName());
-				
-				boolean test=markerArts[i].equals(expectedArts[i]);
-				//the following never works, so we'll be happy enough with the two assertEquals above.
-				//assertEquals(expectedArts[i], markerArts[i]);
-			}
-		}
-
-	public void testMPI_CPPartifacts_wPref() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-		testMPI_CPPartifacts_wPref(true);
-		
-		// this doesn't work from test: works ok and finds cpp artifacts ok with live workspace.
-		// why?? In PldtAstVisitor.processFuncName(), line 211: IName[] names = tu.getDeclarations(binding) is an empty array in Junit test.
-		//testMPI_CPPartifacts_wPref(false);
-		
-		// for now, we will consider the workaround (which is the default setting) to be set "recognize artifacts by prefix" to true
-		
-		// do the same for C?
-
-		}
-
-
-
-	public void testMPI_CPPartifacts_wPref(boolean prefValue) throws Exception {
-	System.out.println("\n==> "+getMethodName()+"()...  prefValue="+prefValue);
-		MpiPlugin.getDefault().getPreferenceStore().setValue(MpiIDs.MPI_RECOGNIZE_APIS_BY_PREFIX_ALONE, prefValue);
-		IFile file = importFile("resources", "helloMPIcpp.cpp");
-		assertNotNull(file);
-		
-		IFile mpiInclude = importFile("resources/includes","mpi.h");
-		System.out.println("Recognize APIs by prefix is set to "+prefValue);
-		assertNotNull(mpiInclude);
-		String tempPath = mpiInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-		System.out.println("tempPath="+tempPath);
-		String includePath = mpiInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-			+ mpiInclude.getFullPath().toFile().getAbsolutePath();
-		System.out.println("includePath= "+includePath);
-	
-		assertTrue(file instanceof IAdaptable);
-	
-		CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-	
-		assertNotNull(cproject);
-		ICElement ce = cproject.findElement(file.getFullPath());
-	
-		// ICElement covers folders and translationunits
-		//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-		assertNotNull(ce);
-		List<String> includes = Arrays.asList(new String[] {includePath});
-		RunAnalyseMPIcommandHandler racm = new RunAnalyseMPIcommandHandler();
-		
-		racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-		
-		IMarker[] markers=file.findMarkers(MpiIDs.MARKER_ID, true, IResource.DEPTH_INFINITE);
-		assertNotNull(markers);
-		System.out.println("numMarkers: "+markers.length);
-		int max= markers.length; //Math.min(10, markers.length);
-		for (int i = 0; i < max; i++) {
-			IMarker marker = markers[i];
-			int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-			System.out.println(i+ ". marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-		}
-	
-		int[] expectedLinenos = {22,23,24,26,37,49,57};
-		final String mpiCW="MPI::COMM_WORLD";
-		String[] expectedMpiTypes= {"MPI::Init", mpiCW, mpiCW, "MPI_Comm_rank", mpiCW, mpiCW, "MPI::Finalize"};
-	
-		ArtifactWithLine[] expectedArts = new ArtifactWithLine[expectedLinenos.length];
-		ArtifactWithLine[] markerArts = new ArtifactWithLine[markers.length];
-		for (int i = 0; i < expectedArts.length; i++) {
-			expectedArts[i]=new ArtifactWithLine(expectedLinenos[i],expectedMpiTypes[i]);		
-		}
-		for (int i = 0; i < markerArts.length; i++) {
-			markerArts[i]=new ArtifactWithLine(markers[i]);
-		}
-		Arrays.sort(expectedArts);
-		Arrays.sort(markerArts);
-		
-		assertEquals(expectedArts.length, markerArts.length);
-	
-		// Since these tests are in a loop, if one fails, must inspect the Console output to know which ones finished and which one failed.
-		for (int i = 0; i < markers.length; i++) {
-			// Marker should be on the line number we expect
-			System.out.println(i+". "+expectedArts[i].getLineNo()+" = "+markerArts[i].getLineNo());			
-			assertEquals(expectedArts[i].getLineNo(), markerArts[i].getLineNo());
-			
-			// Marker should be of the type name we expect
-			System.out.println("    "+expectedArts[i].getName()+" = "+markerArts[i].getName());			
-			assertEquals(expectedArts[i].getName(), markerArts[i].getName());
-			
-			boolean test=markerArts[i].equals(expectedArts[i]);
-			//the following never works, so we'll be happy enough with the two assertEquals above.
-			//assertEquals(expectedArts[i], markerArts[i]);
-		}
-	
-	}
-
-
-
-
-
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI_barriers.java b/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI_barriers.java
deleted file mode 100644
index 891161f..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI_barriers.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.pldt.tests;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ptp.pldt.common.IDs;
-import org.eclipse.ptp.pldt.mpi.analysis.actions.RunAnalyseMPIAnalysiscommandHandler;
-import org.eclipse.ptp.pldt.tests.PldtBaseTestFramework.ArtifactWithLine;
-
-
-/**
- * 
- * 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.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.IDs.matchingSetMarkerID;
-		final String barrierParentID=org.eclipse.ptp.pldt.mpi.analysis.IDs.parentIDAttr;
-		final String barrierMyID=org.eclipse.ptp.pldt.mpi.analysis.IDs.myIDAttr;
-		
-		markers=file.findMarkers(barrierSetMarkerID, true, IResource.DEPTH_INFINITE);
-		//assertNotNull("2 Barrier Markers should be found",markers);
-		
-		int[] expectedMarkerLocn2= {7,10,7,10,7,10};// 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 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 iterator = keyset.iterator(); iterator.hasNext();) {
-				String key = (String) iterator.next();
-				Object obj = marker.getAttribute(key);
-				String value = obj.toString();
-				System.out.println("  " + key + ": " + value);
-			}
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return "";
-	}
-
-	
-	/**
-	 * Holds the basic parameters of what we expect to find in a Barrier Set.
-	 * <br>
-	 * Admittedly lightweight for now
-	 * @author beth
-	 *
-	 */
-	class BarrierSetBasics{
-
-		int numSets;
-		int numInEachSet; // note: all sets don't have to be the same size but in our very simple test cases so far, this is true
-		boolean hasError=false;
-		
-		BarrierSetBasics(int numSets, int numInEachSet){
-			this.numSets=numSets;
-			this.numInEachSet=numInEachSet;
-			
-		}
-		BarrierSetBasics(int numSets, int numInEachSet, boolean hasError){
-			this(numSets,numInEachSet);
-			this.hasError=hasError;
-			
-		}
-		public int getNumSets() {
-			return numSets;
-		}
-		public int getNumInEachSet() {
-			return numInEachSet;
-		}
-		public boolean getError() {
-			return hasError;
-		}
-	}
-
-
-
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_OpenMP.java b/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_OpenMP.java
deleted file mode 100644
index 10bec91..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_OpenMP.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.pldt.tests;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.cdt.core.dom.ast.IASTNode;
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ptp.pldt.common.Artifact;
-import org.eclipse.ptp.pldt.common.ArtifactManager;
-import org.eclipse.ptp.pldt.common.IArtifact;
-import org.eclipse.ptp.pldt.common.IDs;
-import org.eclipse.ptp.pldt.openmp.analysis.PAST.PASTOMPPragma;
-import org.eclipse.ptp.pldt.openmp.core.OpenMPPlugin;
-import org.eclipse.ptp.pldt.openmp.core.actions.RunAnalyseOpenMPcommandHandler;
-
-
-/**
- * @author beth
- *
- */
-public class Test_OpenMP extends PldtBaseTestFramework{
-	
-	public void testOpenMPartifacts() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-	
-			IFile file = importFile("resources", "helloOpenMP.c");
-			assertNotNull(file);
-			
-			IFile openmpInclude = importFile("resources/includes","omp.h");
-			assertNotNull(openmpInclude);
-			String tempPath = openmpInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-			//System.out.println("tempPath="+tempPath);
-			String includePath = openmpInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-				+ openmpInclude.getFullPath().toFile().getAbsolutePath();
-			//System.out.println("includePath= "+includePath);
-	
-			assertTrue(file instanceof IAdaptable);
-	
-			CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-	
-			assertNotNull(cproject);
-			ICElement ce = cproject.findElement(file.getFullPath());
-	
-			// ICElement covers folders and translationunits
-			//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-			assertNotNull(ce);
-			List<String> includes = Arrays.asList(new String[] {includePath});
-			RunAnalyseOpenMPcommandHandler racm = new RunAnalyseOpenMPcommandHandler();
-			
-			racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-			
-			IMarker[] markers=file.findMarkers(OpenMPPlugin.MARKER_ID, true, IResource.DEPTH_INFINITE);
-			assertNotNull(markers);
-			System.out.println("numMarkers: "+markers.length);
-			// need to sort markers, since they are not returned in a pre-determined order??
-			
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-				System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-			}
-	
-	
-			//When strings don't match, click on the first entry (ComparisonFailure) in the Failure Trace in the JUnit view to get a diff view
-			//assertEquals("This\nis\na\ntest", "This\nwas\na\ntest");
-			// there really should be three, including a pragma. testOpenMP_pragmas will
-			// concentrate on these
-			int[] expectedLinenos = {12, 14,20};
-			final String pragma="#pragma omp parallel private(numThreads, tid)";
-			String[] expectedOpenMPTypes= {pragma, "omp_get_thread_num","omp_get_num_threads"};
-			ArtifactWithLine[] expectedArts = new ArtifactWithLine[expectedLinenos.length];
-			ArtifactWithLine[] markerArts = new ArtifactWithLine[markers.length];
-			for (int i = 0; i < expectedArts.length; i++) {
-				expectedArts[i]=new ArtifactWithLine(expectedLinenos[i],expectedOpenMPTypes[i]);		
-			}
-			for (int i = 0; i < markerArts.length; i++) {
-				markerArts[i]=new ArtifactWithLine(markers[i]);
-			}
-			Arrays.sort(expectedArts);
-			Arrays.sort(markerArts);
-			
-			assertEquals(expectedArts.length, markerArts.length);
-			// Since these tests are in a loop, if one fails, must inspect the Console output to know which ones finished and which one failed.
-			for (int i = 0; i < markers.length; i++) {
-				// Marker should be on the line number we expect
-				System.out.println(i+". "+expectedArts[i].getLineNo()+" = "+markerArts[i].getLineNo());			
-				assertEquals(expectedArts[i].getLineNo(), markerArts[i].getLineNo());
-				
-				// Marker should be of the type name we expect
-				System.out.println("    "+expectedArts[i].getName()+" = "+markerArts[i].getName());			
-				assertEquals(expectedArts[i].getName(), markerArts[i].getName());
-				
-				boolean test=markerArts[i].equals(expectedArts[i]);
-				System.out.println("   markerArts.equals expectedArts: "+test);
-				//the following never works, so we'll be happy enough with the two assertEquals above.
-				//assertEquals(expectedArts[i], markerArts[i]);
-	
-			}
-	
-		}
-
-
-
-	public void testOpenMP_pragmas() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-	
-		IFile file = importFile("resources", "helloOpenMPpragmas.c");
-		assertNotNull(file);
-		
-		IFile openmpInclude = importFile("resources/includes","omp.h");
-		assertNotNull(openmpInclude);
-		String tempPath = openmpInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-		//System.out.println("tempPath="+tempPath);
-		String includePath = openmpInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-			+ openmpInclude.getFullPath().toFile().getAbsolutePath();
-		//System.out.println("includePath= "+includePath);
-	
-		assertTrue(file instanceof IAdaptable);
-	
-		CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-	
-		assertNotNull(cproject);
-		ICElement ce = cproject.findElement(file.getFullPath());
-	
-		// ICElement covers folders and translationunits
-		//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-		assertNotNull(ce);
-		List<String> includes = Arrays.asList(new String[] {includePath});
-		RunAnalyseOpenMPcommandHandler racm = new RunAnalyseOpenMPcommandHandler();
-		
-		racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-		
-		IMarker[] markers=file.findMarkers(OpenMPPlugin.MARKER_ID, true, IResource.DEPTH_INFINITE);
-		assertNotNull(markers);
-		System.out.println("numMarkers: "+markers.length);
-		// need to sort markers, since they are not returned in a pre-determined order??
-		
-
-	
-	
-		//When strings don't match, click on the first entry (ComparisonFailure) in the Failure Trace in the JUnit view to get a diff view
-		//assertEquals("This\nis\na\ntest", "This\nwas\na\ntest");
-	
-		int[] expectedLinenos = {21, 23, 29,34,36,40};
-		final String prag="#pragma omp parallel private(numThreads, tid)";
-		final String prag2="#pragma omp parallel shared(n,a,b)";
-		final String pragFor = "#pragma omp for";
-		final String pragParFor="#pragma omp parallel for";
-		String[] expectedMpiTypes= {prag,"omp_get_thread_num","omp_get_num_threads",prag2,pragFor,pragParFor};
-		ArtifactWithLine[] expectedArts = new ArtifactWithLine[expectedLinenos.length];
-		ArtifactWithLine[] markerArts = new ArtifactWithLine[markers.length];
-		for (int i = 0; i < expectedArts.length; i++) {
-			expectedArts[i]=new ArtifactWithLine(expectedLinenos[i],expectedMpiTypes[i]);		
-		}
-		for (int i = 0; i < markerArts.length; i++) {
-			markerArts[i]=new ArtifactWithLine(markers[i]);
-		}
-		Arrays.sort(expectedArts);
-		Arrays.sort(markerArts);
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
-			int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-			System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-		}
-		
-		// should find pragma and two other openmp artifacts
-		assertEquals(expectedArts.length, markerArts.length);
-		// Since these tests are in a loop, if one fails, must inspect the Console output to know which ones finished and which one failed.
-		for (int i = 0; i < markers.length; i++) {
-			// Marker should be on the line number we expect
-			System.out.println(i+". "+expectedArts[i].getLineNo()+" = "+markerArts[i].getLineNo());			
-			assertEquals(expectedArts[i].getLineNo(), markerArts[i].getLineNo());
-			
-			// Marker should be of the type name we expect
-			System.out.println("    "+expectedArts[i].getName()+" = "+markerArts[i].getName());			
-			assertEquals(expectedArts[i].getName(), markerArts[i].getName());
-			
-			boolean test=markerArts[i].equals(expectedArts[i]);
-			//the following never works, so we'll be happy enough with the two assertEquals above.
-			//assertEquals(expectedArts[i], markerArts[i]);
-	
-		}
-		System.out.println("== Check regions for 'show pragma region' usage");
-		// check information needed for pragma show region action
-        RegionInfo ri0 = getRegion(ArtifactManager.getArtifact(markerArts[0].getMarker()));      
-        assertNotNull(ri0);
-        System.out.println("0. region offset:"+ri0.offset+ " length:"+ri0.length+"  "+markerArts[0].getName());
-        assertEquals(642,ri0.offset);
-        assertEquals(290, ri0.length);
-       
-        RegionInfo ri1=getRegion(ArtifactManager.getArtifact(markerArts[1].getMarker()));
-        assertNull(ri1);
-        //System.out.println("1. region offset:"+ri1.offset+ " length:"+ri1.length);
-        System.out.println("1. not a pragma    "+markerArts[1].getName());
-        
-        RegionInfo ri2=getRegion(ArtifactManager.getArtifact(markerArts[2].getMarker()));
-        assertNull(ri2);
-        System.out.println("2. not a pragma    "+markerArts[2].getName());
-        //assertEquals(642,ri0.offset);
-        //assertEquals(290, ri0.length);
-        
-        RegionInfo ri3=getRegion(ArtifactManager.getArtifact(markerArts[3].getMarker()));
-        assertNotNull(ri3);
-        System.out.println("3. region offset:"+ri3.offset+ " length:"+ri3.length+"  "+markerArts[3].getName());
-		assertEquals(1014, ri3.offset);
-		assertEquals(214, ri3.length);
-        
-        RegionInfo ri4=getRegion(ArtifactManager.getArtifact(markerArts[4].getMarker()));
-        assertNotNull(ri4);
-        System.out.println("4. region offset:"+ri4.offset+ " length:"+ri4.length+"  "+markerArts[4].getName());
-		assertEquals(1038, ri4.offset);
-		assertEquals(187, ri4.length);
-        
-		RegionInfo ri5 = getRegion(ArtifactManager.getArtifact(markerArts[5].getMarker()));
-		assertNotNull(ri5);
-		System.out.println("5. region offset:" + ri5.offset + " length:"+ ri5.length + "  " + markerArts[5].getName());
-		assertEquals(1170, ri5.offset);
-		assertEquals(50, ri5.length);
-		 
-		System.out.println("done");
-		
-	
-	}
-	/**
-	 * copied from OpenMPArtifactView.makeShowInfoAction() more or less - not ideal
-	 * @param a
-	 */
-	RegionInfo getRegion(IArtifact a) {
-		Artifact artifact = (Artifact)a;
-	    Object p = artifact.getArtifactAssist();
-        if (p==null || !(p instanceof PASTOMPPragma))  return null;;
-        PASTOMPPragma ompPragma = (PASTOMPPragma)p;
-        IASTNode      iRegion    = ompPragma.getRegion();
-        ASTNode       region     = (iRegion instanceof ASTNode ? (ASTNode)iRegion : null);
-		if (region == null)
-			return null;
-		int offset = ompPragma.getRegionOffset();
-		int length = ompPragma.getRegionLength(); 
-		RegionInfo ri=new RegionInfo(offset, length);
-		return ri;
-
-	}
-	protected class RegionInfo{
-		int offset;
-		int length;
-		RegionInfo(int offset, int length){
-			this.offset=offset;
-			this.length=length;
-		}
-	}
-
-
-
-
-}
diff --git a/tools/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);
-	}
-}
