diff --git a/org.eclipse.rmf.ext.prostep/model/prostep.genmodel b/org.eclipse.rmf.ext.prostep/model/prostep.genmodel
index d6c04c7..6cb9bc7 100644
--- a/org.eclipse.rmf.ext.prostep/model/prostep.genmodel
+++ b/org.eclipse.rmf.ext.prostep/model/prostep.genmodel
@@ -6,8 +6,8 @@
     testsDirectory="" importerID="org.eclipse.emf.importer.ecore" complianceLevel="5.0"
     copyrightFields="false" language="" operationReflection="true" importOrganizing="true">
   <foreignModel>prostep.ecore</foreignModel>
-  <genPackages prefix="Prostep" basePackage="org.eclipse.rmf.ext" resource="XML" disposableProviderFactory="true"
-      ecorePackage="prostep.ecore#/">
+  <genPackages prefix="Prostep" basePackage="org.eclipse.rmf.ext" disposableProviderFactory="true"
+      fileExtensions="" ecorePackage="prostep.ecore#/">
     <genClasses ecoreClass="prostep.ecore#//ExchangeConversation">
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute prostep.ecore#//ExchangeConversation/identifier"/>
     </genClasses>
diff --git a/org.eclipse.rmf.ext.prostep/plugin.xml b/org.eclipse.rmf.ext.prostep/plugin.xml
index b064b2e..0050c96 100644
--- a/org.eclipse.rmf.ext.prostep/plugin.xml
+++ b/org.eclipse.rmf.ext.prostep/plugin.xml
@@ -23,11 +23,4 @@
             genModel="model/prostep.genmodel"/>
    </extension>
 
-   <extension point="org.eclipse.emf.ecore.extension_parser">
-      <!-- @generated prostep -->
-      <parser
-            type="prostep"
-            class="org.eclipse.rmf.ext.prostep.util.ProstepResourceFactoryImpl"/>
-   </extension>
-
 </plugin>
diff --git a/org.eclipse.rmf.ext.prostep/src/org/eclipse/rmf/ext/prostep/util/ProstepResourceFactoryImpl.java b/org.eclipse.rmf.ext.prostep/src/org/eclipse/rmf/ext/prostep/util/ProstepResourceFactoryImpl.java
deleted file mode 100644
index 1c03a0a..0000000
--- a/org.eclipse.rmf.ext.prostep/src/org/eclipse/rmf/ext/prostep/util/ProstepResourceFactoryImpl.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Copyright (c) 2014 itemis AG 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:
- *     Mark Broerkens - initial API and implementation
- * 
- */
-package org.eclipse.rmf.ext.prostep.util;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.resource.Resource;
-
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource Factory</b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.rmf.ext.prostep.util.ProstepResourceImpl
- * @generated
- */
-public class ProstepResourceFactoryImpl extends ResourceFactoryImpl {
-	/**
-	 * Creates an instance of the resource factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProstepResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Resource createResource(URI uri) {
-		XMLResource result = new ProstepResourceImpl(uri);
-		result.getDefaultSaveOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-		result.getDefaultLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-
-		result.getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
-
-		result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-		result.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-
-		result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
-		return result;
-	}
-
-} //ProstepResourceFactoryImpl
diff --git a/org.eclipse.rmf.ext.prostep/src/org/eclipse/rmf/ext/prostep/util/ProstepResourceImpl.java b/org.eclipse.rmf.ext.prostep/src/org/eclipse/rmf/ext/prostep/util/ProstepResourceImpl.java
deleted file mode 100644
index 9eee499..0000000
--- a/org.eclipse.rmf.ext.prostep/src/org/eclipse/rmf/ext/prostep/util/ProstepResourceImpl.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * Copyright (c) 2014 itemis AG 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:
- *     Mark Broerkens - initial API and implementation
- * 
- */
-package org.eclipse.rmf.ext.prostep.util;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource </b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.rmf.ext.prostep.util.ProstepResourceFactoryImpl
- * @generated
- */
-public class ProstepResourceImpl extends XMLResourceImpl {
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param uri the URI of the new resource.
-	 * @generated
-	 */
-	public ProstepResourceImpl(URI uri) {
-		super(uri);
-	}
-
-} //ProstepResourceImpl
diff --git a/org.eclipse.rmf.ext.prostep/src/org/eclipse/rmf/ext/prostep/util/ProstepXMLProcessor.java b/org.eclipse.rmf.ext.prostep/src/org/eclipse/rmf/ext/prostep/util/ProstepXMLProcessor.java
deleted file mode 100644
index e432912..0000000
--- a/org.eclipse.rmf.ext.prostep/src/org/eclipse/rmf/ext/prostep/util/ProstepXMLProcessor.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Copyright (c) 2014 itemis AG 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:
- *     Mark Broerkens - initial API and implementation
- * 
- */
-package org.eclipse.rmf.ext.prostep.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.resource.Resource;
-
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-
-import org.eclipse.rmf.ext.prostep.ProstepPackage;
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ProstepXMLProcessor extends XMLProcessor {
-
-	/**
-	 * Public constructor to instantiate the helper.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProstepXMLProcessor() {
-		super((EPackage.Registry.INSTANCE));
-		ProstepPackage.eINSTANCE.eClass();
-	}
-	
-	/**
-	 * Register for "*" and "xml" file extensions the ProstepResourceFactoryImpl factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected Map<String, Resource.Factory> getRegistrations() {
-		if (registrations == null) {
-			super.getRegistrations();
-			registrations.put(XML_EXTENSION, new ProstepResourceFactoryImpl());
-			registrations.put(STAR_EXTENSION, new ProstepResourceFactoryImpl());
-		}
-		return registrations;
-	}
-
-} //ProstepXMLProcessor
diff --git a/org.eclipse.rmf.releng.product/rmf-pror-standalone.product b/org.eclipse.rmf.releng.product/rmf-pror-standalone.product
index 9e5e776..7c0c172 100644
--- a/org.eclipse.rmf.releng.product/rmf-pror-standalone.product
+++ b/org.eclipse.rmf.releng.product/rmf-pror-standalone.product
@@ -23,7 +23,11 @@
    </configIni>
 
    <launcherArgs>
-      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac>
+      <vmArgs>-Dosgi.framework.extensions=org.eclipse.fx.osgi
+-Defxclipse.osgi.hook.debug=true
+      </vmArgs>
+      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
+      </vmArgsMac>
    </launcherArgs>
 
    <windowImages i16="/org.eclipse.rmf.reqif10.pror.editor/icons/full/prorIcon/prorIcon16.png" i32="/org.eclipse.rmf.reqif10.pror.editor/icons/full/prorIcon/prorIcon32.png" i48="/org.eclipse.rmf.reqif10.pror.editor/icons/full/prorIcon/prorIcon48.png" i64="/org.eclipse.rmf.reqif10.pror.editor/icons/full/prorIcon/prorIcon64.png" i128="/org.eclipse.rmf.reqif10.pror.editor/icons/full/prorIcon/prorIcon128.png"/>
diff --git a/org.eclipse.rmf.releng.target/juno/juno-3.8.target b/org.eclipse.rmf.releng.target/juno/juno-3.8.target
index 7bdbc13..8d33c56 100644
--- a/org.eclipse.rmf.releng.target/juno/juno-3.8.target
+++ b/org.eclipse.rmf.releng.target/juno/juno-3.8.target
@@ -19,5 +19,9 @@
 <unit id="org.eclipse.platform.sdk" version="3.8.2.M20130131-0800"/>
 <repository location="http://download.eclipse.org/eclipse/updates/3.8"/>
 </location>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+<unit id="org.eclipse.sphinx.emf.serialization.feature.group" version="0.8.1.201409171422"/>
+<repository location="http://download.eclipse.org/sphinx/updates/releases/0.8.x"/>
+</location>
 </locations>
 </target>
diff --git a/org.eclipse.rmf.releng.target/juno/juno.target b/org.eclipse.rmf.releng.target/juno/juno.target
index c151a20..3395d1e 100644
--- a/org.eclipse.rmf.releng.target/juno/juno.target
+++ b/org.eclipse.rmf.releng.target/juno/juno.target
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.8"?><target name="JUNO_4_2_2" sequenceNumber="17">
+<?pde version="3.8"?><target name="JUNO_4_2_2" sequenceNumber="18">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.emf.validation.sdk.feature.group" version="1.6.0.v20120328-0001-67T-96SGR75UNqZNTdeQnghI6uFA"/>
@@ -17,5 +17,9 @@
 <unit id="org.apache.xerces" version="2.9.0.v201101211617"/>
 <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20130827064939/repository/"/>
 </location>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+<unit id="org.eclipse.sphinx.emf.serialization.feature.group" version="0.8.1.201409171422"/>
+<repository location="http://download.eclipse.org/sphinx/updates/releases/0.8.x"/>
+</location>
 </locations>
 </target>
diff --git a/org.eclipse.rmf.releng.target/kepler/kepler.target b/org.eclipse.rmf.releng.target/kepler/kepler.target
index b0bb2c1..228321b 100644
--- a/org.eclipse.rmf.releng.target/kepler/kepler.target
+++ b/org.eclipse.rmf.releng.target/kepler/kepler.target
@@ -16,5 +16,9 @@
 <unit id="org.eclipse.emf.sdk.feature.group" version="2.9.1.v20130902-0605"/>
 <repository location="http://download.eclipse.org/releases/kepler/"/>
 </location>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+<unit id="org.eclipse.sphinx.emf.serialization.feature.group" version="0.8.1.201409171422"/>
+<repository location="http://download.eclipse.org/sphinx/updates/releases/0.8.x"/>
+</location>
 </locations>
 </target>
diff --git a/org.eclipse.rmf.releng.target/luna/luna.target b/org.eclipse.rmf.releng.target/luna/luna.target
index 126cfc6..ac2ddfc 100644
--- a/org.eclipse.rmf.releng.target/luna/luna.target
+++ b/org.eclipse.rmf.releng.target/luna/luna.target
@@ -18,5 +18,9 @@
 <unit id="org.apache.poi" version="3.9.0.v201405241750"/>
 <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository"/>
 </location>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+<unit id="org.eclipse.sphinx.emf.serialization.feature.group" version="0.8.1.201409171422"/>
+<repository location="http://download.eclipse.org/sphinx/updates/releases/0.8.x"/>
+</location>
 </locations>
 </target>
diff --git a/org.eclipse.rmf.releng.target/mars/mars.target b/org.eclipse.rmf.releng.target/mars/mars.target
index 5abed5b..0c89d82 100644
--- a/org.eclipse.rmf.releng.target/mars/mars.target
+++ b/org.eclipse.rmf.releng.target/mars/mars.target
@@ -2,15 +2,15 @@
 <?pde version="3.8"?><target name="MARS" sequenceNumber="22">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.sdk.ide" version="4.5.0.I20140918-0330"/>
-<unit id="org.eclipse.equinox.executable.feature.group" version="3.6.100.v20140918-0709"/>
+<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
+<unit id="org.eclipse.equinox.executable.feature.group" version="0.0.0"/>
 <repository location="http://download.eclipse.org/eclipse/updates/4.5milestones"/>
 </location>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.emf.sdk.feature.group" version="2.11.0.v20140929-0830"/>
-<unit id="org.eclipse.emf.validation.sdk.feature.group" version="1.9.0.201409241438"/>
-<unit id="org.eclipse.xsd.sdk.feature.group" version="2.10.0.v20140929-0830"/>
-<repository location="http://download.eclipse.org/releases/staging"/>
+<unit id="org.eclipse.emf.sdk.feature.group" version="0.0.0"/>
+<unit id="org.eclipse.emf.validation.sdk.feature.group" version="0.0.0"/>
+<unit id="org.eclipse.xsd.sdk.feature.group" version="0.0.0"/>
+<repository location="http://download.eclipse.org/releases/mars"/>
 </location>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="com.google.guava" version="15.0.0.v201403281430"/>
@@ -18,5 +18,9 @@
 <unit id="org.apache.poi" version="3.9.0.v201405241750"/>
 <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository"/>
 </location>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+<unit id="org.eclipse.sphinx.emf.serialization.feature.group" version="0.0.0"/>
+<repository location="http://download.eclipse.org/sphinx/updates/interim"/>
+</location>
 </locations>
 </target>
diff --git a/org.eclipse.rmf.releng/README.txt b/org.eclipse.rmf.releng/README.txt
index 431421b..6e121bb 100644
--- a/org.eclipse.rmf.releng/README.txt
+++ b/org.eclipse.rmf.releng/README.txt
@@ -1,3 +1,8 @@
 Building RMF from the command line.  Note that there is also a launch configuration in "launcher".
 
-mvn clean verify -P platform-indigo
+mvn clean verify -P platform-juno
+
+Tests take very long - to skip, add
+
+-Dmaven.test.skip=true 
+
diff --git a/org.eclipse.rmf.releng/launcher/LUNA.launch b/org.eclipse.rmf.releng/launcher/LUNA.launch
index e4fe2ef..57217ad 100644
--- a/org.eclipse.rmf.releng/launcher/LUNA.launch
+++ b/org.eclipse.rmf.releng/launcher/LUNA.launch
@@ -4,7 +4,7 @@
 <stringAttribute key="M2_GOALS" value="clean verify"/>
 <booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
 <booleanAttribute key="M2_OFFLINE" value="false"/>
-<stringAttribute key="M2_PROFILES" value="platform-kepler"/>
+<stringAttribute key="M2_PROFILES" value="platform-luna"/>
 <listAttribute key="M2_PROPERTIES"/>
 <stringAttribute key="M2_RUNTIME" value="EMBEDDED"/>
 <booleanAttribute key="M2_SKIP_TESTS" value="false"/>
diff --git a/org.eclipse.rmf.releng/pom.xml b/org.eclipse.rmf.releng/pom.xml
index 27209e8..a953e89 100644
--- a/org.eclipse.rmf.releng/pom.xml
+++ b/org.eclipse.rmf.releng/pom.xml
@@ -67,7 +67,7 @@
 		<module>../org.eclipse.rmf.reqif10.common</module>
 		<module>../org.eclipse.rmf.reqif10.constraints</module>
 		<module>../org.eclipse.rmf.reqif10.serialization</module>
-		<module>../org.eclipse.rmf.serialization</module>
+		
 		<module>../org.eclipse.rmf.ext.prostep</module>
 		
 		<module>../org.eclipse.rmf.reqif10.feature</module>
@@ -91,6 +91,7 @@
 		<module>../org.eclipse.rmf.reqif10.search</module>
 		<module>../org.eclipse.rmf.reqif10.search.edit</module>
 		<module>../org.eclipse.rmf.reqif10.search.ui</module>
+		<module>../org.eclipse.rmf.reqif10.search.test</module>
 		<module>../org.eclipse.rmf.reqif10.pror.genhtml</module>
 		<module>../org.eclipse.rmf.reqif10.csv.importer</module>
 		<module>../org.eclipse.rmf.reqif10.pror.feature</module>
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/util/ProrXhtmlSimplifiedHelper.java b/org.eclipse.rmf.reqif10.common/src/org/eclipse/rmf/reqif10/common/util/ProrXhtmlSimplifiedHelper.java
similarity index 97%
rename from org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/util/ProrXhtmlSimplifiedHelper.java
rename to org.eclipse.rmf.reqif10.common/src/org/eclipse/rmf/reqif10/common/util/ProrXhtmlSimplifiedHelper.java
index 5ce9c86..cc2085a 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/util/ProrXhtmlSimplifiedHelper.java
+++ b/org.eclipse.rmf.reqif10.common/src/org/eclipse/rmf/reqif10/common/util/ProrXhtmlSimplifiedHelper.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     Lukas Ladenberger - initial API and implementation
  ******************************************************************************/
-package org.eclipse.rmf.reqif10.pror.util;
+package org.eclipse.rmf.reqif10.common.util;
 
 import java.io.IOException;
 import java.io.StringWriter;
@@ -21,7 +21,6 @@
 import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
 import org.eclipse.rmf.reqif10.XhtmlContent;
-import org.eclipse.rmf.reqif10.common.util.ReqIF10XhtmlUtil;
 import org.eclipse.rmf.reqif10.xhtml.XhtmlDivType;
 import org.eclipse.rmf.reqif10.xhtml.XhtmlFactory;
 
diff --git a/org.eclipse.rmf.reqif10.csv.importer/META-INF/MANIFEST.MF b/org.eclipse.rmf.reqif10.csv.importer/META-INF/MANIFEST.MF
index aa3d3a5..a8e0ec2 100644
--- a/org.eclipse.rmf.reqif10.csv.importer/META-INF/MANIFEST.MF
+++ b/org.eclipse.rmf.reqif10.csv.importer/META-INF/MANIFEST.MF
@@ -16,7 +16,6 @@
  org.eclipse.emf.databinding.edit,
  org.eclipse.core.databinding.property,
  org.eclipse.rmf.reqif10.pror.editor;bundle-version="0.12.0",
- org.eclipse.rmf.reqif10.xhtml.edit;bundle-version="0.12.0",
- org.eclipse.rmf.serialization;bundle-version="0.12.0"
+ org.eclipse.sphinx.emf.serialization;bundle-version="0.8.1"
 Bundle-ActivationPolicy: lazy
 Bundle-Activator: org.eclipse.rmf.reqif10.csv.importer.CSVImporterPlugin$Implementation
diff --git a/org.eclipse.rmf.reqif10.csv.importer/about.html b/org.eclipse.rmf.reqif10.csv.importer/about.html
index c258ef5..3a8e6c6 100644
--- a/org.eclipse.rmf.reqif10.csv.importer/about.html
+++ b/org.eclipse.rmf.reqif10.csv.importer/about.html
@@ -24,5 +24,17 @@
 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>Third Party Content</h3>
+
+The Content includes items that have been sourced from third parties as set out below. If you did not receive this Content directly from the Eclipse Foundation, the following is provided for informational purposes only, and you should look to the Redistributor's license for terms and conditions of use.
+
+<h4>OpenCSV 1.8</h4>
+
+<p>The plug-in includes binaries of software developed by the <a href="http://opencsv.sourceforge.net">OpenCSV Project</a> ("Open CSV") at SourceForge.net.</p>
+
+<p>Your use of Open CSV is governed by the terms and conditions of the <a href="about_files/APACHE_LICENSE-2.0.html">Apache License 2.0</a>.</p>
+
+<p>The Open CSV source code can be downloaded from the <a href="http://downloads.sourceforge.net/opencsv/opencsv-1.8-src-with-libs.tar.gz?modtime=1185864370&big_mirror=0">Open CSV download area on SourceForge.net</a>.</p>
+
 </body>
 </html>
\ No newline at end of file
diff --git a/org.eclipse.rmf.reqif10.csv.importer/about_files/APACHE_LICENSE-2.0.html b/org.eclipse.rmf.reqif10.csv.importer/about_files/APACHE_LICENSE-2.0.html
new file mode 100644
index 0000000..4dd0005
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.csv.importer/about_files/APACHE_LICENSE-2.0.html
@@ -0,0 +1,188 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html lang="en">
+  <head>
+    <title>Apache License, Version 2.0</title>
+    <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file to you under the Apache License, Version 2.0 (the &quot;License&quot;); you may not use this file except in compliance with the License.  You may obtain a copy of the License at . http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the specific language governing permissions and limitations under the License. -->
+  </head>
+
+  <body>
+      <div id="content" class="grid_16"><div class="section-content"><p>Apache License<br></br>Version 2.0, January 2004<br></br>
+<a href="http://www.apache.org/licenses/">http://www.apache.org/licenses/</a> </p>
+<p>TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION</p>
+<p><strong><a name="definitions">1. Definitions</a></strong>.</p>
+<p>"License" shall mean the terms and conditions for use, reproduction, and
+distribution as defined by Sections 1 through 9 of this document.</p>
+<p>"Licensor" shall mean the copyright owner or entity authorized by the
+copyright owner that is granting the License.</p>
+<p>"Legal Entity" shall mean the union of the acting entity and all other
+entities that control, are controlled by, or are under common control with
+that entity. For the purposes of this definition, "control" means (i) the
+power, direct or indirect, to cause the direction or management of such
+entity, whether by contract or otherwise, or (ii) ownership of fifty
+percent (50%) or more of the outstanding shares, or (iii) beneficial
+ownership of such entity.</p>
+<p>"You" (or "Your") shall mean an individual or Legal Entity exercising
+permissions granted by this License.</p>
+<p>"Source" form shall mean the preferred form for making modifications,
+including but not limited to software source code, documentation source,
+and configuration files.</p>
+<p>"Object" form shall mean any form resulting from mechanical transformation
+or translation of a Source form, including but not limited to compiled
+object code, generated documentation, and conversions to other media types.</p>
+<p>"Work" shall mean the work of authorship, whether in Source or Object form,
+made available under the License, as indicated by a copyright notice that
+is included in or attached to the work (an example is provided in the
+Appendix below).</p>
+<p>"Derivative Works" shall mean any work, whether in Source or Object form,
+that is based on (or derived from) the Work and for which the editorial
+revisions, annotations, elaborations, or other modifications represent, as
+a whole, an original work of authorship. For the purposes of this License,
+Derivative Works shall not include works that remain separable from, or
+merely link (or bind by name) to the interfaces of, the Work and Derivative
+Works thereof.</p>
+<p>"Contribution" shall mean any work of authorship, including the original
+version of the Work and any modifications or additions to that Work or
+Derivative Works thereof, that is intentionally submitted to Licensor for
+inclusion in the Work by the copyright owner or by an individual or Legal
+Entity authorized to submit on behalf of the copyright owner. For the
+purposes of this definition, "submitted" means any form of electronic,
+verbal, or written communication sent to the Licensor or its
+representatives, including but not limited to communication on electronic
+mailing lists, source code control systems, and issue tracking systems that
+are managed by, or on behalf of, the Licensor for the purpose of discussing
+and improving the Work, but excluding communication that is conspicuously
+marked or otherwise designated in writing by the copyright owner as "Not a
+Contribution."</p>
+<p>"Contributor" shall mean Licensor and any individual or Legal Entity on
+behalf of whom a Contribution has been received by Licensor and
+subsequently incorporated within the Work.</p>
+<p><strong><a name="copyright">2. Grant of Copyright License</a></strong>. Subject to the
+terms and conditions of this License, each Contributor hereby grants to You
+a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+copyright license to reproduce, prepare Derivative Works of, publicly
+display, publicly perform, sublicense, and distribute the Work and such
+Derivative Works in Source or Object form.</p>
+<p><strong><a name="patent">3. Grant of Patent License</a></strong>. Subject to the terms
+and conditions of this License, each Contributor hereby grants to You a
+perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+(except as stated in this section) patent license to make, have made, use,
+offer to sell, sell, import, and otherwise transfer the Work, where such
+license applies only to those patent claims licensable by such Contributor
+that are necessarily infringed by their Contribution(s) alone or by
+combination of their Contribution(s) with the Work to which such
+Contribution(s) was submitted. If You institute patent litigation against
+any entity (including a cross-claim or counterclaim in a lawsuit) alleging
+that the Work or a Contribution incorporated within the Work constitutes
+direct or contributory patent infringement, then any patent licenses
+granted to You under this License for that Work shall terminate as of the
+date such litigation is filed.</p>
+<p><strong><a name="redistribution">4. Redistribution</a></strong>. You may reproduce and
+distribute copies of the Work or Derivative Works thereof in any medium,
+with or without modifications, and in Source or Object form, provided that
+You meet the following conditions:</p>
+<ol style="list-style: lower-latin;">
+<li>You must give any other recipients of the Work or Derivative Works a
+copy of this License; and</li>
+
+<li>You must cause any modified files to carry prominent notices stating
+that You changed the files; and</li>
+
+<li>You must retain, in the Source form of any Derivative Works that You
+distribute, all copyright, patent, trademark, and attribution notices from
+the Source form of the Work, excluding those notices that do not pertain to
+any part of the Derivative Works; and</li>
+
+<li>If the Work includes a "NOTICE" text file as part of its distribution,
+then any Derivative Works that You distribute must include a readable copy
+of the attribution notices contained within such NOTICE file, excluding
+those notices that do not pertain to any part of the Derivative Works, in
+at least one of the following places: within a NOTICE text file distributed
+as part of the Derivative Works; within the Source form or documentation,
+if provided along with the Derivative Works; or, within a display generated
+by the Derivative Works, if and wherever such third-party notices normally
+appear. The contents of the NOTICE file are for informational purposes only
+and do not modify the License. You may add Your own attribution notices
+within Derivative Works that You distribute, alongside or as an addendum to
+the NOTICE text from the Work, provided that such additional attribution
+notices cannot be construed as modifying the License.
+<br/>
+<br/>
+You may add Your own copyright statement to Your modifications and may
+provide additional or different license terms and conditions for use,
+reproduction, or distribution of Your modifications, or for any such
+Derivative Works as a whole, provided Your use, reproduction, and
+distribution of the Work otherwise complies with the conditions stated in
+this License.
+</li>
+
+</ol>
+
+<p><strong><a name="contributions">5. Submission of Contributions</a></strong>. Unless You
+explicitly state otherwise, any Contribution intentionally submitted for
+inclusion in the Work by You to the Licensor shall be under the terms and
+conditions of this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify the
+terms of any separate license agreement you may have executed with Licensor
+regarding such Contributions.</p>
+<p><strong><a name="trademarks">6. Trademarks</a></strong>. This License does not grant
+permission to use the trade names, trademarks, service marks, or product
+names of the Licensor, except as required for reasonable and customary use
+in describing the origin of the Work and reproducing the content of the
+NOTICE file.</p>
+<p><strong><a name="no-warranty">7. Disclaimer of Warranty</a></strong>. Unless required by
+applicable law or agreed to in writing, Licensor provides the Work (and
+each Contributor provides its Contributions) on an "AS IS" 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. You
+are solely responsible for determining the appropriateness of using or
+redistributing the Work and assume any risks associated with Your exercise
+of permissions under this License.</p>
+<p><strong><a name="no-liability">8. Limitation of Liability</a></strong>. In no event and
+under no legal theory, whether in tort (including negligence), contract, or
+otherwise, unless required by applicable law (such as deliberate and
+grossly negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special,
+incidental, or consequential damages of any character arising as a result
+of this License or out of the use or inability to use the Work (including
+but not limited to damages for loss of goodwill, work stoppage, computer
+failure or malfunction, or any and all other commercial damages or losses),
+even if such Contributor has been advised of the possibility of such
+damages.</p>
+<p><strong><a name="additional">9. Accepting Warranty or Additional Liability</a></strong>.
+While redistributing the Work or Derivative Works thereof, You may choose
+to offer, and charge a fee for, acceptance of support, warranty, indemnity,
+or other liability obligations and/or rights consistent with this License.
+However, in accepting such obligations, You may act only on Your own behalf
+and on Your sole responsibility, not on behalf of any other Contributor,
+and only if You agree to indemnify, defend, and hold each Contributor
+harmless for any liability incurred by, or claims asserted against, such
+Contributor by reason of your accepting any such warranty or additional
+liability.</p>
+<p>END OF TERMS AND CONDITIONS</p>
+<h1 id="apply">APPENDIX: How to apply the Apache License to your work</h1>
+<p>To apply the Apache License to your work, attach the following boilerplate
+notice, with the fields enclosed by brackets "[]" replaced with your own
+identifying information. (Don't include the brackets!) The text should be
+enclosed in the appropriate comment syntax for the file format. We also
+recommend that a file or class name and description of purpose be included
+on the same "printed page" as the copyright notice for easier
+identification within third-party archives.</p>
+<div class="codehilite"><pre>Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+</pre></div></div></div>
+      <div class="clear"></div>
+    </div>
+  </body>
+</html>
diff --git a/org.eclipse.rmf.reqif10.csv.importer/build.properties b/org.eclipse.rmf.reqif10.csv.importer/build.properties
index f36eb1d..5f6937a 100644
--- a/org.eclipse.rmf.reqif10.csv.importer/build.properties
+++ b/org.eclipse.rmf.reqif10.csv.importer/build.properties
@@ -8,7 +8,8 @@
                icons/,\
                epl-v10.html,\
                notice.html,\
-               about.html
+               about.html,\
+               about_files/
 jars.compile.order = .
 source.. = src/
 output.. = bin/
diff --git a/org.eclipse.rmf.reqif10.csv.importer/plugin.xml b/org.eclipse.rmf.reqif10.csv.importer/plugin.xml
index a1b369d..12fbc88 100644
--- a/org.eclipse.rmf.reqif10.csv.importer/plugin.xml
+++ b/org.eclipse.rmf.reqif10.csv.importer/plugin.xml
@@ -31,7 +31,7 @@
          point="org.eclipse.ui.importWizards">
       <wizard
             category="org.eclipse.rmf.pror.import.category"
-            class="org.eclipse.rmf.reqif10.csv.importer.ui.wizards.CSVImportWziard"
+            class="org.eclipse.rmf.reqif10.csv.importer.ui.wizards.CSVImportWizard"
             icon="icons/full/obj16/excel.png"
             id="org.eclipse.rmf.reqif10.csv.importer.ui.wizard"
             name="CSV">
diff --git a/org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/ui/wizards/CSVImportWziard.java b/org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/ui/wizards/CSVImportWizard.java
similarity index 95%
rename from org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/ui/wizards/CSVImportWziard.java
rename to org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/ui/wizards/CSVImportWizard.java
index 63b71db..156730d 100644
--- a/org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/ui/wizards/CSVImportWziard.java
+++ b/org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/ui/wizards/CSVImportWizard.java
@@ -34,7 +34,7 @@
 import org.eclipse.rmf.reqif10.csv.importer.ui.wizards.pages.CSVMappingWizardPage;
 import org.eclipse.rmf.reqif10.csv.importer.utils.Importer;
 import org.eclipse.rmf.reqif10.csv.importer.utils.Utils;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.Reqif10Editor;
+import org.eclipse.rmf.reqif10.pror.editor.IReqifEditor;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IEditorReference;
 import org.eclipse.ui.IImportWizard;
@@ -42,12 +42,12 @@
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 
-public class CSVImportWziard extends Wizard implements IImportWizard {
+public class CSVImportWizard extends Wizard implements IImportWizard {
 
 	private CSVImportWizardPage importWizardPage;
 	private CSVMappingWizardPage mappingWizardPage;
 
-	public CSVImportWziard() {
+	public CSVImportWizard() {
 		setWindowTitle("CSV Import Wizard");
 		setNeedsProgressMonitor(true);
 	}
@@ -118,7 +118,7 @@
 				.getEditorReferences();
 		for (IEditorReference editorReference : editorReferences) {
 			IEditorPart editorPart = editorReference.getEditor(false);
-			if (editorPart instanceof Reqif10Editor) {
+			if (editorPart instanceof IReqifEditor) {
 				try {
 					uriMap.put(EditUIUtil.getURI(editorReference
 							.getEditorInput()),
diff --git a/org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/ui/wizards/pages/RightMappingPart.java b/org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/ui/wizards/pages/RightMappingPart.java
index e30aaf6..c0fede2 100644
--- a/org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/ui/wizards/pages/RightMappingPart.java
+++ b/org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/ui/wizards/pages/RightMappingPart.java
@@ -150,7 +150,7 @@
 	}
 
 	private void createColumnMappingComboViewer(Composite composite) {
-		columnMappingComboViewer = createComboViewer("Column Mapping : ",
+		columnMappingComboViewer = createComboViewer("Column Mapping: ",
 				composite, columnMappingInput);
 	}
 
@@ -164,11 +164,11 @@
 	}
 
 	private void createAttributeNameTextWidget(Composite composite) {
-		attributeNameTextWidget = createText("Attribute name", composite);
+		attributeNameTextWidget = createText("Attribute Name:", composite);
 	}
 
 	private void createDataTypeComboViewer(Composite composite) {
-		dataTypeComboViewer = createComboViewer("Data Type : ", composite,
+		dataTypeComboViewer = createComboViewer("Data Type: ", composite,
 				DataType.values());
 	}
 
diff --git a/org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/utils/Utils.java b/org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/utils/Utils.java
index e7580af..e72db34 100644
--- a/org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/utils/Utils.java
+++ b/org.eclipse.rmf.reqif10.csv.importer/src/org/eclipse/rmf/reqif10/csv/importer/utils/Utils.java
@@ -25,8 +25,7 @@
 import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
 import org.eclipse.rmf.reqif10.pror.configuration.provider.ConfigurationItemProviderAdapterFactory;
 import org.eclipse.rmf.reqif10.pror.provider.ReqIF10ItemProviderAdapterFactory;
-import org.eclipse.rmf.reqif10.xhtml.provider.XhtmlItemProviderAdapterFactory;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceSetImpl;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceSetImpl;
 
 import au.com.bytecode.opencsv.CSVReader;
 
@@ -56,7 +55,6 @@
 				.addAdapterFactory(new ResourceItemProviderAdapterFactory());
 		adapterFactory
 				.addAdapterFactory(new ReqIF10ItemProviderAdapterFactory());
-		adapterFactory.addAdapterFactory(new XhtmlItemProviderAdapterFactory());
 		adapterFactory
 				.addAdapterFactory(new ConfigurationItemProviderAdapterFactory());
 		adapterFactory
diff --git a/org.eclipse.rmf.reqif10.feature/feature.xml b/org.eclipse.rmf.reqif10.feature/feature.xml
index 7036646..4a6e2e3 100644
--- a/org.eclipse.rmf.reqif10.feature/feature.xml
+++ b/org.eclipse.rmf.reqif10.feature/feature.xml
@@ -28,15 +28,12 @@
          id="org.eclipse.rmf.reqif10.thirdparty.feature"
          version="0.0.0"/>
 
-   <plugin
-         id="org.eclipse.rmf.reqif10"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
+   <requires>
+      <import feature="org.eclipse.sphinx.emf.serialization" version="0.8.1.201409171422" match="greaterOrEqual"/>
+   </requires>
 
    <plugin
-         id="org.eclipse.rmf.serialization"
+         id="org.eclipse.rmf.reqif10"
          download-size="0"
          install-size="0"
          version="0.0.0"
diff --git a/org.eclipse.rmf.reqif10.pror.edit/META-INF/MANIFEST.MF b/org.eclipse.rmf.reqif10.pror.edit/META-INF/MANIFEST.MF
index 8df6512..766a132 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/META-INF/MANIFEST.MF
+++ b/org.eclipse.rmf.reqif10.pror.edit/META-INF/MANIFEST.MF
@@ -8,9 +8,10 @@
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.rmf.reqif10.pror.configuration.provider,or
- g.eclipse.rmf.reqif10.pror.edit.presentation.service,org.eclipse.rmf.
- reqif10.pror.provider,org.eclipse.rmf.reqif10.pror.util
+Export-Package: org.eclipse.rmf.reqif10.pror.configuration.provider,
+ org.eclipse.rmf.reqif10.pror.edit.presentation.service,
+ org.eclipse.rmf.reqif10.pror.provider,
+ org.eclipse.rmf.reqif10.pror.util
 Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.emf.edit;visibility:=reexport,
  org.eclipse.emf.ecore;visibility:=reexport,
diff --git a/org.eclipse.rmf.reqif10.pror.edit/icons/full/obj16/UnifiedColumn.png b/org.eclipse.rmf.reqif10.pror.edit/icons/full/obj16/UnifiedColumn.png
new file mode 100644
index 0000000..155a22b
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.pror.edit/icons/full/obj16/UnifiedColumn.png
Binary files differ
diff --git a/org.eclipse.rmf.reqif10.pror.edit/plugin.properties b/org.eclipse.rmf.reqif10.pror.edit/plugin.properties
index 00f946f..45e0142 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/plugin.properties
+++ b/org.eclipse.rmf.reqif10.pror.edit/plugin.properties
@@ -1714,3 +1714,4 @@
 _UI_ReqIFToolExtension_extensions_feature = Extensions
 _UI_XhtmlContent_xhtml_feature = Xhtml
 _UI_XhtmlContent_xhtmlSource_feature = Xhtml Source
+_UI_UnifiedColumn_type = Unified Column
diff --git a/org.eclipse.rmf.reqif10.pror.edit/plugin.xml b/org.eclipse.rmf.reqif10.pror.edit/plugin.xml
index fc3348a..57e178c 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/plugin.xml
+++ b/org.eclipse.rmf.reqif10.pror.edit/plugin.xml
@@ -30,13 +30,17 @@
                org.eclipse.emf.edit.provider.IItemPropertySource"/>
    </extension>
 
-<!--
-TODO reactivate!
-   <extension
-         point="org.eclipse.rmf.reqif10.resource.reqiftoolextension">
-      <reqiftoolextension
-            class="org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl">
-      </reqiftoolextension>
+   <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
+      <!-- @generated reqif10 -->
+      <factory
+            uri="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd"
+            class="org.eclipse.rmf.reqif10.pror.provider.ReqIF10ItemProviderAdapterFactory"
+            supportedTypes=
+              "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
+               org.eclipse.emf.edit.provider.IStructuredItemContentProvider
+               org.eclipse.emf.edit.provider.ITreeItemContentProvider
+               org.eclipse.emf.edit.provider.IItemLabelProvider
+               org.eclipse.emf.edit.provider.IItemPropertySource"/>
    </extension>
--->
+
 </plugin>
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ColumnItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ColumnItemProvider.java
index e58a1ce..8a9ded4 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ColumnItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ColumnItemProvider.java
@@ -13,7 +13,6 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.util.ResourceLocator;
@@ -29,7 +28,6 @@
 import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.pror.configuration.Column;
 import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
 import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ConfigurationItemProviderAdapterFactory.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ConfigurationItemProviderAdapterFactory.java
index 0ebe33d..e75769f 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ConfigurationItemProviderAdapterFactory.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ConfigurationItemProviderAdapterFactory.java
@@ -214,6 +214,29 @@
 	}
 
 	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UnifiedColumnItemProvider unifiedColumnItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createUnifiedColumnAdapter() {
+		if (unifiedColumnItemProvider == null) {
+			unifiedColumnItemProvider = new UnifiedColumnItemProvider(this);
+		}
+
+		return unifiedColumnItemProvider;
+	}
+
+	/**
 	 * This returns the root adapter factory that contains this factory.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ProrSpecViewConfigurationItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ProrSpecViewConfigurationItemProvider.java
index 4aed386..5756a2f 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ProrSpecViewConfigurationItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ProrSpecViewConfigurationItemProvider.java
@@ -179,8 +179,9 @@
 	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
 	 * that can be created under this object.
 	 * <!-- begin-user-doc -->
+	 * We do not allow the creation of the unified column this way.
 	 * <!-- end-user-doc -->
-	 * @generated
+	 * @generated NOT
 	 */
 	@Override
 	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ProrToolExtensionItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ProrToolExtensionItemProvider.java
index 3b39082..2d2813c 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ProrToolExtensionItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/ProrToolExtensionItemProvider.java
@@ -14,7 +14,6 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.util.ResourceLocator;
@@ -30,7 +29,6 @@
 import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationFactory;
 import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
 import org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension;
-import org.eclipse.rmf.reqif10.pror.provider.ReqIFToolExtensionItemProvider;
 import org.eclipse.rmf.reqif10.pror.provider.Reqif10EditPlugin;
 
 
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/UnifiedColumnItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/UnifiedColumnItemProvider.java
new file mode 100644
index 0000000..ff7ced5
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/configuration/provider/UnifiedColumnItemProvider.java
@@ -0,0 +1,109 @@
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+
+import org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class UnifiedColumnItemProvider extends ColumnItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public UnifiedColumnItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This returns UnifiedColumn.gif.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return overlayImage(object, getResourceLocator().getImage("full/obj16/UnifiedColumn.png"));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected boolean shouldComposeCreationImage() {
+		return true;
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getText(Object object) {
+		String label = ((UnifiedColumn)object).getLabel();
+		return label == null || label.length() == 0 ?
+			getString("_UI_UnifiedColumn_type") :
+			getString("_UI_UnifiedColumn_type") + " " + label;
+	}
+	
+
+	/**
+	 * This handles model notifications by calling {@link #updateChildren} to update any cached
+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		updateChildren(notification);
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+	 * that can be created under this object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionBooleanItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionBooleanItemProvider.java
index 4ccb4a6..b1dfbd0 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionBooleanItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionBooleanItemProvider.java
@@ -14,16 +14,10 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeDefinitionBoolean;
 import org.eclipse.rmf.reqif10.ReqIF10Package;
@@ -35,13 +29,7 @@
  * @generated
  */
 public class AttributeDefinitionBooleanItemProvider
-	extends AttributeDefinitionSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeDefinitionSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionDateItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionDateItemProvider.java
index 289cede..23596f9 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionDateItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionDateItemProvider.java
@@ -14,16 +14,10 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeDefinitionDate;
 import org.eclipse.rmf.reqif10.ReqIF10Package;
@@ -35,13 +29,7 @@
  * @generated
  */
 public class AttributeDefinitionDateItemProvider
-	extends AttributeDefinitionSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeDefinitionSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionEnumerationItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionEnumerationItemProvider.java
index ffc865b..124963c 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionEnumerationItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionEnumerationItemProvider.java
@@ -14,17 +14,11 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeDefinitionEnumeration;
@@ -38,13 +32,7 @@
  * @generated
  */
 public class AttributeDefinitionEnumerationItemProvider
-	extends AttributeDefinitionItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeDefinitionItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionIntegerItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionIntegerItemProvider.java
index 158251d..ec244e9 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionIntegerItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionIntegerItemProvider.java
@@ -14,16 +14,10 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeDefinitionInteger;
 import org.eclipse.rmf.reqif10.ReqIF10Package;
@@ -35,13 +29,7 @@
  * @generated
  */
 public class AttributeDefinitionIntegerItemProvider
-	extends AttributeDefinitionSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeDefinitionSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionRealItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionRealItemProvider.java
index f531109..a5688ad 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionRealItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionRealItemProvider.java
@@ -14,16 +14,10 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeDefinitionReal;
 import org.eclipse.rmf.reqif10.ReqIF10Package;
@@ -35,13 +29,7 @@
  * @generated
  */
 public class AttributeDefinitionRealItemProvider
-	extends AttributeDefinitionSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeDefinitionSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionSimpleItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionSimpleItemProvider.java
index 69fbdb3..0957049 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionSimpleItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionSimpleItemProvider.java
@@ -15,7 +15,6 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.common.command.CompoundCommand;
 import org.eclipse.emf.common.notify.AdapterFactory;
@@ -26,12 +25,7 @@
 import org.eclipse.emf.edit.command.CommandParameter;
 import org.eclipse.emf.edit.command.SetCommand;
 import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptorDecorator;
 import org.eclipse.rmf.reqif10.AttributeDefinition;
 import org.eclipse.rmf.reqif10.AttributeDefinitionSimple;
@@ -56,13 +50,7 @@
  * @generated
  */
 public class AttributeDefinitionSimpleItemProvider
-	extends AttributeDefinitionItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeDefinitionItemProvider {
 
 	protected AttributeValueSimple defaultAttributeValueSimple = null;
 
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionStringItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionStringItemProvider.java
index 905c3c8..563d601 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionStringItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionStringItemProvider.java
@@ -14,16 +14,10 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeDefinitionString;
 import org.eclipse.rmf.reqif10.ReqIF10Package;
@@ -35,13 +29,7 @@
  * @generated
  */
 public class AttributeDefinitionStringItemProvider
-	extends AttributeDefinitionSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeDefinitionSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionXHTMLItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionXHTMLItemProvider.java
index 3322c81..40f589b 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionXHTMLItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeDefinitionXHTMLItemProvider.java
@@ -14,17 +14,11 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeDefinitionXHTML;
 import org.eclipse.rmf.reqif10.ReqIF10Factory;
@@ -37,13 +31,7 @@
  * @generated
  */
 public class AttributeDefinitionXHTMLItemProvider
-	extends AttributeDefinitionItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeDefinitionItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueBooleanItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueBooleanItemProvider.java
index 33a6ed1..1b38bff 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueBooleanItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueBooleanItemProvider.java
@@ -14,16 +14,10 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeValueBoolean;
@@ -36,13 +30,7 @@
  * @generated
  */
 public class AttributeValueBooleanItemProvider
-	extends AttributeValueSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeValueSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueDateItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueDateItemProvider.java
index e42cee9..f7e0fa7 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueDateItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueDateItemProvider.java
@@ -20,12 +20,7 @@
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeValueDate;
@@ -38,13 +33,7 @@
  * @generated
  */
 public class AttributeValueDateItemProvider
-	extends AttributeValueSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeValueSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueEnumerationItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueEnumerationItemProvider.java
index 8c43fdc..3b99fe8 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueEnumerationItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueEnumerationItemProvider.java
@@ -27,12 +27,7 @@
 import org.eclipse.emf.edit.command.SetCommand;
 import org.eclipse.emf.edit.domain.EditingDomain;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.rmf.reqif10.AttributeValueEnumeration;
 import org.eclipse.rmf.reqif10.Identifiable;
 import org.eclipse.rmf.reqif10.ReqIF10Package;
@@ -46,13 +41,7 @@
  * @generated
  */
 public class AttributeValueEnumerationItemProvider
-	extends AttributeValueItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeValueItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueIntegerItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueIntegerItemProvider.java
index 7c2fec7..f212ab0 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueIntegerItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueIntegerItemProvider.java
@@ -15,16 +15,10 @@
 import java.math.BigInteger;
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeValueInteger;
@@ -37,13 +31,7 @@
  * @generated
  */
 public class AttributeValueIntegerItemProvider
-	extends AttributeValueSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeValueSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueRealItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueRealItemProvider.java
index 234b259..6fea185 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueRealItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueRealItemProvider.java
@@ -14,16 +14,10 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeValueReal;
@@ -36,13 +30,7 @@
  * @generated
  */
 public class AttributeValueRealItemProvider
-	extends AttributeValueSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeValueSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueSimpleItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueSimpleItemProvider.java
index bf31d08..4bb0839 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueSimpleItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueSimpleItemProvider.java
@@ -14,15 +14,9 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 
 /**
  * This is the item provider adapter for a {@link org.eclipse.rmf.reqif10.AttributeValueSimple} object.
@@ -31,13 +25,7 @@
  * @generated
  */
 public class AttributeValueSimpleItemProvider
-	extends AttributeValueItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeValueItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueStringItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueStringItemProvider.java
index 4ad52e1..0569827 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueStringItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueStringItemProvider.java
@@ -14,16 +14,10 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeValueString;
@@ -36,13 +30,7 @@
  * @generated
  */
 public class AttributeValueStringItemProvider
-	extends AttributeValueSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeValueSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueXHTMLItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueXHTMLItemProvider.java
index af06a18..ef6e25e 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueXHTMLItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/AttributeValueXHTMLItemProvider.java
@@ -14,17 +14,11 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeValueXHTML;
@@ -38,13 +32,7 @@
  * @generated
  */
 public class AttributeValueXHTMLItemProvider
-	extends AttributeValueItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends AttributeValueItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionBooleanItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionBooleanItemProvider.java
index cebb9af..c31f83c 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionBooleanItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionBooleanItemProvider.java
@@ -14,16 +14,9 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.rmf.reqif10.DatatypeDefinitionBoolean;
 
 /**
  * This is the item provider adapter for a {@link org.eclipse.rmf.reqif10.DatatypeDefinitionBoolean} object.
@@ -32,13 +25,7 @@
  * @generated
  */
 public class DatatypeDefinitionBooleanItemProvider
-	extends DatatypeDefinitionSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends DatatypeDefinitionSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionDateItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionDateItemProvider.java
index fc9b788..901ae98 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionDateItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionDateItemProvider.java
@@ -14,16 +14,9 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.rmf.reqif10.DatatypeDefinitionDate;
 
 /**
  * This is the item provider adapter for a {@link org.eclipse.rmf.reqif10.DatatypeDefinitionDate} object.
@@ -32,13 +25,7 @@
  * @generated
  */
 public class DatatypeDefinitionDateItemProvider
-	extends DatatypeDefinitionSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends DatatypeDefinitionSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionEnumerationItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionEnumerationItemProvider.java
index f3e6dcc..9aaa115 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionEnumerationItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionEnumerationItemProvider.java
@@ -14,7 +14,6 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
@@ -22,12 +21,7 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.edit.command.DragAndDropFeedback;
 import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.DatatypeDefinitionEnumeration;
 import org.eclipse.rmf.reqif10.EmbeddedValue;
@@ -44,13 +38,7 @@
  * @generated
  */
 public class DatatypeDefinitionEnumerationItemProvider
-	extends DatatypeDefinitionItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends DatatypeDefinitionItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionIntegerItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionIntegerItemProvider.java
index 17fcef9..daf9a29 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionIntegerItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionIntegerItemProvider.java
@@ -14,16 +14,10 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.DatatypeDefinitionInteger;
@@ -36,13 +30,7 @@
  * @generated
  */
 public class DatatypeDefinitionIntegerItemProvider
-	extends DatatypeDefinitionSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends DatatypeDefinitionSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionItemProvider.java
index 497a7da..9354e62 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionItemProvider.java
@@ -14,15 +14,9 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.rmf.reqif10.DatatypeDefinition;
 import org.eclipse.rmf.reqif10.ReqIFContent;
 import org.eclipse.rmf.reqif10.pror.util.ProrUtil;
@@ -34,13 +28,7 @@
  * @generated
  */
 public class DatatypeDefinitionItemProvider
-	extends IdentifiableItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends IdentifiableItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionRealItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionRealItemProvider.java
index 5e74281..73923f3 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionRealItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionRealItemProvider.java
@@ -14,16 +14,10 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.DatatypeDefinitionReal;
@@ -36,13 +30,7 @@
  * @generated
  */
 public class DatatypeDefinitionRealItemProvider
-	extends DatatypeDefinitionSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends DatatypeDefinitionSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionSimpleItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionSimpleItemProvider.java
index 6897698..5f1497e 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionSimpleItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionSimpleItemProvider.java
@@ -14,16 +14,9 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.rmf.reqif10.DatatypeDefinitionSimple;
 
 /**
  * This is the item provider adapter for a {@link org.eclipse.rmf.reqif10.DatatypeDefinitionSimple} object.
@@ -32,13 +25,7 @@
  * @generated
  */
 public class DatatypeDefinitionSimpleItemProvider
-	extends DatatypeDefinitionItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends DatatypeDefinitionItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionStringItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionStringItemProvider.java
index 9fa4228..30d9af5 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionStringItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionStringItemProvider.java
@@ -14,16 +14,10 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.DatatypeDefinitionString;
@@ -36,13 +30,7 @@
  * @generated
  */
 public class DatatypeDefinitionStringItemProvider
-	extends DatatypeDefinitionSimpleItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends DatatypeDefinitionSimpleItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionXHTMLItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionXHTMLItemProvider.java
index aacea54..69b987a 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionXHTMLItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/DatatypeDefinitionXHTMLItemProvider.java
@@ -14,16 +14,9 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.rmf.reqif10.DatatypeDefinitionXHTML;
 
 /**
  * This is the item provider adapter for a {@link org.eclipse.rmf.reqif10.DatatypeDefinitionXHTML} object.
@@ -32,13 +25,7 @@
  * @generated
  */
 public class DatatypeDefinitionXHTMLItemProvider
-	extends DatatypeDefinitionItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends DatatypeDefinitionItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/EnumValueItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/EnumValueItemProvider.java
index d347342..a512e7a 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/EnumValueItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/EnumValueItemProvider.java
@@ -14,16 +14,10 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.EnumValue;
 import org.eclipse.rmf.reqif10.ReqIF10Factory;
@@ -36,13 +30,7 @@
  * @generated
  */
 public class EnumValueItemProvider
-	extends IdentifiableItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends IdentifiableItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/RelationGroupTypeItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/RelationGroupTypeItemProvider.java
index cfb2d7b..85272f7 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/RelationGroupTypeItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/RelationGroupTypeItemProvider.java
@@ -14,16 +14,9 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.rmf.reqif10.RelationGroupType;
 
 /**
  * This is the item provider adapter for a {@link org.eclipse.rmf.reqif10.RelationGroupType} object.
@@ -32,13 +25,7 @@
  * @generated
  */
 public class RelationGroupTypeItemProvider
-	extends SpecTypeItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends SpecTypeItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/ReqIFItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/ReqIFItemProvider.java
index 21fef0e..fa419b7 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/ReqIFItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/ReqIFItemProvider.java
@@ -14,7 +14,6 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.command.AbstractCommand;
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.common.command.CompoundCommand;
@@ -38,7 +37,6 @@
 import org.eclipse.rmf.reqif10.ReqIF10Factory;
 import org.eclipse.rmf.reqif10.ReqIF10Package;
 import org.eclipse.rmf.reqif10.common.util.ReqIFToolExtensionUtil;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationFactory;
 import org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension;
 
 /**
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecHierarchyItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecHierarchyItemProvider.java
index 7d10b28..f7a1e45 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecHierarchyItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecHierarchyItemProvider.java
@@ -15,12 +15,10 @@
 import static org.eclipse.rmf.reqif10.ReqIF10Package.Literals.SPEC_HIERARCHY__CHILDREN;
 import static org.eclipse.rmf.reqif10.ReqIF10Package.Literals.SPEC_HIERARCHY__OBJECT;
 import static org.eclipse.rmf.reqif10.ReqIF10Package.Literals.SPEC_OBJECT__TYPE;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.GregorianCalendar;
 import java.util.List;
-
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.common.command.CompoundCommand;
 import org.eclipse.emf.common.command.UnexecutableCommand;
@@ -33,12 +31,7 @@
 import org.eclipse.emf.edit.command.SetCommand;
 import org.eclipse.emf.edit.domain.EditingDomain;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptorDecorator;
 import org.eclipse.emf.edit.provider.ItemProviderAdapter;
@@ -61,9 +54,7 @@
  * @generated
  */
 public class SpecHierarchyItemProvider extends
-		AccessControlledElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
+		AccessControlledElementItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier. <!--
 	 * begin-user-doc --> <!-- end-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecObjectItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecObjectItemProvider.java
index 3b62a08..94b432e 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecObjectItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecObjectItemProvider.java
@@ -14,7 +14,6 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
@@ -27,12 +26,7 @@
 import org.eclipse.emf.edit.command.DragAndDropFeedback;
 import org.eclipse.emf.edit.domain.EditingDomain;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptorDecorator;
 import org.eclipse.emf.edit.provider.ViewerNotification;
@@ -52,13 +46,7 @@
  * @generated
  */
 public class SpecObjectItemProvider
-	extends SpecElementWithAttributesItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends SpecElementWithAttributesItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecObjectTypeItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecObjectTypeItemProvider.java
index d9f27ca..90916f5 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecObjectTypeItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecObjectTypeItemProvider.java
@@ -14,16 +14,9 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.rmf.reqif10.SpecObjectType;
 
 /**
  * This is the item provider adapter for a {@link org.eclipse.rmf.reqif10.SpecObjectType} object.
@@ -32,13 +25,7 @@
  * @generated
  */
 public class SpecObjectTypeItemProvider
-	extends SpecTypeItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends SpecTypeItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecRelationItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecRelationItemProvider.java
index 4877e7e..8f96b57 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecRelationItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecRelationItemProvider.java
@@ -14,17 +14,11 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.ReqIF10Package;
 import org.eclipse.rmf.reqif10.ReqIFContent;
@@ -38,13 +32,7 @@
  * @generated
  */
 public class SpecRelationItemProvider
-	extends SpecElementWithAttributesItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends SpecElementWithAttributesItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecRelationTypeItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecRelationTypeItemProvider.java
index 50be04e..d8482e0 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecRelationTypeItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecRelationTypeItemProvider.java
@@ -14,16 +14,9 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.rmf.reqif10.SpecRelationType;
 
 /**
  * This is the item provider adapter for a {@link org.eclipse.rmf.reqif10.SpecRelationType} object.
@@ -32,13 +25,7 @@
  * @generated
  */
 public class SpecRelationTypeItemProvider
-	extends SpecTypeItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends SpecTypeItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecTypeItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecTypeItemProvider.java
index 718e9ec..b61cefe 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecTypeItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecTypeItemProvider.java
@@ -15,7 +15,6 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.common.command.CompoundCommand;
 import org.eclipse.emf.common.notify.AdapterFactory;
@@ -25,12 +24,7 @@
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.AttributeDefinition;
 import org.eclipse.rmf.reqif10.ReqIF;
@@ -52,9 +46,7 @@
  * end-user-doc -->
  * @generated
  */
-public class SpecTypeItemProvider extends IdentifiableItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
+public class SpecTypeItemProvider extends IdentifiableItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier. <!--
 	 * begin-user-doc --> <!-- end-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecificationItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecificationItemProvider.java
index 474b019..31fa7bf 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecificationItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecificationItemProvider.java
@@ -16,10 +16,8 @@
 import static org.eclipse.rmf.reqif10.ReqIF10Package.Literals.SPECIFICATION__TYPE;
 import static org.eclipse.rmf.reqif10.ReqIF10Package.Literals.SPEC_HIERARCHY__OBJECT;
 import static org.eclipse.rmf.reqif10.ReqIF10Package.Literals.SPEC_OBJECT__TYPE;
-
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.common.command.CompoundCommand;
 import org.eclipse.emf.common.notify.AdapterFactory;
@@ -30,12 +28,7 @@
 import org.eclipse.emf.edit.command.SetCommand;
 import org.eclipse.emf.edit.domain.EditingDomain;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 import org.eclipse.rmf.reqif10.Identifiable;
 import org.eclipse.rmf.reqif10.ReqIF10Factory;
@@ -56,13 +49,7 @@
  * @generated
  */
 public class SpecificationItemProvider
-	extends SpecElementWithAttributesItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends SpecElementWithAttributesItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecificationTypeItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecificationTypeItemProvider.java
index 4d5c41a..440f811 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecificationTypeItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/SpecificationTypeItemProvider.java
@@ -14,7 +14,6 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
@@ -22,13 +21,7 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.edit.command.DragAndDropFeedback;
 import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.rmf.reqif10.SpecificationType;
 import org.eclipse.rmf.reqif10.Identifiable;
 import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
 
@@ -39,13 +32,7 @@
  * @generated
  */
 public class SpecificationTypeItemProvider
-	extends SpecTypeItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
+	extends SpecTypeItemProvider {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/XhtmlContentItemProvider.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/XhtmlContentItemProvider.java
index 36f32f0..7dc1cda 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/XhtmlContentItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/provider/XhtmlContentItemProvider.java
@@ -11,7 +11,6 @@
 
 import java.util.Collection;
 import java.util.List;
-
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.util.ResourceLocator;
@@ -34,7 +33,6 @@
 import org.eclipse.rmf.reqif10.ReqIF10Package;
 import org.eclipse.rmf.reqif10.XhtmlContent;
 import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationFactory;
-import org.eclipse.rmf.reqif10.xhtml.XhtmlFactory;
 
 /*******************************************************************************
  * Copyright (c) 2011 Formal Mind GmbH and University of Dusseldorf.
diff --git a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/util/ConfigurationUtil.java b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/util/ConfigurationUtil.java
index 8b14321..1f813a0 100644
--- a/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/util/ConfigurationUtil.java
+++ b/org.eclipse.rmf.reqif10.pror.edit/src/org/eclipse/rmf/reqif10/pror/util/ConfigurationUtil.java
@@ -10,6 +10,7 @@
  ******************************************************************************/
 package org.eclipse.rmf.reqif10.pror.util;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -34,9 +35,11 @@
 import org.eclipse.rmf.reqif10.ReqIF;
 import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
 import org.eclipse.rmf.reqif10.SpecHierarchy;
+import org.eclipse.rmf.reqif10.SpecObjectType;
 import org.eclipse.rmf.reqif10.SpecType;
 import org.eclipse.rmf.reqif10.Specification;
 import org.eclipse.rmf.reqif10.XhtmlContent;
+import org.eclipse.rmf.reqif10.common.util.ProrXhtmlSimplifiedHelper;
 import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
 import org.eclipse.rmf.reqif10.common.util.ReqIFToolExtensionUtil;
 import org.eclipse.rmf.reqif10.pror.configuration.Column;
@@ -296,14 +299,16 @@
 		specViewConfig.setSpecification(specification);
 
 		// Collect all Types
-		final Set<SpecType> types = new HashSet<SpecType>();
+		
+		final List<SpecType> types = new ArrayList<SpecType>();
 		ReqIF10Switch<SpecHierarchy> visitor = new ReqIF10Switch<SpecHierarchy>() {
 			@Override
 			public SpecHierarchy caseSpecHierarchy(SpecHierarchy specHierarchy) {
-				if (specHierarchy.getObject() != null
-						&& specHierarchy.getObject().getType() != null) {
-					// Duplicates will disappear due to HashSet
-					types.add(specHierarchy.getObject().getType());
+				if (specHierarchy.getObject() != null) {
+					SpecObjectType type = specHierarchy.getObject().getType();
+					if (type != null && !types.contains(type)) {
+						types.add(type);
+					}
 				}
 				return specHierarchy;
 			}
@@ -312,25 +317,40 @@
 		for (Iterator<EObject> i = EcoreUtil
 				.getAllContents(specification, true); i.hasNext();) {
 			visitor.doSwitch(i.next());
-			// we only explore the first 100 elements for performance.
-			if (counter++ == 100)
+			// we only explore the first 50 elements for performance.
+			if (counter++ == 50)
 				break;
 		}
 
-		// Collect all names from the types
-		final Set<String> colnames = new HashSet<String>();
+		
+		// Collect all names from the types.  We use a list to maintain order.
+		final List<String> colNames = new ArrayList<String>();
 		for (SpecType type : types) {
 			for (AttributeDefinition ad : type.getSpecAttributes()) {
-				// Duplicates will disappear due to HashSet
-				colnames.add(ad.getLongName());
+				
+				String colName = ad.getLongName();
+				if (colName != null && !colNames.contains(colName)) {
+					colNames.add(ad.getLongName());
+				}
 			}
 		}
+		
 
 		// Build all Columns from the names
-		for (String colname : colnames) {
+		boolean unifiedColumn = false;
+		for (String colName : colNames) {
 			Column column = ConfigurationFactory.eINSTANCE.createColumn();
+
+			// See whether we need a unified column or not.
+			if (colName.equals("ReqIF.Text") || colName.equals("ReqIF.ChapterName")) {
+				if (unifiedColumn) continue;
+				column = ConfigurationFactory.eINSTANCE.createUnifiedColumn();
+				colName = "Main";
+				unifiedColumn = true;
+			}
+			
 			column.setWidth(100);
-			column.setLabel(colname);
+			column.setLabel(colName);
 			specViewConfig.getColumns().add(column);
 		}
 		domain.getCommandStack()
diff --git a/org.eclipse.rmf.reqif10.pror.editor/META-INF/MANIFEST.MF b/org.eclipse.rmf.reqif10.pror.editor/META-INF/MANIFEST.MF
index e991209..14d0e6a 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/META-INF/MANIFEST.MF
+++ b/org.eclipse.rmf.reqif10.pror.editor/META-INF/MANIFEST.MF
@@ -7,22 +7,22 @@
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.rmf.reqif10.pror.editor.agilegrid,org.ecli
- pse.rmf.reqif10.pror.editor.presentation,org.eclipse.rmf.reqif10.pror
- .editor.presentation.service,org.eclipse.rmf.reqif10.pror.editor.prop
- ertiesview,org.eclipse.rmf.reqif10.pror.editor.util
+Export-Package: org.eclipse.rmf.reqif10.pror.editor,
+ org.eclipse.rmf.reqif10.pror.editor.agilegrid,
+ org.eclipse.rmf.reqif10.pror.editor.presentation,
+ org.eclipse.rmf.reqif10.pror.editor.presentation.service,
+ org.eclipse.rmf.reqif10.pror.editor.propertiesview,
+ org.eclipse.rmf.reqif10.pror.editor.util
 Require-Bundle: org.eclipse.core.runtime;visibility:=reexport,
  org.eclipse.ui.ide;visibility:=reexport,
  org.eclipse.ui.forms,
- org.eclipse.rmf.reqif10.pror.edit;bundle-version="0.9.0";visibility:=reexport,
+ org.eclipse.rmf.reqif10.pror.edit;bundle-version="0.12.0";visibility:=reexport,
  org.eclipse.core.resources;visibility:=reexport,
  org.eclipse.emf.edit.ui;visibility:=reexport,
  org.agilemore.agilegrid;bundle-version="1.3.3";visibility:=reexport,
- org.eclipse.rmf.serialization;bundle-version="0.9.0",
- org.eclipse.ui.navigator,
  com.google.guava,
  org.eclipse.core.filesystem;bundle-version="1.3.100",
- org.eclipse.rmf.reqif10.xhtml;bundle-version="0.9.0",
- org.eclipse.rmf.reqif10.serialization;bundle-version="0.9.0",
- org.eclipse.rmf.reqif10.xhtml.edit;bundle-version="0.9.0"
+ org.eclipse.rmf.reqif10.serialization;bundle-version="0.12.0",
+ org.eclipse.rmf.reqif10.xhtml.edit;bundle-version="0.12.0",
+ org.eclipse.sphinx.emf.serialization;bundle-version="0.8.1"
 Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/IReqifEditor.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/IReqifEditor.java
new file mode 100644
index 0000000..cfd6a66
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/IReqifEditor.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Formal Mind 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:
+ *     Michael Jastram - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.pror.editor;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.edit.domain.IEditingDomainProvider;
+import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.rmf.reqif10.ReqIF;
+import org.eclipse.rmf.reqif10.Specification;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * This interface must be implemented by all editors for ReqIF files.
+ * 
+ * @author jastram
+ */
+public interface IReqifEditor extends IEditorPart, IEditingDomainProvider, ISelectionProvider {
+
+	public ReqIF getReqif();
+	
+	public AdapterFactory getAdapterFactory();
+	
+	public EditingDomainActionBarContributor getActionBarContributor();
+
+	public ISpecificationEditor openSpecEditor(Specification spec);
+}
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/ISpecificationEditor.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/ISpecificationEditor.java
new file mode 100644
index 0000000..ce387c9
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/ISpecificationEditor.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Formal Mind 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:
+ *     Michael Jastram - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.pror.editor;
+
+import org.eclipse.rmf.reqif10.Specification;
+import org.eclipse.rmf.reqif10.pror.filter.ReqifFilter;
+
+/**
+ * This interface must be implemented by all editors for ReqIF Specifications.
+ * 
+ * @author jastram
+ */
+public interface ISpecificationEditor extends IReqifEditor {
+
+	/**
+	 * Forward requests to show or hide SpecRelations.
+	 */
+	public void setShowSpecRelations(boolean checked);
+	
+	public void setFilter(ReqifFilter filter);
+
+	public Specification getSpecification();
+}
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/AddTestObjectsActionDelegate.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/AddTestObjectsActionDelegate.java
index 6ae603f..7564eed 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/AddTestObjectsActionDelegate.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/AddTestObjectsActionDelegate.java
@@ -26,7 +26,7 @@
 import org.eclipse.rmf.reqif10.SpecObject;
 import org.eclipse.rmf.reqif10.SpecType;
 import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.SpecificationEditor;
+import org.eclipse.rmf.reqif10.pror.editor.ISpecificationEditor;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IEditorActionDelegate;
 import org.eclipse.ui.IEditorPart;
@@ -62,9 +62,9 @@
 		SpecType type = specHierarchy.getObject().getType();
 		if (type == null)
 			return;
-		if (!(editor instanceof SpecificationEditor))
+		if (!(editor instanceof ISpecificationEditor))
 			return;
-		SpecificationEditor specificationEditor = (SpecificationEditor) editor;
+		ISpecificationEditor specificationEditor = (ISpecificationEditor) editor;
 
 		Shell shell = window != null ? window.getShell() : editor.getSite()
 				.getShell();
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ColumnConfigurationActionDelegate.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ColumnConfigurationActionDelegate.java
index bd443d6..896cbd4 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ColumnConfigurationActionDelegate.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ColumnConfigurationActionDelegate.java
@@ -12,6 +12,8 @@
 
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.edit.command.AddCommand;
 import org.eclipse.emf.edit.command.SetCommand;
@@ -28,8 +30,9 @@
 import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
 import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
 import org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension;
+import org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn;
+import org.eclipse.rmf.reqif10.pror.editor.ISpecificationEditor;
 import org.eclipse.rmf.reqif10.pror.editor.presentation.ReqifSpecificationEditorInput;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.SpecificationEditor;
 import org.eclipse.rmf.reqif10.pror.util.ConfigurationUtil;
 import org.eclipse.ui.IEditorActionDelegate;
 import org.eclipse.ui.IEditorPart;
@@ -37,14 +40,14 @@
 
 public class ColumnConfigurationActionDelegate implements IEditorActionDelegate {
 
-	private SpecificationEditor editor;
+	private ISpecificationEditor editor;
 
 	/**
 	 * Retrieves the {@link EditingDomain} from the Editor if present.
 	 */
 	public void setActiveEditor(IAction action, IEditorPart editor) {
-		if (editor instanceof SpecificationEditor) {
-			this.editor = (SpecificationEditor) editor;
+		if (editor instanceof ISpecificationEditor) {
+			this.editor = (ISpecificationEditor) editor;
 		} else {
 			this.editor = null;
 		}
@@ -85,18 +88,59 @@
 	}
 
 	private void launchColumnDialog(final ProrSpecViewConfiguration config) {
-		SubtreeDialog dialog = new SubtreeDialog(editor.getReqifEditor(),
+		SubtreeDialog dialog = new SubtreeDialog(editor,
 				config, "Configure columns for "
 						+ ConfigurationUtil.getSpecElementLabel(
 								config.getSpecification(),
 								editor.getAdapterFactory()),
 				"org.eclipse.rmf.reqif10.pror.editor.columnConfiguration");
-		dialog.setActions(new IAction[] { buildAddColumnAction(config) }, false);
+		dialog.setActions(new IAction[] { buildAddColumnAction(config), buildUnifiedColumnAction(config) }, false);
 		dialog.open();
 		return;
 	}
 
 	/**
+	 * The Unified Column shows Reqif.Text and Reqif.Title in the same column
+	 */
+	private IAction buildUnifiedColumnAction(final ProrSpecViewConfiguration config) {
+		final IAction toggleUnifiedColumnAction = new Action("Unified Column") {
+			
+			@Override
+			public void run() {
+				if (! containsUnifiedColumn(config)) {
+					UnifiedColumn column = ConfigurationFactory.eINSTANCE.createUnifiedColumn();
+					column.setLabel("Main");
+					Command cmd = AddCommand
+							.create(editor.getEditingDomain(),
+									config,
+									ConfigurationPackage.Literals.PROR_SPEC_VIEW_CONFIGURATION__COLUMNS,
+									column);
+					editor.getEditingDomain().getCommandStack().execute(cmd);
+				}
+			}
+		};
+		config.eAdapters().add(new AdapterImpl() {
+			@Override
+			public void notifyChanged(Notification msg) {
+				super.notifyChanged(msg);
+				toggleUnifiedColumnAction.setEnabled(! containsUnifiedColumn(config));
+			}
+		});
+		toggleUnifiedColumnAction.setEnabled(! containsUnifiedColumn(config));
+		return toggleUnifiedColumnAction;
+	}
+
+	/**
+	 * @return true if the given config already contains a {@link UnifiedColumn}.
+	 */
+	private boolean containsUnifiedColumn(ProrSpecViewConfiguration config) {
+		for (Column column : config.getColumns()) {
+			if (column instanceof UnifiedColumn) return true;
+		}
+		return false;
+	}
+	
+	/**
 	 * Creates a new Column. If no Columns are present, this is the only way to
 	 * add Columns.
 	 */
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/DatatypeConfigurationActionDelegate.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/DatatypeConfigurationActionDelegate.java
index dfa0342..b828ff9 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/DatatypeConfigurationActionDelegate.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/DatatypeConfigurationActionDelegate.java
@@ -17,8 +17,7 @@
 import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.rmf.reqif10.ReqIF;
 import org.eclipse.rmf.reqif10.ReqIFToolExtension;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.Reqif10Editor;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.SpecificationEditor;
+import org.eclipse.rmf.reqif10.pror.editor.IReqifEditor;
 import org.eclipse.rmf.reqif10.pror.provider.VirtualSpecObjectItemProvider;
 import org.eclipse.rmf.reqif10.pror.provider.VirtualSpecRelationGroupItemProvider;
 import org.eclipse.rmf.reqif10.pror.provider.VirtualSpecRelationsItemProvider;
@@ -29,16 +28,14 @@
 public class DatatypeConfigurationActionDelegate implements
 		IEditorActionDelegate {
 
-	private Reqif10Editor editor;
+	private IReqifEditor editor;
 
 	/**
 	 * Retrieves the {@link EditingDomain} from the Editor if present.
 	 */
 	public void setActiveEditor(IAction action, IEditorPart editor) {
-		if (editor instanceof Reqif10Editor) {
-			this.editor = (Reqif10Editor) editor;
-		} else if (editor instanceof SpecificationEditor) {
-			this.editor = ((SpecificationEditor) editor).getReqifEditor();
+		if (editor instanceof IReqifEditor) {
+			this.editor = (IReqifEditor) editor;
 		} else {
 			this.editor = null;
 		}
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/GeneralConfigurationActionDelegate.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/GeneralConfigurationActionDelegate.java
index ea6b7d8..9b4c71c 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/GeneralConfigurationActionDelegate.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/GeneralConfigurationActionDelegate.java
@@ -20,8 +20,7 @@
 import org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration;
 import org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration;
 import org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.Reqif10Editor;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.SpecificationEditor;
+import org.eclipse.rmf.reqif10.pror.editor.IReqifEditor;
 import org.eclipse.rmf.reqif10.pror.util.ConfigurationUtil;
 import org.eclipse.ui.IEditorActionDelegate;
 import org.eclipse.ui.IEditorPart;
@@ -29,16 +28,14 @@
 public class GeneralConfigurationActionDelegate implements
 		IEditorActionDelegate {
 
-	private Reqif10Editor editor;
+	private IReqifEditor editor;
 
 	/**
 	 * Retrieves the {@link EditingDomain} from the Editor if present.
 	 */
 	public void setActiveEditor(IAction action, IEditorPart editor) {
-		if (editor instanceof Reqif10Editor) {
-			this.editor = (Reqif10Editor) editor;
-		} else if (editor instanceof SpecificationEditor) {
-			this.editor = ((SpecificationEditor) editor).getReqifEditor();
+		if (editor instanceof IReqifEditor) {
+			this.editor = (IReqifEditor) editor;
 		} else {
 			this.editor = null;
 		}
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/PresentationConfigurationActionDelegate.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/PresentationConfigurationActionDelegate.java
index c06093b..7af8165 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/PresentationConfigurationActionDelegate.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/PresentationConfigurationActionDelegate.java
@@ -27,8 +27,7 @@
 import org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension;
 import org.eclipse.rmf.reqif10.pror.configuration.provider.ProrPresentationConfigurationsItemProvider;
 import org.eclipse.rmf.reqif10.pror.edit.presentation.service.PresentationInterface;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.Reqif10Editor;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.SpecificationEditor;
+import org.eclipse.rmf.reqif10.pror.editor.IReqifEditor;
 import org.eclipse.rmf.reqif10.pror.editor.presentation.service.PresentationServiceManager;
 import org.eclipse.rmf.reqif10.pror.util.ConfigurationUtil;
 import org.eclipse.rmf.reqif10.pror.util.ProrUtil;
@@ -38,16 +37,14 @@
 public class PresentationConfigurationActionDelegate implements
 		IEditorActionDelegate {
 
-	private Reqif10Editor editor;
+	private IReqifEditor editor;
 
 	/**
 	 * Retrieves the {@link EditingDomain} from the Editor if present.
 	 */
 	public void setActiveEditor(IAction action, IEditorPart editor) {
-		if (editor instanceof Reqif10Editor) {
-			this.editor = (Reqif10Editor) editor;
-		} else if (editor instanceof SpecificationEditor) {
-			this.editor = ((SpecificationEditor) editor).getReqifEditor();
+		if (editor instanceof IReqifEditor) {
+			this.editor = (IReqifEditor) editor;
 		} else {
 			this.editor = null;
 		}
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ShiftLevelDownActionDelegate.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ShiftLevelDownActionDelegate.java
index 7d98aea..43a8786 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ShiftLevelDownActionDelegate.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ShiftLevelDownActionDelegate.java
@@ -21,7 +21,7 @@
 import org.eclipse.rmf.reqif10.ReqIF10Package;
 import org.eclipse.rmf.reqif10.SpecHierarchy;
 import org.eclipse.rmf.reqif10.Specification;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.SpecificationEditor;
+import org.eclipse.rmf.reqif10.pror.editor.ISpecificationEditor;
 import org.eclipse.ui.IEditorActionDelegate;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IWorkbenchWindow;
@@ -58,9 +58,9 @@
 			return;
 		// SpecType type = specHierarchy.getObject().getType();
 
-		if (!(editor instanceof SpecificationEditor))
+		if (!(editor instanceof ISpecificationEditor))
 			return;
-		SpecificationEditor specificationEditor = (SpecificationEditor) editor;
+		ISpecificationEditor specificationEditor = (ISpecificationEditor) editor;
 
 		// Shell shell = window != null ? window.getShell() : editor.getSite()
 		// .getShell();
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ShiftLevelUpActionDelegate.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ShiftLevelUpActionDelegate.java
index 15e5db4..6092d7d 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ShiftLevelUpActionDelegate.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ShiftLevelUpActionDelegate.java
@@ -23,7 +23,7 @@
 import org.eclipse.rmf.reqif10.ReqIF10Package;
 import org.eclipse.rmf.reqif10.SpecHierarchy;
 import org.eclipse.rmf.reqif10.Specification;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.SpecificationEditor;
+import org.eclipse.rmf.reqif10.pror.editor.ISpecificationEditor;
 import org.eclipse.ui.IEditorActionDelegate;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IWorkbenchWindow;
@@ -61,9 +61,9 @@
 			return;
 		// SpecType type = specHierarchy.getObject().getType();
 	
-		if (!(editor instanceof SpecificationEditor))
+		if (!(editor instanceof ISpecificationEditor))
 			return;
-		SpecificationEditor specificationEditor = (SpecificationEditor) editor;
+		ISpecificationEditor specificationEditor = (ISpecificationEditor) editor;
 
 		// Shell shell = window != null ? window.getShell() : editor.getSite()
 		// .getShell();
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/SpecificationWebPrintAction.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/SpecificationWebPrintAction.java
index 25247f2..4785d61 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/SpecificationWebPrintAction.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/SpecificationWebPrintAction.java
@@ -11,7 +11,6 @@
 package org.eclipse.rmf.reqif10.pror.editor.actions;
 
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
 
 import org.eclipse.emf.common.notify.AdapterFactory;
@@ -20,7 +19,7 @@
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.rmf.reqif10.Specification;
 import org.eclipse.rmf.reqif10.pror.editor.presentation.ReqifSpecificationEditorInput;
-import org.eclipse.rmf.reqif10.pror.editor.util.ProrEditorUtil;
+import org.eclipse.rmf.reqif10.pror.editor.util.HTMLPrinter;
 import org.eclipse.swt.program.Program;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.IEditorInput;
@@ -54,21 +53,9 @@
 		Specification spec = ((ReqifSpecificationEditorInput)input).getSpec();
 		
 		try {
-			File folder = File.createTempFile("pror-", "");
-			folder.delete();
-			folder = new File(folder.getAbsolutePath() + "/");
-			folder.mkdir();
-
-			String createHtmlContent = ProrEditorUtil.createHtmlContent(spec,
-					editingDomain, adapterFactory);
-
-			File htmlFile = new File(folder, "pror.html");
-			FileWriter writer = new FileWriter(htmlFile);
-			writer.write(createHtmlContent);
-			writer.close();
-			htmlFile.deleteOnExit();
-			Program.launch(htmlFile.toURI().toString());
-			System.out.println("Launched: " + htmlFile.toURI());
+			HTMLPrinter htmlPrinter = new HTMLPrinter(spec, editingDomain, adapterFactory);
+			File htmlSpec = htmlPrinter.print();
+			Program.launch(htmlSpec.getAbsolutePath());
 			MessageDialog.openInformation(
 					Display.getCurrent().getActiveShell(), "Output produced",
 					"Switch to your web browser to see the output.");
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/SubtreeDialog.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/SubtreeDialog.java
index 287df31..5f873c4 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/SubtreeDialog.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/SubtreeDialog.java
@@ -45,8 +45,8 @@
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.rmf.reqif10.Specification;
+import org.eclipse.rmf.reqif10.pror.editor.IReqifEditor;
 import org.eclipse.rmf.reqif10.pror.editor.presentation.ProrAdapterFactoryContentProvider;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.Reqif10Editor;
 import org.eclipse.rmf.reqif10.pror.editor.propertiesview.ProrPropertySheetPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.dnd.DND;
@@ -92,9 +92,9 @@
 	private final List<ViewerFilter> filters = new ArrayList<ViewerFilter>();
 	private final AdapterFactory adapterFactory;
 	private final EditingDomain editingDomain;
-	private final Reqif10Editor reqifEditor;
+	private final IReqifEditor reqifEditor;
 
-	protected SubtreeDialog(Reqif10Editor reqifEditor, EObject input, String title,
+	protected SubtreeDialog(IReqifEditor reqifEditor, EObject input, String title,
 			String helpContext) {
 		super(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
 		this.reqifEditor = reqifEditor;
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ToggleSpecRelationsActionDelegate.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ToggleSpecRelationsActionDelegate.java
index f4e6339..5c85cb8 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ToggleSpecRelationsActionDelegate.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/actions/ToggleSpecRelationsActionDelegate.java
@@ -12,7 +12,7 @@
 
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.SpecificationEditor;
+import org.eclipse.rmf.reqif10.pror.editor.ISpecificationEditor;
 import org.eclipse.ui.IEditorActionDelegate;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IWorkbenchWindow;
@@ -34,8 +34,8 @@
 	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
 	 */
 	public void run(IAction action) {
-		if (editor != null && editor instanceof SpecificationEditor) {
-			((SpecificationEditor) editor).setShowSpecRelations(action
+		if (editor != null && editor instanceof ISpecificationEditor) {
+			((ISpecificationEditor) editor).setShowSpecRelations(action
 					.isChecked());
 		}
 	}
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/AbstractProrCellRenderer.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/AbstractProrCellRenderer.java
index 7f9bfcb..163d1ea 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/AbstractProrCellRenderer.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/AbstractProrCellRenderer.java
@@ -27,11 +27,12 @@
 import org.eclipse.rmf.reqif10.AttributeValueXHTML;
 import org.eclipse.rmf.reqif10.EnumValue;
 import org.eclipse.rmf.reqif10.XhtmlContent;
+import org.eclipse.rmf.reqif10.common.util.ProrXhtmlSimplifiedHelper;
 import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
 import org.eclipse.rmf.reqif10.pror.editor.presentation.Reqif10EditorPlugin;
 import org.eclipse.rmf.reqif10.pror.util.ProrUtil;
-import org.eclipse.rmf.reqif10.pror.util.ProrXhtmlSimplifiedHelper;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.Point;
@@ -48,11 +49,14 @@
 /**
  * @author Lukas Ladenberger
  * @author Ingo Weigelt
+ * @author Michael Jastram
  */
 public class AbstractProrCellRenderer extends TextCellRenderer {
 
 	protected final AdapterFactory adapterFactory;
 
+	public static Color COLOR_RED = SWTResourceManager.getColor(SWT.COLOR_RED);
+
 	private final Image IMG_WARN_FALSE = PlatformUI.getWorkbench()
 			.getSharedImages().getImage(ISharedImages.IMG_OBJS_INFO_TSK);
 
@@ -89,7 +93,7 @@
 			if (v instanceof GregorianCalendar) {
 				GregorianCalendar cal = (GregorianCalendar) v;
 				Date date = cal.getTime();
-				stringValue = DateFormat.getDateInstance().format(date);
+				stringValue = DateFormat.getDateTimeInstance().format(date);
 			} else if (v instanceof List<?>) {
 				stringValue = convertListToString((List<?>) v);
 			} else if (v instanceof XhtmlContent && v != null) {
@@ -157,6 +161,8 @@
 	protected void initialColor(int row, int col) {
 		if (agileGrid.isCellSelected(row, col)) {
 			background = SWTResourceManager.getColor(223, 227, 237);
+		} else {
+			background = SWTResourceManager.getColor(SWT.COLOR_WHITE);
 		}
 	}
 
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrAgileGridContentProvider.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrAgileGridContentProvider.java
index 4d808b2..4d978ff 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrAgileGridContentProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrAgileGridContentProvider.java
@@ -29,8 +29,12 @@
 import org.eclipse.rmf.reqif10.SpecObject;
 import org.eclipse.rmf.reqif10.SpecRelation;
 import org.eclipse.rmf.reqif10.Specification;
+import org.eclipse.rmf.reqif10.XhtmlContent;
+import org.eclipse.rmf.reqif10.common.util.ProrXhtmlSimplifiedHelper;
 import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
+import org.eclipse.rmf.reqif10.pror.configuration.Column;
 import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
+import org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn;
 import org.eclipse.rmf.reqif10.pror.editor.agilegrid.ProrRow.ProrRowSpecHierarchy;
 import org.eclipse.rmf.reqif10.pror.editor.agilegrid.ProrRow.ProrRowSpecRelation;
 import org.eclipse.rmf.reqif10.pror.filter.ReqifFilter;
@@ -42,7 +46,7 @@
 public class ProrAgileGridContentProvider extends AbstractContentProvider {
 
 	private final Specification root;
-	private final ProrSpecViewConfiguration specViewConfig;
+	final ProrSpecViewConfiguration specViewConfig;
 	private ArrayList<ProrRow> cache = null;
 	private Map<Identifiable, ProrRow> rowMap = new HashMap<Identifiable, ProrRow>();
 
@@ -234,7 +238,31 @@
 		if (col >= specViewConfig.getColumns().size())
 			return null;
 
-		String label = specViewConfig.getColumns().get(col).getLabel();
+		// Handle the Unified Column
+		Column column = specViewConfig.getColumns().get(col);
+		if (column instanceof UnifiedColumn) {
+			AttributeValue av = ReqIF10Util.getAttributeValueForLabel(element,
+					"ReqIF.ChapterName");
+			if (av != null && ReqIF10Util.getTheValue(av) != null) {
+				Object value = ReqIF10Util.getTheValue(av);
+				if (value instanceof XhtmlContent) {
+					XhtmlContent xhtmlContent = (XhtmlContent) value;
+					String s = ProrXhtmlSimplifiedHelper
+							.xhtmlToSimplifiedString(xhtmlContent);
+					if (s != null && s.trim().length() > 0) {
+						return av;
+					}
+
+				} else {
+					if (value.toString().trim().length() > 0) {
+						return av;
+					}
+				}
+			}
+			return ReqIF10Util.getAttributeValueForLabel(element, "ReqIF.Text");
+		}
+
+		String label = column.getLabel();
 
 		return ReqIF10Util.getAttributeValueForLabel(element, label);
 	}
@@ -309,6 +337,5 @@
 
 	public int getRowCount() {
 		return getCache().size();
-	}
-
+	}	
 }
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrCellRenderer.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrCellRenderer.java
index f3c7b87..cfb8c54 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrCellRenderer.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrCellRenderer.java
@@ -25,6 +25,7 @@
 import org.eclipse.rmf.reqif10.pror.provider.Reqif10EditPlugin;
 import org.eclipse.rmf.reqif10.pror.util.ConfigurationUtil;
 import org.eclipse.rmf.reqif10.pror.util.ProrUtil;
+import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.Rectangle;
@@ -107,6 +108,23 @@
 		} else {
 			rowHeight = doDrawCellContentDefault(gc, rect, content);
 		}
+
+		// Prevent Scrolling becoming impossible by truncating large cells vertically.
+		int tableSize = agileGrid.getSize().y;
+		if (rowHeight > (tableSize * .5)) {
+			rowHeight = (int) (tableSize * .5);
+			Color oldForeground = gc.getForeground();
+			Color oldBackground = gc.getBackground();
+			
+			gc.setBackground(COLOR_BACKGROUND);
+			gc.setForeground(COLOR_LINE_LIGHTGRAY);
+			gc.fillRectangle(rect.x, rect.y + rowHeight + 4 - 20, rect.width, 20);
+			gc.setForeground(COLOR_RED);
+			gc.drawLine(rect.x, rect.y + rowHeight + 4 - 20, rect.x + rect.width, rect.y + rowHeight + 4 - 20);
+			gc.drawText("Truncated", rect.x + 5, rect.y + rowHeight - 15);
+			gc.setForeground(oldForeground);
+			gc.setBackground(oldBackground);
+		}
 		updateCellHeight(row, col, rowHeight);
 	}
 
@@ -121,7 +139,7 @@
 
 		ProrRow prorRow = contentProvider.getProrRow(row);
 
-		int offset = prorRow.getLevel() * 20;
+		int offset = prorRow.getLevel() * 8;
 		Image icon;
 		if (prorRow.getSpecElement() instanceof SpecObject) {
 			icon = specObjectIcon;
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrCellRendererProvider.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrCellRendererProvider.java
index 3437868..f11afc9 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrCellRendererProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrCellRendererProvider.java
@@ -18,6 +18,8 @@
 import org.agilemore.agilegrid.renderers.HeaderCellRenderer;
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
+import org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.GC;
@@ -65,7 +67,10 @@
 
 	public static Color COLOR_REQIF_ATTRIBUTE = SWTResourceManager
 			.getColor(SWT.COLOR_BLUE);
-	
+
+	public static Color COLOR_UNIFIED = SWTResourceManager
+			.getColor(SWT.COLOR_DARK_CYAN);
+
 	public ProrHeaderCellRenderer(AgileGrid agileGrid) {
 		super(agileGrid, ICellRenderer.STYLE_FLAT
 				| ICellRenderer.INDICATION_SELECTION_ROW);
@@ -79,10 +84,10 @@
 	 */
 	@Override
 	protected void doDrawCellContent(GC gc, Rectangle rect, int row, int col) {
-		if (row >= 0) {
-			ProrAgileGridContentProvider contentProvider = (ProrAgileGridContentProvider) agileGrid
-					.getContentProvider();
+		ProrAgileGridContentProvider contentProvider = (ProrAgileGridContentProvider) agileGrid
+				.getContentProvider();
 
+		if (row >= 0) {
 			ProrRow prorRow = contentProvider.getProrRow(row);
 			if (!prorRow.isVisible()) {
 				return;
@@ -100,8 +105,15 @@
 			label = "";
 		}
 
+		// Handling the unified Column, if present.
+		ProrSpecViewConfiguration specView = contentProvider.specViewConfig;
+		if (col >= 0 && col < specView.getColumns().size()
+				&& specView.getColumns().get(col) instanceof UnifiedColumn) {
+			gc.setForeground(COLOR_UNIFIED);
+		}
+
 		// Handling of ReqIF. Attributes
-		if (label.startsWith("ReqIF.")) {
+		else if (label.startsWith("ReqIF.")) {
 			label = label.substring(6);
 			gc.setForeground(COLOR_REQIF_ATTRIBUTE);
 		}
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrDateCellEditor.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrDateCellEditor.java
index ba1cab1..9152353 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrDateCellEditor.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrDateCellEditor.java
@@ -11,68 +11,118 @@
 package org.eclipse.rmf.reqif10.pror.editor.agilegrid;
 
 import java.text.DateFormat;
-import java.text.ParseException;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.GregorianCalendar;
 
-import javax.xml.datatype.DatatypeConfigurationException;
-
 import org.agilemore.agilegrid.AgileGrid;
-import org.agilemore.agilegrid.ICellEditorValidator;
+import org.agilemore.agilegrid.editors.PopupCellEditor;
 import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.rmf.reqif10.AttributeValue;
+import org.eclipse.rmf.reqif10.AttributeValueDate;
 import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
 import org.eclipse.rmf.reqif10.pror.util.ProrUtil;
+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.DateTime;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
 
-public class ProrDateCellEditor extends ProrCellEditor {
+public class ProrDateCellEditor extends PopupCellEditor {
+
+	private DateTime date;
+	private DateTime time;
+	private AttributeValueDate attributeValue;
+	private EditingDomain editingDomain;
+	private Object affectedObject;
+	private Object parent;
 
 	public ProrDateCellEditor(AgileGrid agileGrid, EditingDomain editingDomain,
 			Object parent,
 			Object affectedObject) {
-		super(agileGrid, editingDomain, parent, affectedObject);
-		this.setValidator(new ICellEditorValidator() {
-			public String isValid(Object value) {
-				if (value == null) {
-					return null;
-				}
-				try {
-					ReqIF10Util.stingToCalendar(value.toString());
-				} catch (ParseException e) {
-					return "Required Format: "
-							+ DateFormat.getDateInstance().format(new Date());
-				} catch (DatatypeConfigurationException e) {
-					return "Parsing Problem: " + e.toString();
-				}
-				return null;
-			}
-		});
+		super(agileGrid);
+		this.editingDomain = editingDomain;
+		this.affectedObject = affectedObject;
+		this.parent = parent;
 	}
 	
 	@Override
 	protected Object doGetValue() {
-		try {
-			GregorianCalendar value = ReqIF10Util.stingToCalendar(text.getText());
+			GregorianCalendar value = new GregorianCalendar(date.getYear(),
+					date.getMonth(), date.getDay(), time.getHours(),
+					time.getMinutes(), time.getSeconds());
 			ProrUtil.setTheValue(attributeValue, value, parent, affectedObject,
 					editingDomain);
-		} catch (ParseException e) {
-			e.printStackTrace();
-			// No action necessary, we simply restore the old value.
-		} catch (DatatypeConfigurationException e) {
-			e.printStackTrace();
-			// No action necessary, we simply restore the old value.
-		}
 		return attributeValue;
 	}
 
 	@Override
 	protected void doSetValue(Object value) {
-		if (value instanceof AttributeValue) {
-			attributeValue = (AttributeValue) value;
+		if (value instanceof AttributeValueDate) {
+			this.attributeValue = (AttributeValueDate) value;
+		}
+		super.doSetValue(value);
+	}
 
-			Object cal = ReqIF10Util.getTheValue(attributeValue);
-			if (cal instanceof GregorianCalendar) {
-				text.setText(DateFormat.getDateInstance().format(
-						((GregorianCalendar) cal).getTime()));
+	@Override
+	protected void updateLabel(Object value) {
+		if (value instanceof AttributeValueDate) {
+			AttributeValueDate av = (AttributeValueDate) value;
+			if (av.getTheValue() != null) {
+				Date date = av.getTheValue().getTime();
+				super.updateLabel(DateFormat.getDateTimeInstance().format(date));
+				return;
+			}
+		}
+		super.updateLabel(value);
+	}
+	
+	@Override
+	protected Control createContents(Composite parent) {
+		Composite composite = new Composite(parent, SWT.BORDER_SOLID);
+		GridLayout layout = new GridLayout();
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		layout.horizontalSpacing = 0;
+		layout.verticalSpacing = 5;
+		composite.setLayout(layout);
+		
+		date = new DateTime(composite, SWT.CALENDAR | SWT.MEDIUM);
+		
+		time = new DateTime(composite, SWT.TIME);
+		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+		time.setLayoutData(gd);
+
+		Object cal = ReqIF10Util.getTheValue(attributeValue);
+		if (cal instanceof GregorianCalendar) {
+			GregorianCalendar calendar = ((GregorianCalendar) cal);
+			date.setDate(calendar.get(Calendar.YEAR),
+					calendar.get(Calendar.DAY_OF_MONTH), Calendar.DAY_OF_MONTH);
+			time.setTime(calendar.get(Calendar.HOUR),
+					calendar.get(Calendar.MINUTE), Calendar.SECOND);
+		}
+
+		return composite;
+	}
+	
+	/**
+	 * This method is overridden to add a read-and-dispatch loop after opening
+	 * the popup. Otherwise, the panel will disappear immediately on Linux.
+	 */
+	@Override
+	protected void openPopupBox(Control parent) {
+		super.openPopupBox(parent);
+
+		// Workaround to prevent shell from closing right after opening on Linux.
+		Display display = Display.getCurrent();
+		Shell shell = display.getActiveShell();
+		shell.pack();
+
+		while (!shell.isDisposed()) {
+			if (!display.readAndDispatch()) {
+				display.sleep();
 			}
 		}
 	}
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrEnumerationMultiValueCellEditor.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrEnumerationMultiValueCellEditor.java
index 9f29b7d..69d1a7f 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrEnumerationMultiValueCellEditor.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrEnumerationMultiValueCellEditor.java
@@ -21,27 +21,14 @@
 import org.eclipse.emf.edit.domain.EditingDomain;
 import org.eclipse.rmf.reqif10.AttributeValueEnumeration;
 import org.eclipse.rmf.reqif10.DatatypeDefinitionEnumeration;
-import org.eclipse.rmf.reqif10.EnumValue;
 import org.eclipse.rmf.reqif10.ReqIF10Package;
+import org.eclipse.rmf.reqif10.pror.editor.presentation.EnumSelector;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.FillLayout;
-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.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
 
 public class ProrEnumerationMultiValueCellEditor extends PopupCellEditor {
-
-	private ArrayList<EnumValue> itemList = new ArrayList<EnumValue>();
 	private final DatatypeDefinitionEnumeration dde;
 
 	/**
@@ -51,6 +38,7 @@
 	private final EditingDomain editingDomain;
 	private Object parent;
 	private Object affectedObject;
+	private EnumSelector selector;
 
 	public ProrEnumerationMultiValueCellEditor(AgileGrid agileGrid,
 			DatatypeDefinitionEnumeration dde,
@@ -65,70 +53,12 @@
 
 	@Override
 	protected Control createContents(Composite parent) {
-		Composite composite = new Composite(parent, SWT.BORDER_SOLID);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		layout.horizontalSpacing = 0;
-		layout.verticalSpacing = 5;
-		composite.setLayout(layout);
-		Table table = new Table(composite, SWT.CHECK);
-		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gd.heightHint = 150;
-		table.setLayoutData(gd);
-		table.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				if (e.detail == SWT.CHECK && e.item instanceof TableItem) {
-					TableItem item = (TableItem) e.item;
-					if (item.getChecked()) {
-						itemList.add((EnumValue) item.getData());
-					} else {
-						itemList.remove((EnumValue) item.getData());
-					}
-				}
-			}
-		});
-
-		for (EnumValue enumValue : dde.getSpecifiedValues()) {
-			TableItem tableItem = new TableItem(table, SWT.NONE);
-			String enumId = enumValue.getLongName() == null ? enumValue.getIdentifier() : enumValue.getLongName();
-			tableItem.setText(enumId);
-			tableItem.setData(enumValue);
-			if (attributeValue.getValues().contains(enumValue)) {
-				tableItem.setChecked(true);
-				itemList.add(enumValue);
-			}
-		}
-
-		Composite buttonPanel = new Composite(composite, SWT.NONE);
-		buttonPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-		buttonPanel.setLayout(new FillLayout(SWT.HORIZONTAL));
-		Button cancel = new Button(buttonPanel, SWT.PUSH);
-		cancel.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_TOOL_DELETE));
-		cancel.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				fireCancelEditor();
-			}
-		});
-		
-		Button ok = new Button(buttonPanel, SWT.PUSH);
-		ok.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_ETOOL_SAVE_EDIT));
-		ok.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				fireApplyEditorValue();
-			}
-		});
-		return composite;
+		selector = new EnumSelector(dde.getSpecifiedValues(), attributeValue.getValues(), parent, SWT.BORDER_SOLID);
+		return selector;
 	}
 
 	@Override
 	protected Object doGetValue() {
-		if (itemList == null) {
-			return super.doGetValue();
-		}
 
 		CompoundCommand cmd = new CompoundCommand("Set Enumeration") {
 			public java.util.Collection<?> getAffectedObjects() {
@@ -150,7 +80,7 @@
 				.create(editingDomain,
 						attributeValue,
 						ReqIF10Package.Literals.ATTRIBUTE_VALUE_ENUMERATION__VALUES,
-						itemList));
+						selector.getItems()));
 
 		editingDomain.getCommandStack().execute(cmd);
 		return attributeValue;
@@ -166,7 +96,6 @@
 
 	@Override
 	protected void fireCancelEditor() {
-		itemList = null;
 		super.fireCancelEditor();
 	}
 	/**
@@ -176,17 +105,17 @@
 	@Override
 	protected void openPopupBox(Control parent) {
 		super.openPopupBox(parent);
-
-		// Workaround to prevent shell from closing right after opening on Linux.
-		Display display = Display.getCurrent();
-		Shell shell = display.getActiveShell();
-		shell.pack();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch()) {
-				display.sleep();
-			}
+		int result = selector.showEnumSelector(Display.getCurrent().getActiveShell());
+		if (result == SWT.CANCEL) {
+			fireCancelEditor();
+		} else {
+			fireApplyEditorValue();
 		}
 	}
-
+	
+	@Override
+	protected void updateLabel(Object value) {
+		super.updateLabel("Select below.");
+	}
+	
 }
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrXhtmlSimplifiedCellEditor.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrXhtmlSimplifiedCellEditor.java
index 323944f..c8b2faf 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrXhtmlSimplifiedCellEditor.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/agilegrid/ProrXhtmlSimplifiedCellEditor.java
@@ -26,9 +26,9 @@
 import org.eclipse.rmf.reqif10.ReqIF10Factory;
 import org.eclipse.rmf.reqif10.ReqIF10Package;
 import org.eclipse.rmf.reqif10.XhtmlContent;
+import org.eclipse.rmf.reqif10.common.util.ProrXhtmlSimplifiedHelper;
 import org.eclipse.rmf.reqif10.pror.editor.preferences.PreferenceConstants;
 import org.eclipse.rmf.reqif10.pror.editor.presentation.Reqif10EditorPlugin;
-import org.eclipse.rmf.reqif10.pror.util.ProrXhtmlSimplifiedHelper;
 import org.eclipse.rmf.reqif10.xhtml.XhtmlDivType;
 import org.eclipse.swt.widgets.Display;
 
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/EnumSelector.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/EnumSelector.java
new file mode 100644
index 0000000..a95c45d
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/EnumSelector.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Michael Jastram - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.pror.editor.presentation;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.rmf.reqif10.EnumValue;
+import org.eclipse.rmf.reqif10.pror.editor.agilegrid.ProrEnumerationMultiValueCellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.ShellAdapter;
+import org.eclipse.swt.events.ShellEvent;
+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.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * This -Control represents a GUI element that allows the selection of
+ * {@link EnumValue}s. It offers a save and cancel button, and is designed to be
+ * shown in a {@link Shell}.
+ * 
+ * It is written so that it can be used by AgileGrid (see
+ * {@link ProrEnumerationMultiValueCellEditor} or stand-alone (e.g. in a search
+ * interface).
+ * 
+ * IMPORTANT: AgileGrid provides a proper shell, to be used with
+ * {@link #showEnumSelector(Shell)}. Outside AgileGrid, a Shell must be
+ * constructed BEFORE instantiating the control. You can use the static method
+ * {@link #createShell(Shell)} for this purpose.
+ * 
+ * @author jastram
+ */
+public class EnumSelector extends Composite {
+
+	private ArrayList<EnumValue> itemList = new ArrayList<EnumValue>();
+	private int status = SWT.OK;
+	private Collection<EnumValue> originalSelection;
+
+	/**
+	 * Createes the Control.
+	 */
+	public EnumSelector(List<EnumValue> items, Collection<EnumValue> selection,
+			Composite parent, int style) {
+		super(parent, style);
+		originalSelection = selection;
+
+		GridLayout layout = new GridLayout();
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		layout.horizontalSpacing = 0;
+		layout.verticalSpacing = 5;
+		setLayout(layout);
+		Table table = new Table(this, SWT.CHECK);
+		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gd.heightHint = 150;
+		table.setLayoutData(gd);
+		table.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (e.detail == SWT.CHECK && e.item instanceof TableItem) {
+					TableItem item = (TableItem) e.item;
+					if (item.getChecked()) {
+						itemList.add((EnumValue) item.getData());
+					} else {
+						itemList.remove((EnumValue) item.getData());
+					}
+				}
+			}
+		});
+
+		for (EnumValue enumValue : items) {
+			TableItem tableItem = new TableItem(table, SWT.NONE);
+			String enumId = enumValue.getLongName() == null ? enumValue
+					.getIdentifier() : enumValue.getLongName();
+			tableItem.setText(enumId);
+			tableItem.setData(enumValue);
+			if (selection.contains(enumValue)) {
+				tableItem.setChecked(true);
+				itemList.add(enumValue);
+			}
+		}
+
+		Composite buttonPanel = new Composite(this, SWT.NONE);
+		buttonPanel
+				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+		buttonPanel.setLayout(new FillLayout(SWT.HORIZONTAL));
+		Button cancel = new Button(buttonPanel, SWT.PUSH);
+		cancel.setImage(PlatformUI.getWorkbench().getSharedImages()
+				.getImage(ISharedImages.IMG_TOOL_DELETE));
+		cancel.addSelectionListener(new SelectionAdapter() {
+
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				status = SWT.CANCEL;
+				Display.getCurrent().getActiveShell().close();
+			}
+		});
+
+		Button ok = new Button(buttonPanel, SWT.PUSH);
+		ok.setImage(PlatformUI.getWorkbench().getSharedImages()
+				.getImage(ISharedImages.IMG_ETOOL_SAVE_EDIT));
+		ok.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				status = SWT.OK;
+				Display.getCurrent().getActiveShell().close();
+			}
+		});
+	}
+
+	/**
+	 * Opens the control. Make sure to get the shell via
+	 * {@link #createShell(Control)}, unless you use this via AgileGrid.
+	 */
+	public int showEnumSelector(Shell shell) {
+		shell.pack();
+
+		while (!shell.isDisposed()) {
+			if (!Display.getCurrent().readAndDispatch()) {
+				Display.getCurrent().sleep();
+			}
+		}
+
+		return status;
+	}
+
+	/**
+	 * Returns the selected items. If the user cancelled, the original,
+	 * unmodified selection will be returned.
+	 */
+	public Collection<EnumValue> getItems() {
+		return status == SWT.OK ? itemList : originalSelection;
+	}
+
+	/**
+	 * Creates a shell that: is positioned below the parent; can be closed via
+	 * ESC; is closed if the user clicks outside, or if the shell loses focus.
+	 * 
+	 * Unless the user cancels explicitly (button), the new values will be
+	 * accepted.
+	 */
+	public static Shell createShell(Control parent) {
+		final Shell shell = new Shell(parent.getShell(), SWT.RESIZE
+				| SWT.ON_TOP);
+		shell.setBackground(parent.getBackground());
+		shell.setLayout(new FillLayout());
+		shell.addKeyListener(new KeyAdapter() {
+			@Override
+			public void keyReleased(KeyEvent e) {
+				if (e.character == SWT.ESC) { // Escape
+					shell.close();
+				}
+			}
+		});
+
+		shell.addShellListener(new ShellAdapter() {
+			@Override
+			public void shellDeactivated(ShellEvent e) {
+				shell.close();
+			}
+		});
+
+		Display display = parent.getDisplay();
+
+		Rectangle clientRect = display.map(parent, null, new Rectangle(0, 0, 0,
+				0));
+		shell.setBounds(clientRect.x, clientRect.y + parent.getBounds().height,
+				0, 0);
+		shell.open();
+		shell.layout();
+		return shell;
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/Reqif10ActionBarContributor.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/Reqif10ActionBarContributor.java
index c10ab41..50a6bc7 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/Reqif10ActionBarContributor.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/Reqif10ActionBarContributor.java
@@ -53,6 +53,7 @@
 import org.eclipse.rmf.reqif10.SpecRelationType;
 import org.eclipse.rmf.reqif10.SpecType;
 import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
+import org.eclipse.rmf.reqif10.pror.editor.ISpecificationEditor;
 import org.eclipse.rmf.reqif10.pror.editor.agilegrid.AgileCellEditorActionHandler;
 import org.eclipse.rmf.reqif10.pror.filter.ReqifFilter;
 import org.eclipse.rmf.reqif10.pror.filter.SimpleStringFilter;
@@ -273,13 +274,13 @@
 		quicksearch = new Text(parent, SWT.SEARCH | SWT.ICON_CANCEL
 				| SWT.ICON_SEARCH);
 		quicksearch.setSize(500, 0);
-		quicksearch.setEnabled(activeEditorPart instanceof SpecificationEditor);
+		quicksearch.setEnabled(activeEditorPart instanceof ISpecificationEditor);
 		quicksearch.addModifyListener(new ModifyListener() {
 
 			public void modifyText(ModifyEvent e) {
-				if (activeEditorPart instanceof SpecificationEditor) {
+				if (activeEditorPart instanceof ISpecificationEditor) {
 					quicksearch.setEnabled(true);
-					SpecificationEditor specEditor = (SpecificationEditor) activeEditor;
+					ISpecificationEditor specEditor = (ISpecificationEditor) activeEditor;
 					final String text = quicksearch.getText();
 					if (text == null || "".equals(text)) {
 						specEditor.setFilter(null);
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/Reqif10Editor.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/Reqif10Editor.java
index 7f33750..9a198b0 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/Reqif10Editor.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/Reqif10Editor.java
@@ -86,7 +86,6 @@
 import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ListViewer;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
@@ -106,6 +105,8 @@
 import org.eclipse.rmf.reqif10.Specification;
 import org.eclipse.rmf.reqif10.XhtmlContent;
 import org.eclipse.rmf.reqif10.pror.configuration.provider.ConfigurationItemProviderAdapterFactory;
+import org.eclipse.rmf.reqif10.pror.editor.IReqifEditor;
+import org.eclipse.rmf.reqif10.pror.editor.ISpecificationEditor;
 import org.eclipse.rmf.reqif10.pror.editor.presentation.service.PresentationServiceManager;
 import org.eclipse.rmf.reqif10.pror.editor.propertiesview.ProrPropertySheetPage;
 import org.eclipse.rmf.reqif10.pror.provider.ReqIF10ItemProviderAdapterFactory;
@@ -113,8 +114,8 @@
 import org.eclipse.rmf.reqif10.pror.provider.VirtualSpecTypeItemProvider;
 import org.eclipse.rmf.reqif10.pror.util.ConfigurationUtil;
 import org.eclipse.rmf.reqif10.xhtml.provider.XhtmlItemProviderAdapterFactory;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResource;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceSetImpl;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResource;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceSetImpl;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CTabFolder;
 import org.eclipse.swt.dnd.DND;
@@ -150,14 +151,14 @@
  * This is an example of a Reqif10 model editor. <!-- begin-user-doc --> We
  * modified the generated Editor as little as possible to keep the benefits of
  * working Code. Note that this Editor doesn't do that much. The
- * {@link SpecificationEditor} is much more important and powerful. It uses some
+ * {@link ISpecificationEditor} is much more important and powerful. It uses some
  * elements from this Editor, however (PropertyView, OutlineView...) <!--
  * end-user-doc -->
  * 
  * @generated
  */
 public class Reqif10Editor extends MultiPageEditorPart implements
-		IEditingDomainProvider, ISelectionProvider, IMenuListener,
+		IReqifEditor, IMenuListener,
 		IViewerProvider, IGotoMarker {
 
 	/**
@@ -1888,4 +1889,16 @@
 		}
 	}
 
+	public ISpecificationEditor openSpecEditor(Specification spec) {
+		ReqifSpecificationEditorInput editorInput = new ReqifSpecificationEditorInput(
+				this, spec);
+		try {
+			return (ISpecificationEditor) IDE.openEditor(getSite().getPage(),
+					editorInput, SpecificationEditor.EDITOR_ID, false);
+		} catch (PartInitException e) {
+			throw new RuntimeException(e);
+		}
+	}
+	
+
 }
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/Reqif10ModelWizard.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/Reqif10ModelWizard.java
index a207273..2d6b79b 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/Reqif10ModelWizard.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/Reqif10ModelWizard.java
@@ -25,8 +25,6 @@
 import java.util.StringTokenizer;
 import java.util.UUID;
 
-import javax.xml.datatype.XMLGregorianCalendar;
-
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFolder;
@@ -73,8 +71,7 @@
 import org.eclipse.rmf.reqif10.pror.provider.Reqif10EditPlugin;
 import org.eclipse.rmf.reqif10.pror.util.ConfigurationUtil;
 import org.eclipse.rmf.reqif10.serialization.ReqIF10ResourceFactoryImpl;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceFactoryImpl;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceSetImpl;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceSetImpl;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/ReqifMainForm.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/ReqifMainForm.java
index d88eff0..9b83ae6 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/ReqifMainForm.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/ReqifMainForm.java
@@ -32,6 +32,7 @@
 import org.eclipse.rmf.reqif10.ReqIFContent;
 import org.eclipse.rmf.reqif10.ReqIFHeader;
 import org.eclipse.rmf.reqif10.Specification;
+import org.eclipse.rmf.reqif10.pror.editor.IReqifEditor;
 import org.eclipse.rmf.reqif10.pror.provider.ReqIFContentItemProvider;
 import org.eclipse.rmf.reqif10.pror.provider.VirtualSpecificationsItemProvider;
 import org.eclipse.rmf.reqif10.pror.util.ProrUtil;
@@ -40,9 +41,6 @@
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.forms.events.ExpansionAdapter;
 import org.eclipse.ui.forms.events.ExpansionEvent;
 import org.eclipse.ui.forms.widgets.FormToolkit;
@@ -50,7 +48,6 @@
 import org.eclipse.ui.forms.widgets.Section;
 import org.eclipse.ui.forms.widgets.TableWrapData;
 import org.eclipse.ui.forms.widgets.TableWrapLayout;
-import org.eclipse.ui.ide.IDE;
 
 /**
  * 
@@ -67,13 +64,13 @@
 
 	private final ReqIF reqif;
 
-	private final Reqif10Editor reqifEditor;
+	private final IReqifEditor reqifEditor;
 
 	private ComposedAdapterFactory getAdapterFactory() {
 		return (ComposedAdapterFactory) reqifEditor.getAdapterFactory();
 	}
 
-	public ReqifMainForm(Composite parent, Reqif10Editor rifEditor) {
+	public ReqifMainForm(Composite parent, IReqifEditor rifEditor) {
 
 		this.reqifEditor = rifEditor;
 		this.reqif = rifEditor.getReqif();
@@ -178,7 +175,7 @@
 				Object element = ((IStructuredSelection) event.getSelection())
 						.getFirstElement();
 				if (element instanceof Specification) {
-					openSpec((Specification) element);
+					reqifEditor.openSpecEditor((Specification) element);
 				}
 			}
 		});
@@ -305,18 +302,6 @@
 		return form;
 	}
 
-	private void openSpec(Specification spec) {
-		try {
-			IWorkbenchPage page = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow().getActivePage();
-			ReqifSpecificationEditorInput editorInput = new ReqifSpecificationEditorInput(
-					reqifEditor, spec);
-			IDE.openEditor(page, editorInput, SpecificationEditor.EDITOR_ID);
-		} catch (PartInitException e) {
-			e.printStackTrace();
-		}
-	}
-
 	private String getString(String key) {
 		return Reqif10EditorPlugin.INSTANCE.getString(key);
 	}
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/ReqifSpecificationEditorInput.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/ReqifSpecificationEditorInput.java
index 8ed4c3a..3deb0d1 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/ReqifSpecificationEditorInput.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/ReqifSpecificationEditorInput.java
@@ -13,6 +13,7 @@
 import org.eclipse.emf.edit.provider.ItemProviderAdapter;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.rmf.reqif10.Specification;
+import org.eclipse.rmf.reqif10.pror.editor.IReqifEditor;
 import org.eclipse.rmf.reqif10.pror.util.ProrUtil;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IPersistableElement;
@@ -25,16 +26,16 @@
 
 
 	private final Specification spec;
-	private final Reqif10Editor rifEditor;
+	private final IReqifEditor reqifEditor;
 
-	public ReqifSpecificationEditorInput(Reqif10Editor rifEditor,
+	public ReqifSpecificationEditorInput(IReqifEditor rifEditor,
 			Specification spec) {
-		this.rifEditor = rifEditor;
+		this.reqifEditor = rifEditor;
 		this.spec = spec;
 	}
 
-	public Reqif10Editor getReqifEditor() {
-		return rifEditor;
+	public IReqifEditor getReqifEditor() {
+		return reqifEditor;
 	}
 
 	public Specification getSpec() {
@@ -67,7 +68,7 @@
 	 * @see org.eclipse.ui.IEditorInput#getName()
 	 */
 	public String getName() {
-		ItemProviderAdapter ip = ProrUtil.getItemProvider(rifEditor.getAdapterFactory(), spec);
+		ItemProviderAdapter ip = ProrUtil.getItemProvider(reqifEditor.getAdapterFactory(), spec);
 		return ip.getText(spec);
 	}
 
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/SpecificationEditor.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/SpecificationEditor.java
index a4ecbd3..3164089 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/SpecificationEditor.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/presentation/SpecificationEditor.java
@@ -24,8 +24,8 @@
 import org.eclipse.emf.common.notify.impl.AdapterImpl;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
 import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
 import org.eclipse.emf.edit.ui.provider.UnwrappingSelectionProvider;
 import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.action.IMenuManager;
@@ -36,10 +36,12 @@
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.rmf.reqif10.ReqIF;
 import org.eclipse.rmf.reqif10.ReqIF10Package;
 import org.eclipse.rmf.reqif10.SpecHierarchy;
 import org.eclipse.rmf.reqif10.SpecRelation;
 import org.eclipse.rmf.reqif10.Specification;
+import org.eclipse.rmf.reqif10.pror.editor.ISpecificationEditor;
 import org.eclipse.rmf.reqif10.pror.editor.actions.SpecificationWebPrintAction;
 import org.eclipse.rmf.reqif10.pror.editor.agilegrid.ProrAgileGrid;
 import org.eclipse.rmf.reqif10.pror.editor.agilegrid.ProrAgileGridViewer;
@@ -63,7 +65,7 @@
  * @author Michael Jastram
  */
 public class SpecificationEditor extends EditorPart implements
-		IEditingDomainProvider, IMenuListener {
+		ISpecificationEditor, IMenuListener {
 
 	public static final String EDITOR_ID = "org.eclipse.rmf.reqif10.pror.SpecificationEditor";
 
@@ -107,7 +109,7 @@
 		}
 
 		// Extracting Info from the input
-		reqifEditor = ((ReqifSpecificationEditorInput) input).getReqifEditor();
+		reqifEditor = (Reqif10Editor) ((ReqifSpecificationEditorInput) input).getReqifEditor();
 		specification = ((ReqifSpecificationEditorInput) input).getSpec();
 
 		reqifActionBarContributor = (Reqif10ActionBarContributor) site
@@ -160,6 +162,10 @@
 		}
 		buildContextMenu();
 	}
+	
+	public Specification getSpecification() {
+		return specification;
+	}
 
 	/**
 	 * Registers a command stack listener that updates the save state and
@@ -365,7 +371,7 @@
 	}
 
 	/**
-	 * @return true
+	 * Only allowed from main editor.
 	 */
 	@Override
 	public boolean isSaveAsAllowed() {
@@ -456,16 +462,41 @@
 		return false;
 	}
 
-	public Reqif10ActionBarContributor getReqifActionBarContributor() {
-		return reqifActionBarContributor;
+	public void setFilter(ReqifFilter filter) {
+		prorAgileGridViewer.setFilter(filter);
+	}
+
+	public ReqIF getReqif() {
+		return reqifEditor.getReqif();
 	}
 
 	public AdapterFactory getAdapterFactory() {
 		return reqifEditor.getAdapterFactory();
 	}
 
-	public void setFilter(ReqifFilter filter) {
-		prorAgileGridViewer.setFilter(filter);
+	public EditingDomainActionBarContributor getActionBarContributor() {
+		return reqifEditor.getActionBarContributor();
+	}
+
+	public void addSelectionChangedListener(ISelectionChangedListener listener) {
+		reqifEditor.addSelectionChangedListener(listener);
+	}
+
+	public ISelection getSelection() {
+		return reqifEditor.getSelection();
+	}
+
+	public void removeSelectionChangedListener(
+			ISelectionChangedListener listener) {
+		reqifEditor.removeSelectionChangedListener(listener);
+	}
+
+	public void setSelection(ISelection selection) {
+		reqifEditor.setSelection(selection);
+	}
+
+	public ISpecificationEditor openSpecEditor(Specification spec) {
+		return reqifEditor.openSpecEditor(spec);
 	}
 
 }
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/propertiesview/ProrPropertyCellRenderer.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/propertiesview/ProrPropertyCellRenderer.java
index 3ad62bf..b55da14 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/propertiesview/ProrPropertyCellRenderer.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/propertiesview/ProrPropertyCellRenderer.java
@@ -25,6 +25,7 @@
 import org.eclipse.rmf.reqif10.pror.editor.propertiesview.ProrPropertyContentProvider.PropertyRow;
 import org.eclipse.rmf.reqif10.pror.util.ConfigurationUtil;
 import org.eclipse.rmf.reqif10.pror.util.ProrUtil;
+import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.graphics.Rectangle;
 
@@ -88,6 +89,23 @@
 			}
 		}
 
+		// Prevent Scrolling becoming impossible by truncating large cells vertically.
+		int tableSize = agileGrid.getSize().y;
+		if (newRowHeight > (tableSize * .5)) {
+			newRowHeight = (int) (tableSize * .5);
+			Color oldForeground = gc.getForeground();
+			Color oldBackground = gc.getBackground();
+			
+			gc.setBackground(COLOR_BACKGROUND);
+			gc.setForeground(COLOR_LINE_LIGHTGRAY);
+			gc.fillRectangle(rect.x, rect.y + newRowHeight + 4 - 20, rect.width, 20);
+			gc.setForeground(COLOR_RED);
+			gc.drawLine(rect.x, rect.y + newRowHeight + 4 - 20, rect.x + rect.width, rect.y + newRowHeight + 4 - 20);
+			gc.drawText("Truncated", rect.x + 5, rect.y + newRowHeight - 15);
+			gc.setForeground(oldForeground);
+			gc.setBackground(oldBackground);
+		}
+
 		// Set the correct row height
 		if (newRowHeight < 18) // The row height should be at least 18
 			newRowHeight = initRowHeight;
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/propertiesview/ProrPropertyContentProvider.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/propertiesview/ProrPropertyContentProvider.java
index 72d451b..dce0207 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/propertiesview/ProrPropertyContentProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/propertiesview/ProrPropertyContentProvider.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2014 Formal Mind GmbH, University of Duesseldorf and others.
+ * Copyright (c) 2014, 2015 Formal Mind GmbH, University of Duesseldorf 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
@@ -21,7 +21,6 @@
 import org.agilemore.agilegrid.AbstractContentProvider;
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor.PropertyValueWrapper;
 import org.eclipse.emf.edit.provider.ItemProviderAdapter;
@@ -101,11 +100,6 @@
 		return getRows().get(row);
 	}
 
-	public IItemLabelProvider getItemLabelProvider(int row) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
 	public void setContent(Object content) {
 		this.content = content;
 		rows = null;
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/propertiesview/ProrPropertySheetPage.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/propertiesview/ProrPropertySheetPage.java
index 60f39eb..96d8fd8 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/propertiesview/ProrPropertySheetPage.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/propertiesview/ProrPropertySheetPage.java
@@ -35,8 +35,8 @@
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.rmf.reqif10.AttributeValue;
 import org.eclipse.rmf.reqif10.Identifiable;
+import org.eclipse.rmf.reqif10.pror.editor.ISpecificationEditor;
 import org.eclipse.rmf.reqif10.pror.editor.presentation.Reqif10EditorPlugin;
-import org.eclipse.rmf.reqif10.pror.editor.presentation.SpecificationEditor;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
@@ -184,7 +184,7 @@
 
 	/**
 	 * This method is called if a selection was changed in the
-	 * {@link SpecificationEditor}.
+	 * {@link ISpecificationEditor}.
 	 */
 	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
 		EditingDomain newEditingDomain = null;
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/util/HTMLPrinter.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/util/HTMLPrinter.java
new file mode 100644
index 0000000..3ac7750
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/util/HTMLPrinter.java
@@ -0,0 +1,304 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Michael Jastram - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.pror.editor.util;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.nio.charset.Charset;
+import java.text.SimpleDateFormat;
+import java.util.GregorianCalendar;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.eclipse.emf.common.CommonPlugin;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.rmf.reqif10.AttributeValue;
+import org.eclipse.rmf.reqif10.DatatypeDefinition;
+import org.eclipse.rmf.reqif10.EnumValue;
+import org.eclipse.rmf.reqif10.SpecHierarchy;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.Specification;
+import org.eclipse.rmf.reqif10.XhtmlContent;
+import org.eclipse.rmf.reqif10.common.util.ProrXhtmlSimplifiedHelper;
+import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
+import org.eclipse.rmf.reqif10.common.util.ReqIF10XhtmlUtil;
+import org.eclipse.rmf.reqif10.pror.configuration.Column;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
+import org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn;
+import org.eclipse.rmf.reqif10.pror.editor.presentation.service.IProrCellRenderer;
+import org.eclipse.rmf.reqif10.pror.editor.presentation.service.PresentationEditorInterface;
+import org.eclipse.rmf.reqif10.pror.util.ConfigurationUtil;
+import org.eclipse.rmf.reqif10.pror.util.ProrUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import com.google.common.io.Files;
+
+/**
+ * Once instantiated, it can produce a folder with HTML for the given
+ * Specification.
+ * 
+ * @author jastram
+ */
+public class HTMLPrinter {
+
+	private Specification spec;
+	private AdapterFactory adapterFactory;
+	private File sourceFolder;
+	private ProrSpecViewConfiguration config;
+	private File targetFolder;
+
+	/**
+	 * Constructs an HTMLPriter..
+	 */
+	public HTMLPrinter(Specification spec, EditingDomain domain,
+			AdapterFactory adapterFactory) {
+		this.spec = spec;
+		this.adapterFactory = adapterFactory;
+
+		this.sourceFolder = new File(CommonPlugin.resolve(spec.eResource().getURI())
+				.trimSegments(1).toFileString());
+		this.config = ConfigurationUtil.createSpecViewConfiguration(spec,
+				domain);
+	}
+
+	/**
+	 * Produces a File representing the spec that this object was constructed with, 
+	 * located in a temporary folder that also contains related images, if any.
+	 */
+	public File print() throws IOException {
+
+		targetFolder = createTempFolder();
+
+		// Build the HTML
+		StringBuilder html = new StringBuilder();
+		createHtmlHeader(html);
+		html.append("<table>");
+		createRowHeader(html);
+
+		printRecursive(html, 0, spec.getChildren());
+		html.append("</table>");
+
+		// Write the HTML
+		File htmlFile = new File(targetFolder, spec.getIdentifier() + ".html");
+		OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(htmlFile),Charset.forName("UTF-8").newEncoder());
+		writer.write(html.toString());
+		writer.close();
+		htmlFile.deleteOnExit();
+
+		return htmlFile;
+	}
+
+	/**
+	 * Builds the header row.
+	 * @return
+	 */
+	private void createRowHeader(StringBuilder html) {
+		
+		html.append("<tr>");
+		EList<Column> cols = config.getColumns();
+		for (Column col : cols) {
+			html.append("<td><b>" + col.getLabel() + "</b></td>");
+		}
+		html.append("</tr>\n");
+	}
+
+	/**
+	 * Creates a temporary folder for the spec.  Note that currently there is no cleanup.
+	 */
+	private File createTempFolder() throws IOException {
+		File targetFolder = File.createTempFile("pror-", "");
+		targetFolder.delete();
+		targetFolder = new File(targetFolder.getAbsolutePath() + "/");
+		targetFolder.mkdir();
+		return targetFolder;
+	}
+
+	private void createHtmlHeader(StringBuilder html) {
+		String title = ConfigurationUtil.getSpecElementLabel(spec,
+				adapterFactory);
+		html.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
+		html.append("<html>\n");
+		html.append("<head>\n");
+		html.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n");
+		html.append("<meta name=\"GENERATOR\" content=\"ProR (www.pror.org)\">\n");
+		html.append("<title>" + title + "</title>\n");
+		html.append("<style type=\"text/css\">\n");
+		html.append("body {font-family: Arial, sans-serif;}\n");
+		html.append("h1 {text-align: center;}\n");
+		html.append("table, th, td { border-bottom: 1px solid #cccccc; }\n");
+		html.append("td { padding: 2pt; }\n");
+		html.append("table { border-collapse: collapse; }");
+		html.append("</style>\n");
+		html.append("</head>\n\n");
+		html.append("<body>\n");
+		html.append("<h1>" + title + "</h1>\n");
+	}
+
+	private void printRecursive(StringBuilder html, int indent,
+			EList<SpecHierarchy> children) {
+		for (SpecHierarchy child : children) {
+			if (child.getObject() != null) {
+				SpecObject specObject = child.getObject();
+				boolean first = true;
+				html.append("<tr>");
+				for (Column col : config.getColumns()) {
+					html.append("<td valign='top'>");
+
+					// Handle indenting
+					if (first) {
+						html.append("<div style='margin-left: " + (indent * 20)
+								+ "px;'>");
+					}
+
+					AttributeValue av;
+					if (col instanceof UnifiedColumn) {
+						av = ReqIF10Util.getAttributeValueForLabel(specObject,
+								"ReqIF.Text");
+						if (av == null || ReqIF10Util.getTheValue(av) == null) {
+							av = ReqIF10Util.getAttributeValueForLabel(
+									specObject, "ReqIF.ChapterName");
+						}
+					} else {
+						av = ReqIF10Util.getAttributeValueForLabel(specObject,
+								col.getLabel());
+					}
+					DatatypeDefinition dd = ReqIF10Util
+							.getDatatypeDefinition(av);
+					ProrPresentationConfiguration configuration = ConfigurationUtil
+							.getPresentationConfiguration(dd);
+
+					Object itemProvider = ProrUtil.getItemProvider(
+							adapterFactory, configuration);
+
+					if (itemProvider instanceof PresentationEditorInterface) {
+						PresentationEditorInterface presentationEditor = (PresentationEditorInterface) itemProvider;
+						IProrCellRenderer renderer = presentationEditor
+								.getCellRenderer(av);
+						if (renderer != null) {
+							String content = renderer.doDrawHtmlContent(av);
+							if (content != null) {
+								html.append(content);
+							} else {
+								html.append(getValueAsString(av));
+							}
+						}
+
+					} else {
+						html.append(getValueAsString(av));
+					}
+
+					if (first) {
+						first = false;
+						html.append("</div>");
+					}
+					html.append("</td>");
+				}
+				html.append("</tr>\n");
+			}
+			printRecursive(html, indent + 1, child.getChildren());
+		}
+	}
+
+	private String getValueAsString(AttributeValue av) {
+		Object value = av == null ? null : ReqIF10Util.getTheValue(av);
+		if (value == null) {
+			return "";
+		} else if (value instanceof List<?>) {
+			return listAsString(value);
+		} else if (value instanceof XhtmlContent) {
+			return xhtmlAsString((XhtmlContent)value);
+		} else if (value instanceof GregorianCalendar) {
+			GregorianCalendar cal = (GregorianCalendar) value;
+			SimpleDateFormat formatter = new SimpleDateFormat(
+					"yyyy-MMM-dd hh:mm:ss z");
+			return formatter.format(cal.getTime());
+		} else {
+			return value.toString();
+		}
+	}
+
+	private String xhtmlAsString(XhtmlContent xhtmlContent) {
+		String textValue = ProrXhtmlSimplifiedHelper
+				.xhtmlToSimplifiedString(xhtmlContent);
+		try {
+			String xhtmlString = ReqIF10XhtmlUtil
+					.getXhtmlString(xhtmlContent);
+			xhtmlString = xhtmlString.replace("<xhtml:", "<");
+			xhtmlString = xhtmlString.replace("</xhtml:", "</");
+			textValue = xhtmlString;
+			
+			// Find and extract embedded images.
+			Document dom = ReqIF10XhtmlUtil.getXhtmlDom(xhtmlContent);
+			NodeList tags = dom.getElementsByTagName("xhtml:object");
+			for (int i = 0; i < tags.getLength(); i++) {
+				Node xhtmlNode = tags.item(i);
+				Node dataNode = xhtmlNode.getAttributes().getNamedItem("data");
+				if (dataNode != null) {
+					String filename = dataNode.getTextContent();
+					copyEmbeddedObject(filename);
+				}
+			}
+			
+			
+		} catch (IOException e) {
+		}
+		return textValue;
+	}
+
+	/**
+	 * Copy the source file identified by the given filename. This method may
+	 * fail silently to prevent interuption of the HTML printing.
+	 */
+	private void copyEmbeddedObject(String filename) {
+		File fullSourceFolder = sourceFolder;
+		File fullTargetFolder = targetFolder;
+
+		StringTokenizer st = new StringTokenizer(filename, "/");
+		String token = null;
+		while (st.hasMoreTokens()) {
+			token = st.nextToken();
+			if (! st.hasMoreTokens()) break;
+			fullSourceFolder = new File (fullSourceFolder, token);
+			fullTargetFolder = new File(fullTargetFolder, token);
+			fullTargetFolder.mkdir();
+		}
+		
+		File source = new File(fullSourceFolder, token);
+		File target = new File(fullTargetFolder, token);
+		try {
+			Files.copy(source, target);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private String listAsString(Object value) {
+		String textValue = "";
+		for (Iterator<?> i = ((List<?>) ((List<?>) value)).iterator(); i
+				.hasNext();) {
+			EnumValue enumValue = (EnumValue) i.next();
+			textValue += enumValue.getLongName();
+			if (i.hasNext()) {
+				textValue += ", ";
+			}
+		}
+		return textValue;
+	}
+	
+}
diff --git a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/util/ProrEditorUtil.java b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/util/ProrEditorUtil.java
index 546eeaa..0e8ea48 100644
--- a/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/util/ProrEditorUtil.java
+++ b/org.eclipse.rmf.reqif10.pror.editor/src/org/eclipse/rmf/reqif10/pror/editor/util/ProrEditorUtil.java
@@ -11,7 +11,9 @@
 package org.eclipse.rmf.reqif10.pror.editor.util;
 
 import java.io.IOException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.GregorianCalendar;
 import java.util.Iterator;
 import java.util.List;
 
@@ -19,24 +21,33 @@
 import org.eclipse.emf.common.command.CommandWrapper;
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.edit.domain.EditingDomain;
 import org.eclipse.rmf.reqif10.AttributeValue;
 import org.eclipse.rmf.reqif10.DatatypeDefinition;
 import org.eclipse.rmf.reqif10.EnumValue;
+import org.eclipse.rmf.reqif10.ReqIF;
 import org.eclipse.rmf.reqif10.SpecHierarchy;
 import org.eclipse.rmf.reqif10.SpecObject;
 import org.eclipse.rmf.reqif10.Specification;
 import org.eclipse.rmf.reqif10.XhtmlContent;
+import org.eclipse.rmf.reqif10.common.util.ProrXhtmlSimplifiedHelper;
 import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
 import org.eclipse.rmf.reqif10.common.util.ReqIF10XhtmlUtil;
 import org.eclipse.rmf.reqif10.pror.configuration.Column;
 import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
 import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
+import org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn;
+import org.eclipse.rmf.reqif10.pror.editor.IReqifEditor;
+import org.eclipse.rmf.reqif10.pror.editor.ISpecificationEditor;
 import org.eclipse.rmf.reqif10.pror.editor.presentation.service.IProrCellRenderer;
 import org.eclipse.rmf.reqif10.pror.editor.presentation.service.PresentationEditorInterface;
 import org.eclipse.rmf.reqif10.pror.util.ConfigurationUtil;
 import org.eclipse.rmf.reqif10.pror.util.ProrUtil;
-import org.eclipse.rmf.reqif10.pror.util.ProrXhtmlSimplifiedHelper;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
 
 public class ProrEditorUtil {
 
@@ -45,7 +56,7 @@
 		StringBuilder sb = new StringBuilder();
 		String title = ConfigurationUtil.getSpecElementLabel(spec,
 				adapterFactory);
-
+		
 		sb.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
 		sb.append("<html>\n");
 		sb.append("<head>\n");
@@ -92,6 +103,10 @@
 				textValue = xhtmlString;
 			} catch (IOException e) {
 			}
+		} else if (value instanceof GregorianCalendar) {
+			GregorianCalendar cal = (GregorianCalendar)value;
+			SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MMM-dd hh:mm:ss z");  
+			textValue = formatter.format(cal.getTime());
 		} else {
 			textValue = value.toString();
 		}
@@ -115,8 +130,19 @@
 						html.append("<div style='margin-left: " + (indent * 20)
 								+ "px;'>");
 					}
-					AttributeValue av = ReqIF10Util.getAttributeValueForLabel(
-							specObject, col.getLabel());
+					
+					AttributeValue av;
+					if (col instanceof UnifiedColumn) {
+						av = ReqIF10Util.getAttributeValueForLabel(
+								specObject, "ReqIF.Text");
+						if (av == null || ReqIF10Util.getTheValue(av) == null) {
+							av = ReqIF10Util.getAttributeValueForLabel(
+									specObject, "ReqIF.ChapterName");							
+						}
+					} else {
+						av = ReqIF10Util.getAttributeValueForLabel(
+								specObject, col.getLabel());
+					}
 					DatatypeDefinition dd = ReqIF10Util
 							.getDatatypeDefinition(av);
 					ProrPresentationConfiguration configuration = ConfigurationUtil
@@ -190,4 +216,59 @@
 		};
 	}
 	
+	/**
+	 * Attempts to find the {@link IReqifEditor} or {@link ISpecificationEditor}
+	 * for the given EObject by walking up the parent hierarchy to the enclosing
+	 * {@link ReqIF} or {@link Specification}. If the {@link IReqifEditor} is
+	 * found for a Specification, the corresponding editor will be opened.
+	 * 
+	 * @return the Editor or null if none found.
+	 */
+	public static IEditorPart getEditor(EObject eObject) {
+		ReqIF reqif = null;
+		Specification spec = null;
+		while (eObject != null) {
+			if (eObject instanceof Specification) {
+				spec = (Specification) eObject;
+			}
+			if (eObject instanceof ReqIF) {
+				reqif = (ReqIF) eObject;
+				break;
+			}
+			eObject = eObject.eContainer();
+		}
+		if (reqif == null) return null;
+		
+		// Find the editor(s)
+		IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+				.getActivePage();
+
+		IEditorReference[] eRefs = activePage.getEditorReferences();
+		for (IEditorReference eRef : eRefs) {
+			IEditorPart editor = eRef.getEditor(false);
+			if (editor instanceof ISpecificationEditor) {
+				ISpecificationEditor specEditor = (ISpecificationEditor) editor;
+
+				// Case 1: We found the right SpecificationEditor
+				if (specEditor.getSpecification().equals(spec)) {
+					return specEditor;
+				}
+			}
+			if (editor instanceof IReqifEditor) {
+				IReqifEditor reqifEditor = (IReqifEditor) editor;
+				if (reqifEditor.getReqif().equals(reqif)) {
+					
+					// Case 2: We found the right Reqif10Editor
+					if (spec == null) return reqifEditor;
+					
+					// Case 3: We found the Reqif10Editor, but need the SpecificationEditor
+					return reqifEditor.openSpecEditor(spec);
+				}
+			}
+		}
+		// Case 4: Nothing found
+		return null;		
+	}
+
+	
 }
diff --git a/org.eclipse.rmf.reqif10.pror.genhtml/META-INF/MANIFEST.MF b/org.eclipse.rmf.reqif10.pror.genhtml/META-INF/MANIFEST.MF
index 977ea8a..e726b6a 100644
--- a/org.eclipse.rmf.reqif10.pror.genhtml/META-INF/MANIFEST.MF
+++ b/org.eclipse.rmf.reqif10.pror.genhtml/META-INF/MANIFEST.MF
@@ -7,12 +7,12 @@
 Bundle-Activator: org.eclipse.rmf.reqif10.pror.genhtml.Activator
 Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.rmf.reqif10;bundle-version="0.9.0",
- org.eclipse.rmf.serialization;bundle-version="0.9.0",
  org.eclipse.rmf.reqif10.pror.presentation.headline;bundle-version="0.9.0",
  org.eclipse.rmf.reqif10.pror.presentation.id;bundle-version="0.9.0",
  org.eclipse.rmf.reqif10.pror.presentation.linewrap;bundle-version="0.9.0",
  org.eclipse.rmf.reqif10.pror.editor;bundle-version="0.9.0",
- org.eclipse.rmf.reqif10.serialization;bundle-version="0.9.0"
+ org.eclipse.rmf.reqif10.serialization;bundle-version="0.9.0",
+ org.eclipse.sphinx.emf.serialization;bundle-version="0.8.1"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.rmf.reqif10.pror.genhtml/src/org/eclipse/rmf/reqif10/pror/genhtml/GenerateHtml.java b/org.eclipse.rmf.reqif10.pror.genhtml/src/org/eclipse/rmf/reqif10/pror/genhtml/GenerateHtml.java
index 27403de..ee07cdf 100644
--- a/org.eclipse.rmf.reqif10.pror.genhtml/src/org/eclipse/rmf/reqif10/pror/genhtml/GenerateHtml.java
+++ b/org.eclipse.rmf.reqif10.pror.genhtml/src/org/eclipse/rmf/reqif10/pror/genhtml/GenerateHtml.java
@@ -38,7 +38,7 @@
 import org.eclipse.rmf.reqif10.pror.provider.ReqIF10ItemProviderAdapterFactory;
 import org.eclipse.rmf.reqif10.serialization.ReqIF10ResourceFactoryImpl;
 import org.eclipse.rmf.reqif10.serialization.ReqIF10ResourceImpl;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceSetImpl;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceSetImpl;
 
 /**
  * Standalone-executable class that is used to non-interactively generate HTML
diff --git a/org.eclipse.rmf.reqif10.pror.presentation.id/src/org/eclipse/rmf/reqif10/pror/presentation/id/provider/IdConfigurationItemProvider.java b/org.eclipse.rmf.reqif10.pror.presentation.id/src/org/eclipse/rmf/reqif10/pror/presentation/id/provider/IdConfigurationItemProvider.java
index 7c817c2..cda07f5 100644
--- a/org.eclipse.rmf.reqif10.pror.presentation.id/src/org/eclipse/rmf/reqif10/pror/presentation/id/provider/IdConfigurationItemProvider.java
+++ b/org.eclipse.rmf.reqif10.pror.presentation.id/src/org/eclipse/rmf/reqif10/pror/presentation/id/provider/IdConfigurationItemProvider.java
@@ -60,12 +60,14 @@
  * This is the item provider adapter for a {@link org.eclipse.rmf.reqif10.pror.presentation.id.IdConfiguration} object.
  * <!-- begin-user-doc -->
  * <!-- end-user-doc -->
- * @generated
+ * @generated NOT
  */
 public class IdConfigurationItemProvider
 	extends ProrPresentationConfigurationItemProvider
 	implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
+		IEditingDomainItemProvider, IStructuredItemContentProvider,
+		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource,
+		PresentationEditorInterface {
 	/**
 	 * This constructs an instance from a factory and a notifier.
 	 * <!-- begin-user-doc -->
diff --git a/org.eclipse.rmf.reqif10.pror.tests/META-INF/MANIFEST.MF b/org.eclipse.rmf.reqif10.pror.tests/META-INF/MANIFEST.MF
index e36c9aa..d57dd96 100644
--- a/org.eclipse.rmf.reqif10.pror.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.rmf.reqif10.pror.tests/META-INF/MANIFEST.MF
@@ -9,14 +9,14 @@
  org.eclipse.ui,
  org.eclipse.core.resources,
  org.eclipse.core.runtime,
- org.eclipse.rmf.serialization;bundle-version="0.9.0",
  org.eclipse.rmf.reqif10.pror.editor;bundle-version="0.9.0",
  org.eclipse.rmf.reqif10.pror.presentation.headline;bundle-version="0.9.0",
  org.eclipse.rmf.reqif10.pror.presentation.id;bundle-version="0.9.0",
  org.eclipse.rmf.reqif10.pror.presentation.linewrap;bundle-version="0.9.0",
  org.eclipse.rmf.reqif10.xhtml;bundle-version="0.9.0",
  org.eclipse.rmf.reqif10.serialization;bundle-version="0.9.0",
- org.eclipse.rmf.ext.prostep
+ org.eclipse.rmf.ext.prostep,
+ org.eclipse.sphinx.emf.serialization;bundle-version="0.8.1"
 Bundle-Vendor: %providerName
 Export-Package: org.eclipse.rmf.reqif10.pror.configuration.provider,or
  g.eclipse.rmf.reqif10.pror.testdata,org.eclipse.rmf.reqif10.pror.test
diff --git a/org.eclipse.rmf.reqif10.pror.tests/src/org/eclipse/rmf/reqif10/pror/testframework/AbstractItemProviderTest.java b/org.eclipse.rmf.reqif10.pror.tests/src/org/eclipse/rmf/reqif10/pror/testframework/AbstractItemProviderTest.java
index 996ce86..9b2c93e 100644
--- a/org.eclipse.rmf.reqif10.pror.tests/src/org/eclipse/rmf/reqif10/pror/testframework/AbstractItemProviderTest.java
+++ b/org.eclipse.rmf.reqif10.pror.tests/src/org/eclipse/rmf/reqif10/pror/testframework/AbstractItemProviderTest.java
@@ -46,7 +46,7 @@
 import org.eclipse.rmf.reqif10.pror.testdata.TestData;
 import org.eclipse.rmf.reqif10.serialization.ReqIF10ResourceFactoryImpl;
 import org.eclipse.rmf.reqif10.serialization.ReqIF10ResourceImpl;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceSetImpl;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceSetImpl;
 import org.junit.After;
 import org.junit.Before;
 
diff --git a/org.eclipse.rmf.reqif10.pror/model/HOW_TO_GENERATE.txt b/org.eclipse.rmf.reqif10.pror/model/HOW_TO_GENERATE.txt
index 3169777..77c0830 100644
--- a/org.eclipse.rmf.reqif10.pror/model/HOW_TO_GENERATE.txt
+++ b/org.eclipse.rmf.reqif10.pror/model/HOW_TO_GENERATE.txt
@@ -12,6 +12,7 @@
 
   a. Select "Configuration"
   b. Right-Click "Generate Model Code"
+  c. Remove Package Exports that produce errors.
 
 2. Configuration ItemProviders
 
diff --git a/org.eclipse.rmf.reqif10.pror/model/configuration.ecore b/org.eclipse.rmf.reqif10.pror/model/configuration.ecore
index bb13bcf..b2724f6 100644
--- a/org.eclipse.rmf.reqif10.pror/model/configuration.ecore
+++ b/org.eclipse.rmf.reqif10.pror/model/configuration.ecore
@@ -52,7 +52,8 @@
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ProrSpecViewConfiguration">
     <eStructuralFeatures xsi:type="ecore:EReference" name="specification" lowerBound="1"
-        eType="ecore:EClass ../../org.eclipse.rmf.reqif10/model/reqif10.ecore#//Specification" unsettable="true"/>
+        eType="ecore:EClass ../../org.eclipse.rmf.reqif10/model/reqif10.ecore#//Specification"
+        unsettable="true"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="columns" upperBound="-1"
         eType="#//Column" unsettable="true" containment="true">
       <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
@@ -110,7 +111,8 @@
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ProrPresentationConfiguration" abstract="true">
     <eStructuralFeatures xsi:type="ecore:EReference" name="datatype" lowerBound="1"
-        eType="ecore:EClass ../../org.eclipse.rmf.reqif10/model/reqif10.ecore#//DatatypeDefinition" unsettable="true"/>
+        eType="ecore:EClass ../../org.eclipse.rmf.reqif10/model/reqif10.ecore#//DatatypeDefinition"
+        unsettable="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ProrGeneralConfiguration">
     <eStructuralFeatures xsi:type="ecore:EReference" name="labelConfiguration" lowerBound="1"
@@ -133,4 +135,5 @@
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultLabel" upperBound="-1"
         eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" unsettable="true"/>
   </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="UnifiedColumn" eSuperTypes="#//Column"/>
 </ecore:EPackage>
diff --git a/org.eclipse.rmf.reqif10.pror/model/reqif10.genmodel b/org.eclipse.rmf.reqif10.pror/model/reqif10.genmodel
index 2f838e5..e2ea888 100644
--- a/org.eclipse.rmf.reqif10.pror/model/reqif10.genmodel
+++ b/org.eclipse.rmf.reqif10.pror/model/reqif10.genmodel
@@ -3,10 +3,11 @@
     xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.rmf.reqif10.pror/src" creationIcons="false"
     modelPluginID="org.eclipse.rmf.reqif10.pror" modelName="Configuration" editPluginClass="org.eclipse.rmf.reqif10.pror.provider.Reqif10EditPlugin"
     importerID="org.eclipse.emf.importer.ecore" complianceLevel="6.0" copyrightFields="false"
-    usedGenPackages="platform:/plugin/org.eclipse.emf.ecore/model/XMLNamespace.genmodel#//namespace">
+    usedGenPackages="platform:/plugin/org.eclipse.emf.ecore/model/XMLNamespace.genmodel#//namespace"
+    importOrganizing="true">
   <foreignModel>configuration.ecore</foreignModel>
-  <genPackages prefix="Configuration" basePackage="org.eclipse.rmf.reqif10.pror" resource="XML"
-      disposableProviderFactory="true" ecorePackage="configuration.ecore#/">
+  <genPackages prefix="Configuration" basePackage="org.eclipse.rmf.reqif10.pror" disposableProviderFactory="true"
+      fileExtensions="" ecorePackage="configuration.ecore#/">
     <genClasses image="false" ecoreClass="configuration.ecore#//ProrToolExtension">
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference configuration.ecore#//ProrToolExtension/specViewConfigurations"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference configuration.ecore#//ProrToolExtension/generalConfiguration"/>
@@ -33,9 +34,11 @@
     <genClasses image="false" ecoreClass="configuration.ecore#//LabelConfiguration">
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute configuration.ecore#//LabelConfiguration/defaultLabel"/>
     </genClasses>
+    <genClasses image="false" ecoreClass="configuration.ecore#//UnifiedColumn"/>
   </genPackages>
-  <genPackages prefix="ReqIF10" basePackage="org.eclipse.rmf" resource="XML" disposableProviderFactory="true"
-      providerPackageSuffix="pror.provider" ecorePackage="../../org.eclipse.rmf.reqif10/model/reqif10.ecore#/">
+  <genPackages prefix="ReqIF10" basePackage="org.eclipse.rmf" disposableProviderFactory="true"
+      providerPackageSuffix="pror.provider" fileExtensions="" ecorePackage="../../org.eclipse.rmf.reqif10/model/reqif10.ecore#/">
+    <genDataTypes ecoreDataType="../../org.eclipse.rmf.reqif10/model/reqif10.ecore#//DateTime"/>
     <genDataTypes ecoreDataType="../../org.eclipse.rmf.reqif10/model/reqif10.ecore#//ID"/>
     <genClasses image="false" ecoreClass="../../org.eclipse.rmf.reqif10/model/reqif10.ecore#//AccessControlledElement">
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute ../../org.eclipse.rmf.reqif10/model/reqif10.ecore#//AccessControlledElement/editable"/>
@@ -217,6 +220,7 @@
     </genClasses>
     <genClasses image="false" ecoreClass="../../org.eclipse.rmf.reqif10/model/reqif10.ecore#//XhtmlContent">
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference ../../org.eclipse.rmf.reqif10/model/reqif10.ecore#//XhtmlContent/xhtml"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute ../../org.eclipse.rmf.reqif10/model/reqif10.ecore#//XhtmlContent/xhtmlSource"/>
     </genClasses>
   </genPackages>
 </genmodel:GenModel>
diff --git a/org.eclipse.rmf.reqif10.pror/plugin.xml b/org.eclipse.rmf.reqif10.pror/plugin.xml
index c771e21..3572a00 100644
--- a/org.eclipse.rmf.reqif10.pror/plugin.xml
+++ b/org.eclipse.rmf.reqif10.pror/plugin.xml
@@ -26,6 +26,8 @@
             class="org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage"
             genModel="model/reqif10.genmodel"/>
    </extension>
+
+
    <extension
          point="org.eclipse.ui.intro">
       <intro
@@ -77,7 +79,7 @@
          </property>
          <property
                name="aboutText"
-               value="ProR - Requirements Management Platform&#x0A;&#x0A;part of the &#x0A;&#x0A;Eclipse Requirements Management Framework (RMF)&#x0A;&#x0A;Version: (Incubation Submission)&#x0A;&#x0A;(c) Copyright Formal Mind GmbH, itemis AG and others 2011.  All rights reserved.&#x0A;Visit http://eclipse.org/rmf">
+               value="ProR - Requirements Management Platform&#x0A;&#x0A;part of the &#x0A;&#x0A;Eclipse Requirements Management Framework (RMF)&#x0A;&#x0A;Version: (Incubation Submission)&#x0A;&#x0A;(c) Copyright Formal Mind GmbH, itemis AG and others 2011-2014.  All rights reserved.&#x0A;Visit http://eclipse.org/rmf">
          </property>
       </product>
    </extension>
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/Column.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/Column.java
index 61be870..1d818f3 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/Column.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/Column.java
@@ -1,142 +1,133 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Column</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getLabel <em>Label</em>}</li>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getWidth <em>Width</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getColumn()
- * @model
- * @generated
- */
-public interface Column extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Label</b></em>' attribute.
-	 * The default value is <code>"<PLEASE SET LABEL>"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Label</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Label</em>' attribute.
-	 * @see #isSetLabel()
-	 * @see #unsetLabel()
-	 * @see #setLabel(String)
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getColumn_Label()
-	 * @model default="<PLEASE SET LABEL>" unsettable="true" required="true"
-	 * @generated
-	 */
-	String getLabel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getLabel <em>Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Label</em>' attribute.
-	 * @see #isSetLabel()
-	 * @see #unsetLabel()
-	 * @see #getLabel()
-	 * @generated
-	 */
-	void setLabel(String value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getLabel <em>Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetLabel()
-	 * @see #getLabel()
-	 * @see #setLabel(String)
-	 * @generated
-	 */
-	void unsetLabel();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getLabel <em>Label</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Label</em>' attribute is set.
-	 * @see #unsetLabel()
-	 * @see #getLabel()
-	 * @see #setLabel(String)
-	 * @generated
-	 */
-	boolean isSetLabel();
-
-	/**
-	 * Returns the value of the '<em><b>Width</b></em>' attribute.
-	 * The default value is <code>"100"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Width</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Width</em>' attribute.
-	 * @see #isSetWidth()
-	 * @see #unsetWidth()
-	 * @see #setWidth(int)
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getColumn_Width()
-	 * @model default="100" unsettable="true" required="true"
-	 * @generated
-	 */
-	int getWidth();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getWidth <em>Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Width</em>' attribute.
-	 * @see #isSetWidth()
-	 * @see #unsetWidth()
-	 * @see #getWidth()
-	 * @generated
-	 */
-	void setWidth(int value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getWidth <em>Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetWidth()
-	 * @see #getWidth()
-	 * @see #setWidth(int)
-	 * @generated
-	 */
-	void unsetWidth();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getWidth <em>Width</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Width</em>' attribute is set.
-	 * @see #unsetWidth()
-	 * @see #getWidth()
-	 * @see #setWidth(int)
-	 * @generated
-	 */
-	boolean isSetWidth();
-
-} // Column
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Column</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getLabel <em>Label</em>}</li>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getWidth <em>Width</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getColumn()
+ * @model
+ * @generated
+ */
+public interface Column extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Label</b></em>' attribute.
+	 * The default value is <code>"<PLEASE SET LABEL>"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Label</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Label</em>' attribute.
+	 * @see #isSetLabel()
+	 * @see #unsetLabel()
+	 * @see #setLabel(String)
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getColumn_Label()
+	 * @model default="<PLEASE SET LABEL>" unsettable="true" required="true"
+	 * @generated
+	 */
+	String getLabel();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getLabel <em>Label</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Label</em>' attribute.
+	 * @see #isSetLabel()
+	 * @see #unsetLabel()
+	 * @see #getLabel()
+	 * @generated
+	 */
+	void setLabel(String value);
+
+	/**
+	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getLabel <em>Label</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSetLabel()
+	 * @see #getLabel()
+	 * @see #setLabel(String)
+	 * @generated
+	 */
+	void unsetLabel();
+
+	/**
+	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getLabel <em>Label</em>}' attribute is set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em>Label</em>' attribute is set.
+	 * @see #unsetLabel()
+	 * @see #getLabel()
+	 * @see #setLabel(String)
+	 * @generated
+	 */
+	boolean isSetLabel();
+
+	/**
+	 * Returns the value of the '<em><b>Width</b></em>' attribute.
+	 * The default value is <code>"100"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Width</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Width</em>' attribute.
+	 * @see #isSetWidth()
+	 * @see #unsetWidth()
+	 * @see #setWidth(int)
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getColumn_Width()
+	 * @model default="100" unsettable="true" required="true"
+	 * @generated
+	 */
+	int getWidth();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getWidth <em>Width</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Width</em>' attribute.
+	 * @see #isSetWidth()
+	 * @see #unsetWidth()
+	 * @see #getWidth()
+	 * @generated
+	 */
+	void setWidth(int value);
+
+	/**
+	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getWidth <em>Width</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSetWidth()
+	 * @see #getWidth()
+	 * @see #setWidth(int)
+	 * @generated
+	 */
+	void unsetWidth();
+
+	/**
+	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getWidth <em>Width</em>}' attribute is set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em>Width</em>' attribute is set.
+	 * @see #unsetWidth()
+	 * @see #getWidth()
+	 * @see #setWidth(int)
+	 * @generated
+	 */
+	boolean isSetWidth();
+
+} // Column
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ConfigurationFactory.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ConfigurationFactory.java
index 412ed28..bd3e58c 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ConfigurationFactory.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ConfigurationFactory.java
@@ -1,96 +1,96 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2012 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage
- * @generated
- */
-public interface ConfigurationFactory extends EFactory {
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	ConfigurationFactory eINSTANCE = org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Pror Tool Extension</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Pror Tool Extension</em>'.
-	 * @generated
-	 */
-	ProrToolExtension createProrToolExtension();
-
-	/**
-	 * Returns a new object of class '<em>Pror Spec View Configuration</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Pror Spec View Configuration</em>'.
-	 * @generated
-	 */
-	ProrSpecViewConfiguration createProrSpecViewConfiguration();
-
-	/**
-	 * Returns a new object of class '<em>Column</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Column</em>'.
-	 * @generated
-	 */
-	Column createColumn();
-
-	/**
-	 * Returns a new object of class '<em>Pror Presentation Configurations</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Pror Presentation Configurations</em>'.
-	 * @generated
-	 */
-	ProrPresentationConfigurations createProrPresentationConfigurations();
-
-	/**
-	 * Returns a new object of class '<em>Pror General Configuration</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Pror General Configuration</em>'.
-	 * @generated
-	 */
-	ProrGeneralConfiguration createProrGeneralConfiguration();
-
-	/**
-	 * Returns a new object of class '<em>Label Configuration</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Label Configuration</em>'.
-	 * @generated
-	 */
-	LabelConfiguration createLabelConfiguration();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	ConfigurationPackage getConfigurationPackage();
-
-} //ConfigFactory
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage
+ * @generated
+ */
+public interface ConfigurationFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	ConfigurationFactory eINSTANCE = org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Pror Tool Extension</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Pror Tool Extension</em>'.
+	 * @generated
+	 */
+	ProrToolExtension createProrToolExtension();
+
+	/**
+	 * Returns a new object of class '<em>Pror Spec View Configuration</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Pror Spec View Configuration</em>'.
+	 * @generated
+	 */
+	ProrSpecViewConfiguration createProrSpecViewConfiguration();
+
+	/**
+	 * Returns a new object of class '<em>Column</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Column</em>'.
+	 * @generated
+	 */
+	Column createColumn();
+
+	/**
+	 * Returns a new object of class '<em>Pror Presentation Configurations</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Pror Presentation Configurations</em>'.
+	 * @generated
+	 */
+	ProrPresentationConfigurations createProrPresentationConfigurations();
+
+	/**
+	 * Returns a new object of class '<em>Pror General Configuration</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Pror General Configuration</em>'.
+	 * @generated
+	 */
+	ProrGeneralConfiguration createProrGeneralConfiguration();
+
+	/**
+	 * Returns a new object of class '<em>Label Configuration</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Label Configuration</em>'.
+	 * @generated
+	 */
+	LabelConfiguration createLabelConfiguration();
+
+	/**
+	 * Returns a new object of class '<em>Unified Column</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Unified Column</em>'.
+	 * @generated
+	 */
+	UnifiedColumn createUnifiedColumn();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	ConfigurationPackage getConfigurationPackage();
+
+} //ConfigurationFactory
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ConfigurationPackage.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ConfigurationPackage.java
index 190fc73..61b1118 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ConfigurationPackage.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ConfigurationPackage.java
@@ -1,701 +1,749 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationFactory
- * @model kind="package"
- * @generated
- */
-public interface ConfigurationPackage extends EPackage {
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "configuration";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://eclipse.org/rmf/pror/toolextensions/1.0";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "configuration";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	ConfigurationPackage eINSTANCE = org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl <em>Pror Tool Extension</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrToolExtension()
-	 * @generated
-	 */
-	int PROR_TOOL_EXTENSION = 0;
-
-	/**
-	 * The feature id for the '<em><b>Spec View Configurations</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS = 0;
-
-	/**
-	 * The feature id for the '<em><b>General Configuration</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION = 1;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Configurations</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS = 2;
-
-	/**
-	 * The number of structural features of the '<em>Pror Tool Extension</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_TOOL_EXTENSION_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl <em>Pror Spec View Configuration</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrSpecViewConfiguration()
-	 * @generated
-	 */
-	int PROR_SPEC_VIEW_CONFIGURATION = 1;
-
-	/**
-	 * The feature id for the '<em><b>Specification</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION = 0;
-
-	/**
-	 * The feature id for the '<em><b>Columns</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_SPEC_VIEW_CONFIGURATION__COLUMNS = 1;
-
-	/**
-	 * The feature id for the '<em><b>Left Header Column</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN = 2;
-
-	/**
-	 * The number of structural features of the '<em>Pror Spec View Configuration</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_SPEC_VIEW_CONFIGURATION_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ColumnImpl <em>Column</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ColumnImpl
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getColumn()
-	 * @generated
-	 */
-	int COLUMN = 2;
-
-	/**
-	 * The feature id for the '<em><b>Label</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COLUMN__LABEL = 0;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COLUMN__WIDTH = 1;
-
-	/**
-	 * The number of structural features of the '<em>Column</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COLUMN_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationsImpl <em>Pror Presentation Configurations</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationsImpl
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrPresentationConfigurations()
-	 * @generated
-	 */
-	int PROR_PRESENTATION_CONFIGURATIONS = 3;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Configurations</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS = 0;
-
-	/**
-	 * The number of structural features of the '<em>Pror Presentation Configurations</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_PRESENTATION_CONFIGURATIONS_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationImpl <em>Pror Presentation Configuration</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationImpl
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrPresentationConfiguration()
-	 * @generated
-	 */
-	int PROR_PRESENTATION_CONFIGURATION = 4;
-
-	/**
-	 * The feature id for the '<em><b>Datatype</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_PRESENTATION_CONFIGURATION__DATATYPE = 0;
-
-	/**
-	 * The number of structural features of the '<em>Pror Presentation Configuration</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_PRESENTATION_CONFIGURATION_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrGeneralConfigurationImpl <em>Pror General Configuration</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrGeneralConfigurationImpl
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrGeneralConfiguration()
-	 * @generated
-	 */
-	int PROR_GENERAL_CONFIGURATION = 5;
-
-	/**
-	 * The feature id for the '<em><b>Label Configuration</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION = 0;
-
-	/**
-	 * The number of structural features of the '<em>Pror General Configuration</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROR_GENERAL_CONFIGURATION_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.LabelConfigurationImpl <em>Label Configuration</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.LabelConfigurationImpl
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getLabelConfiguration()
-	 * @generated
-	 */
-	int LABEL_CONFIGURATION = 6;
-
-	/**
-	 * The feature id for the '<em><b>Default Label</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LABEL_CONFIGURATION__DEFAULT_LABEL = 0;
-
-	/**
-	 * The number of structural features of the '<em>Label Configuration</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LABEL_CONFIGURATION_FEATURE_COUNT = 1;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension <em>Pror Tool Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Pror Tool Extension</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension
-	 * @generated
-	 */
-	EClass getProrToolExtension();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getSpecViewConfigurations <em>Spec View Configurations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Spec View Configurations</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getSpecViewConfigurations()
-	 * @see #getProrToolExtension()
-	 * @generated
-	 */
-	EReference getProrToolExtension_SpecViewConfigurations();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getGeneralConfiguration <em>General Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>General Configuration</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getGeneralConfiguration()
-	 * @see #getProrToolExtension()
-	 * @generated
-	 */
-	EReference getProrToolExtension_GeneralConfiguration();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getPresentationConfigurations <em>Presentation Configurations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Presentation Configurations</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getPresentationConfigurations()
-	 * @see #getProrToolExtension()
-	 * @generated
-	 */
-	EReference getProrToolExtension_PresentationConfigurations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration <em>Pror Spec View Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Pror Spec View Configuration</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration
-	 * @generated
-	 */
-	EClass getProrSpecViewConfiguration();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getSpecification <em>Specification</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Specification</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getSpecification()
-	 * @see #getProrSpecViewConfiguration()
-	 * @generated
-	 */
-	EReference getProrSpecViewConfiguration_Specification();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getColumns <em>Columns</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Columns</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getColumns()
-	 * @see #getProrSpecViewConfiguration()
-	 * @generated
-	 */
-	EReference getProrSpecViewConfiguration_Columns();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getLeftHeaderColumn <em>Left Header Column</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Left Header Column</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getLeftHeaderColumn()
-	 * @see #getProrSpecViewConfiguration()
-	 * @generated
-	 */
-	EReference getProrSpecViewConfiguration_LeftHeaderColumn();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.Column <em>Column</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Column</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.Column
-	 * @generated
-	 */
-	EClass getColumn();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getLabel <em>Label</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Label</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.Column#getLabel()
-	 * @see #getColumn()
-	 * @generated
-	 */
-	EAttribute getColumn_Label();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getWidth <em>Width</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Width</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.Column#getWidth()
-	 * @see #getColumn()
-	 * @generated
-	 */
-	EAttribute getColumn_Width();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations <em>Pror Presentation Configurations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Pror Presentation Configurations</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations
-	 * @generated
-	 */
-	EClass getProrPresentationConfigurations();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations#getPresentationConfigurations <em>Presentation Configurations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Presentation Configurations</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations#getPresentationConfigurations()
-	 * @see #getProrPresentationConfigurations()
-	 * @generated
-	 */
-	EReference getProrPresentationConfigurations_PresentationConfigurations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration <em>Pror Presentation Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Pror Presentation Configuration</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration
-	 * @generated
-	 */
-	EClass getProrPresentationConfiguration();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration#getDatatype <em>Datatype</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Datatype</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration#getDatatype()
-	 * @see #getProrPresentationConfiguration()
-	 * @generated
-	 */
-	EReference getProrPresentationConfiguration_Datatype();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration <em>Pror General Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Pror General Configuration</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration
-	 * @generated
-	 */
-	EClass getProrGeneralConfiguration();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration#getLabelConfiguration <em>Label Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Label Configuration</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration#getLabelConfiguration()
-	 * @see #getProrGeneralConfiguration()
-	 * @generated
-	 */
-	EReference getProrGeneralConfiguration_LabelConfiguration();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration <em>Label Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Label Configuration</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration
-	 * @generated
-	 */
-	EClass getLabelConfiguration();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration#getDefaultLabel <em>Default Label</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Default Label</em>'.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration#getDefaultLabel()
-	 * @see #getLabelConfiguration()
-	 * @generated
-	 */
-	EAttribute getLabelConfiguration_DefaultLabel();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	ConfigurationFactory getConfigurationFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl <em>Pror Tool Extension</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrToolExtension()
-		 * @generated
-		 */
-		EClass PROR_TOOL_EXTENSION = eINSTANCE.getProrToolExtension();
-
-		/**
-		 * The meta object literal for the '<em><b>Spec View Configurations</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS = eINSTANCE.getProrToolExtension_SpecViewConfigurations();
-
-		/**
-		 * The meta object literal for the '<em><b>General Configuration</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION = eINSTANCE.getProrToolExtension_GeneralConfiguration();
-
-		/**
-		 * The meta object literal for the '<em><b>Presentation Configurations</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS = eINSTANCE.getProrToolExtension_PresentationConfigurations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl <em>Pror Spec View Configuration</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrSpecViewConfiguration()
-		 * @generated
-		 */
-		EClass PROR_SPEC_VIEW_CONFIGURATION = eINSTANCE.getProrSpecViewConfiguration();
-
-		/**
-		 * The meta object literal for the '<em><b>Specification</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION = eINSTANCE.getProrSpecViewConfiguration_Specification();
-
-		/**
-		 * The meta object literal for the '<em><b>Columns</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROR_SPEC_VIEW_CONFIGURATION__COLUMNS = eINSTANCE.getProrSpecViewConfiguration_Columns();
-
-		/**
-		 * The meta object literal for the '<em><b>Left Header Column</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN = eINSTANCE.getProrSpecViewConfiguration_LeftHeaderColumn();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ColumnImpl <em>Column</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ColumnImpl
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getColumn()
-		 * @generated
-		 */
-		EClass COLUMN = eINSTANCE.getColumn();
-
-		/**
-		 * The meta object literal for the '<em><b>Label</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute COLUMN__LABEL = eINSTANCE.getColumn_Label();
-
-		/**
-		 * The meta object literal for the '<em><b>Width</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute COLUMN__WIDTH = eINSTANCE.getColumn_Width();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationsImpl <em>Pror Presentation Configurations</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationsImpl
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrPresentationConfigurations()
-		 * @generated
-		 */
-		EClass PROR_PRESENTATION_CONFIGURATIONS = eINSTANCE.getProrPresentationConfigurations();
-
-		/**
-		 * The meta object literal for the '<em><b>Presentation Configurations</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS = eINSTANCE.getProrPresentationConfigurations_PresentationConfigurations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationImpl <em>Pror Presentation Configuration</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationImpl
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrPresentationConfiguration()
-		 * @generated
-		 */
-		EClass PROR_PRESENTATION_CONFIGURATION = eINSTANCE.getProrPresentationConfiguration();
-
-		/**
-		 * The meta object literal for the '<em><b>Datatype</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROR_PRESENTATION_CONFIGURATION__DATATYPE = eINSTANCE.getProrPresentationConfiguration_Datatype();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrGeneralConfigurationImpl <em>Pror General Configuration</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrGeneralConfigurationImpl
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrGeneralConfiguration()
-		 * @generated
-		 */
-		EClass PROR_GENERAL_CONFIGURATION = eINSTANCE.getProrGeneralConfiguration();
-
-		/**
-		 * The meta object literal for the '<em><b>Label Configuration</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION = eINSTANCE.getProrGeneralConfiguration_LabelConfiguration();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.LabelConfigurationImpl <em>Label Configuration</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.LabelConfigurationImpl
-		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getLabelConfiguration()
-		 * @generated
-		 */
-		EClass LABEL_CONFIGURATION = eINSTANCE.getLabelConfiguration();
-
-		/**
-		 * The meta object literal for the '<em><b>Default Label</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute LABEL_CONFIGURATION__DEFAULT_LABEL = eINSTANCE.getLabelConfiguration_DefaultLabel();
-
-	}
-
-} //ConfigPackage
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface ConfigurationPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "configuration";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://eclipse.org/rmf/pror/toolextensions/1.0";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "configuration";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	ConfigurationPackage eINSTANCE = org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl <em>Pror Tool Extension</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrToolExtension()
+	 * @generated
+	 */
+	int PROR_TOOL_EXTENSION = 0;
+
+	/**
+	 * The feature id for the '<em><b>Spec View Configurations</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS = 0;
+
+	/**
+	 * The feature id for the '<em><b>General Configuration</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION = 1;
+
+	/**
+	 * The feature id for the '<em><b>Presentation Configurations</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS = 2;
+
+	/**
+	 * The number of structural features of the '<em>Pror Tool Extension</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_TOOL_EXTENSION_FEATURE_COUNT = 3;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl <em>Pror Spec View Configuration</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrSpecViewConfiguration()
+	 * @generated
+	 */
+	int PROR_SPEC_VIEW_CONFIGURATION = 1;
+
+	/**
+	 * The feature id for the '<em><b>Specification</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION = 0;
+
+	/**
+	 * The feature id for the '<em><b>Columns</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_SPEC_VIEW_CONFIGURATION__COLUMNS = 1;
+
+	/**
+	 * The feature id for the '<em><b>Left Header Column</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN = 2;
+
+	/**
+	 * The number of structural features of the '<em>Pror Spec View Configuration</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_SPEC_VIEW_CONFIGURATION_FEATURE_COUNT = 3;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ColumnImpl <em>Column</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ColumnImpl
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getColumn()
+	 * @generated
+	 */
+	int COLUMN = 2;
+
+	/**
+	 * The feature id for the '<em><b>Label</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLUMN__LABEL = 0;
+
+	/**
+	 * The feature id for the '<em><b>Width</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLUMN__WIDTH = 1;
+
+	/**
+	 * The number of structural features of the '<em>Column</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLUMN_FEATURE_COUNT = 2;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationsImpl <em>Pror Presentation Configurations</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationsImpl
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrPresentationConfigurations()
+	 * @generated
+	 */
+	int PROR_PRESENTATION_CONFIGURATIONS = 3;
+
+	/**
+	 * The feature id for the '<em><b>Presentation Configurations</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS = 0;
+
+	/**
+	 * The number of structural features of the '<em>Pror Presentation Configurations</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_PRESENTATION_CONFIGURATIONS_FEATURE_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationImpl <em>Pror Presentation Configuration</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationImpl
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrPresentationConfiguration()
+	 * @generated
+	 */
+	int PROR_PRESENTATION_CONFIGURATION = 4;
+
+	/**
+	 * The feature id for the '<em><b>Datatype</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_PRESENTATION_CONFIGURATION__DATATYPE = 0;
+
+	/**
+	 * The number of structural features of the '<em>Pror Presentation Configuration</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_PRESENTATION_CONFIGURATION_FEATURE_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrGeneralConfigurationImpl <em>Pror General Configuration</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrGeneralConfigurationImpl
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrGeneralConfiguration()
+	 * @generated
+	 */
+	int PROR_GENERAL_CONFIGURATION = 5;
+
+	/**
+	 * The feature id for the '<em><b>Label Configuration</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION = 0;
+
+	/**
+	 * The number of structural features of the '<em>Pror General Configuration</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROR_GENERAL_CONFIGURATION_FEATURE_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.LabelConfigurationImpl <em>Label Configuration</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.LabelConfigurationImpl
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getLabelConfiguration()
+	 * @generated
+	 */
+	int LABEL_CONFIGURATION = 6;
+
+	/**
+	 * The feature id for the '<em><b>Default Label</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LABEL_CONFIGURATION__DEFAULT_LABEL = 0;
+
+	/**
+	 * The number of structural features of the '<em>Label Configuration</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LABEL_CONFIGURATION_FEATURE_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.UnifiedColumnImpl <em>Unified Column</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.UnifiedColumnImpl
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getUnifiedColumn()
+	 * @generated
+	 */
+	int UNIFIED_COLUMN = 7;
+
+	/**
+	 * The feature id for the '<em><b>Label</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNIFIED_COLUMN__LABEL = COLUMN__LABEL;
+
+	/**
+	 * The feature id for the '<em><b>Width</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNIFIED_COLUMN__WIDTH = COLUMN__WIDTH;
+
+	/**
+	 * The number of structural features of the '<em>Unified Column</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNIFIED_COLUMN_FEATURE_COUNT = COLUMN_FEATURE_COUNT + 0;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension <em>Pror Tool Extension</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Pror Tool Extension</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension
+	 * @generated
+	 */
+	EClass getProrToolExtension();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getSpecViewConfigurations <em>Spec View Configurations</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Spec View Configurations</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getSpecViewConfigurations()
+	 * @see #getProrToolExtension()
+	 * @generated
+	 */
+	EReference getProrToolExtension_SpecViewConfigurations();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getGeneralConfiguration <em>General Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>General Configuration</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getGeneralConfiguration()
+	 * @see #getProrToolExtension()
+	 * @generated
+	 */
+	EReference getProrToolExtension_GeneralConfiguration();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getPresentationConfigurations <em>Presentation Configurations</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Presentation Configurations</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getPresentationConfigurations()
+	 * @see #getProrToolExtension()
+	 * @generated
+	 */
+	EReference getProrToolExtension_PresentationConfigurations();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration <em>Pror Spec View Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Pror Spec View Configuration</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration
+	 * @generated
+	 */
+	EClass getProrSpecViewConfiguration();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getSpecification <em>Specification</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Specification</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getSpecification()
+	 * @see #getProrSpecViewConfiguration()
+	 * @generated
+	 */
+	EReference getProrSpecViewConfiguration_Specification();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getColumns <em>Columns</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Columns</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getColumns()
+	 * @see #getProrSpecViewConfiguration()
+	 * @generated
+	 */
+	EReference getProrSpecViewConfiguration_Columns();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getLeftHeaderColumn <em>Left Header Column</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Left Header Column</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getLeftHeaderColumn()
+	 * @see #getProrSpecViewConfiguration()
+	 * @generated
+	 */
+	EReference getProrSpecViewConfiguration_LeftHeaderColumn();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.Column <em>Column</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Column</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.Column
+	 * @generated
+	 */
+	EClass getColumn();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getLabel <em>Label</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Label</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.Column#getLabel()
+	 * @see #getColumn()
+	 * @generated
+	 */
+	EAttribute getColumn_Label();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.rmf.reqif10.pror.configuration.Column#getWidth <em>Width</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Width</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.Column#getWidth()
+	 * @see #getColumn()
+	 * @generated
+	 */
+	EAttribute getColumn_Width();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations <em>Pror Presentation Configurations</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Pror Presentation Configurations</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations
+	 * @generated
+	 */
+	EClass getProrPresentationConfigurations();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations#getPresentationConfigurations <em>Presentation Configurations</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Presentation Configurations</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations#getPresentationConfigurations()
+	 * @see #getProrPresentationConfigurations()
+	 * @generated
+	 */
+	EReference getProrPresentationConfigurations_PresentationConfigurations();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration <em>Pror Presentation Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Pror Presentation Configuration</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration
+	 * @generated
+	 */
+	EClass getProrPresentationConfiguration();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration#getDatatype <em>Datatype</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Datatype</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration#getDatatype()
+	 * @see #getProrPresentationConfiguration()
+	 * @generated
+	 */
+	EReference getProrPresentationConfiguration_Datatype();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration <em>Pror General Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Pror General Configuration</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration
+	 * @generated
+	 */
+	EClass getProrGeneralConfiguration();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration#getLabelConfiguration <em>Label Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Label Configuration</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration#getLabelConfiguration()
+	 * @see #getProrGeneralConfiguration()
+	 * @generated
+	 */
+	EReference getProrGeneralConfiguration_LabelConfiguration();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration <em>Label Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Label Configuration</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration
+	 * @generated
+	 */
+	EClass getLabelConfiguration();
+
+	/**
+	 * Returns the meta object for the attribute list '{@link org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration#getDefaultLabel <em>Default Label</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute list '<em>Default Label</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration#getDefaultLabel()
+	 * @see #getLabelConfiguration()
+	 * @generated
+	 */
+	EAttribute getLabelConfiguration_DefaultLabel();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn <em>Unified Column</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Unified Column</em>'.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn
+	 * @generated
+	 */
+	EClass getUnifiedColumn();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	ConfigurationFactory getConfigurationFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl <em>Pror Tool Extension</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrToolExtension()
+		 * @generated
+		 */
+		EClass PROR_TOOL_EXTENSION = eINSTANCE.getProrToolExtension();
+
+		/**
+		 * The meta object literal for the '<em><b>Spec View Configurations</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS = eINSTANCE.getProrToolExtension_SpecViewConfigurations();
+
+		/**
+		 * The meta object literal for the '<em><b>General Configuration</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION = eINSTANCE.getProrToolExtension_GeneralConfiguration();
+
+		/**
+		 * The meta object literal for the '<em><b>Presentation Configurations</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS = eINSTANCE.getProrToolExtension_PresentationConfigurations();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl <em>Pror Spec View Configuration</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrSpecViewConfiguration()
+		 * @generated
+		 */
+		EClass PROR_SPEC_VIEW_CONFIGURATION = eINSTANCE.getProrSpecViewConfiguration();
+
+		/**
+		 * The meta object literal for the '<em><b>Specification</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION = eINSTANCE.getProrSpecViewConfiguration_Specification();
+
+		/**
+		 * The meta object literal for the '<em><b>Columns</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PROR_SPEC_VIEW_CONFIGURATION__COLUMNS = eINSTANCE.getProrSpecViewConfiguration_Columns();
+
+		/**
+		 * The meta object literal for the '<em><b>Left Header Column</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN = eINSTANCE.getProrSpecViewConfiguration_LeftHeaderColumn();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ColumnImpl <em>Column</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ColumnImpl
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getColumn()
+		 * @generated
+		 */
+		EClass COLUMN = eINSTANCE.getColumn();
+
+		/**
+		 * The meta object literal for the '<em><b>Label</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute COLUMN__LABEL = eINSTANCE.getColumn_Label();
+
+		/**
+		 * The meta object literal for the '<em><b>Width</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute COLUMN__WIDTH = eINSTANCE.getColumn_Width();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationsImpl <em>Pror Presentation Configurations</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationsImpl
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrPresentationConfigurations()
+		 * @generated
+		 */
+		EClass PROR_PRESENTATION_CONFIGURATIONS = eINSTANCE.getProrPresentationConfigurations();
+
+		/**
+		 * The meta object literal for the '<em><b>Presentation Configurations</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS = eINSTANCE.getProrPresentationConfigurations_PresentationConfigurations();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationImpl <em>Pror Presentation Configuration</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationImpl
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrPresentationConfiguration()
+		 * @generated
+		 */
+		EClass PROR_PRESENTATION_CONFIGURATION = eINSTANCE.getProrPresentationConfiguration();
+
+		/**
+		 * The meta object literal for the '<em><b>Datatype</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PROR_PRESENTATION_CONFIGURATION__DATATYPE = eINSTANCE.getProrPresentationConfiguration_Datatype();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrGeneralConfigurationImpl <em>Pror General Configuration</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ProrGeneralConfigurationImpl
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getProrGeneralConfiguration()
+		 * @generated
+		 */
+		EClass PROR_GENERAL_CONFIGURATION = eINSTANCE.getProrGeneralConfiguration();
+
+		/**
+		 * The meta object literal for the '<em><b>Label Configuration</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION = eINSTANCE.getProrGeneralConfiguration_LabelConfiguration();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.LabelConfigurationImpl <em>Label Configuration</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.LabelConfigurationImpl
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getLabelConfiguration()
+		 * @generated
+		 */
+		EClass LABEL_CONFIGURATION = eINSTANCE.getLabelConfiguration();
+
+		/**
+		 * The meta object literal for the '<em><b>Default Label</b></em>' attribute list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LABEL_CONFIGURATION__DEFAULT_LABEL = eINSTANCE.getLabelConfiguration_DefaultLabel();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.rmf.reqif10.pror.configuration.impl.UnifiedColumnImpl <em>Unified Column</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.UnifiedColumnImpl
+		 * @see org.eclipse.rmf.reqif10.pror.configuration.impl.ConfigurationPackageImpl#getUnifiedColumn()
+		 * @generated
+		 */
+		EClass UNIFIED_COLUMN = eINSTANCE.getUnifiedColumn();
+
+	}
+
+} //ConfigurationPackage
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/LabelConfiguration.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/LabelConfiguration.java
index 8aaf38f..f641334 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/LabelConfiguration.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/LabelConfiguration.java
@@ -1,73 +1,65 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Label Configuration</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration#getDefaultLabel <em>Default Label</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getLabelConfiguration()
- * @model
- * @generated
- */
-public interface LabelConfiguration extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Default Label</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Label</em>' attribute list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Label</em>' attribute list.
-	 * @see #isSetDefaultLabel()
-	 * @see #unsetDefaultLabel()
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getLabelConfiguration_DefaultLabel()
-	 * @model unsettable="true"
-	 * @generated
-	 */
-	EList<String> getDefaultLabel();
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration#getDefaultLabel <em>Default Label</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetDefaultLabel()
-	 * @see #getDefaultLabel()
-	 * @generated
-	 */
-	void unsetDefaultLabel();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration#getDefaultLabel <em>Default Label</em>}' attribute list is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Default Label</em>' attribute list is set.
-	 * @see #unsetDefaultLabel()
-	 * @see #getDefaultLabel()
-	 * @generated
-	 */
-	boolean isSetDefaultLabel();
-
-} // LabelConfiguration
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Label Configuration</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration#getDefaultLabel <em>Default Label</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getLabelConfiguration()
+ * @model
+ * @generated
+ */
+public interface LabelConfiguration extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Default Label</b></em>' attribute list.
+	 * The list contents are of type {@link java.lang.String}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Default Label</em>' attribute list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Default Label</em>' attribute list.
+	 * @see #isSetDefaultLabel()
+	 * @see #unsetDefaultLabel()
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getLabelConfiguration_DefaultLabel()
+	 * @model unsettable="true"
+	 * @generated
+	 */
+	EList<String> getDefaultLabel();
+
+	/**
+	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration#getDefaultLabel <em>Default Label</em>}' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSetDefaultLabel()
+	 * @see #getDefaultLabel()
+	 * @generated
+	 */
+	void unsetDefaultLabel();
+
+	/**
+	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration#getDefaultLabel <em>Default Label</em>}' attribute list is set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em>Default Label</em>' attribute list is set.
+	 * @see #unsetDefaultLabel()
+	 * @see #getDefaultLabel()
+	 * @generated
+	 */
+	boolean isSetDefaultLabel();
+
+} // LabelConfiguration
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrGeneralConfiguration.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrGeneralConfiguration.java
index a9e964b..61659be 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrGeneralConfiguration.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrGeneralConfiguration.java
@@ -1,88 +1,79 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Pror General Configuration</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration#getLabelConfiguration <em>Label Configuration</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrGeneralConfiguration()
- * @model
- * @generated
- */
-public interface ProrGeneralConfiguration extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Label Configuration</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Label Configuration</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Label Configuration</em>' containment reference.
-	 * @see #isSetLabelConfiguration()
-	 * @see #unsetLabelConfiguration()
-	 * @see #setLabelConfiguration(LabelConfiguration)
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrGeneralConfiguration_LabelConfiguration()
-	 * @model containment="true" unsettable="true" required="true"
-	 *        extendedMetaData="name='labelConfiguration' kind='element' namespace='##targetNamespace'"
-	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='labelConfiguration' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
-	 * @generated
-	 */
-	LabelConfiguration getLabelConfiguration();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration#getLabelConfiguration <em>Label Configuration</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Label Configuration</em>' containment reference.
-	 * @see #isSetLabelConfiguration()
-	 * @see #unsetLabelConfiguration()
-	 * @see #getLabelConfiguration()
-	 * @generated
-	 */
-	void setLabelConfiguration(LabelConfiguration value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration#getLabelConfiguration <em>Label Configuration</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetLabelConfiguration()
-	 * @see #getLabelConfiguration()
-	 * @see #setLabelConfiguration(LabelConfiguration)
-	 * @generated
-	 */
-	void unsetLabelConfiguration();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration#getLabelConfiguration <em>Label Configuration</em>}' containment reference is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Label Configuration</em>' containment reference is set.
-	 * @see #unsetLabelConfiguration()
-	 * @see #getLabelConfiguration()
-	 * @see #setLabelConfiguration(LabelConfiguration)
-	 * @generated
-	 */
-	boolean isSetLabelConfiguration();
-
-} // ProrGeneralConfiguration
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Pror General Configuration</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration#getLabelConfiguration <em>Label Configuration</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrGeneralConfiguration()
+ * @model
+ * @generated
+ */
+public interface ProrGeneralConfiguration extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Label Configuration</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Label Configuration</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Label Configuration</em>' containment reference.
+	 * @see #isSetLabelConfiguration()
+	 * @see #unsetLabelConfiguration()
+	 * @see #setLabelConfiguration(LabelConfiguration)
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrGeneralConfiguration_LabelConfiguration()
+	 * @model containment="true" unsettable="true" required="true"
+	 *        extendedMetaData="name='labelConfiguration' kind='element' namespace='##targetNamespace'"
+	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='labelConfiguration' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
+	 * @generated
+	 */
+	LabelConfiguration getLabelConfiguration();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration#getLabelConfiguration <em>Label Configuration</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Label Configuration</em>' containment reference.
+	 * @see #isSetLabelConfiguration()
+	 * @see #unsetLabelConfiguration()
+	 * @see #getLabelConfiguration()
+	 * @generated
+	 */
+	void setLabelConfiguration(LabelConfiguration value);
+
+	/**
+	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration#getLabelConfiguration <em>Label Configuration</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSetLabelConfiguration()
+	 * @see #getLabelConfiguration()
+	 * @see #setLabelConfiguration(LabelConfiguration)
+	 * @generated
+	 */
+	void unsetLabelConfiguration();
+
+	/**
+	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration#getLabelConfiguration <em>Label Configuration</em>}' containment reference is set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em>Label Configuration</em>' containment reference is set.
+	 * @see #unsetLabelConfiguration()
+	 * @see #getLabelConfiguration()
+	 * @see #setLabelConfiguration(LabelConfiguration)
+	 * @generated
+	 */
+	boolean isSetLabelConfiguration();
+
+} // ProrGeneralConfiguration
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrPresentationConfiguration.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrPresentationConfiguration.java
index 827e1d8..6c53708 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrPresentationConfiguration.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrPresentationConfiguration.java
@@ -1,87 +1,79 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.rmf.reqif10.DatatypeDefinition;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Pror Presentation Configuration</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration#getDatatype <em>Datatype</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrPresentationConfiguration()
- * @model abstract="true"
- * @generated
- */
-public interface ProrPresentationConfiguration extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Datatype</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Datatype</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Datatype</em>' reference.
-	 * @see #isSetDatatype()
-	 * @see #unsetDatatype()
-	 * @see #setDatatype(DatatypeDefinition)
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrPresentationConfiguration_Datatype()
-	 * @model unsettable="true" required="true"
-	 * @generated
-	 */
-	DatatypeDefinition getDatatype();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration#getDatatype <em>Datatype</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Datatype</em>' reference.
-	 * @see #isSetDatatype()
-	 * @see #unsetDatatype()
-	 * @see #getDatatype()
-	 * @generated
-	 */
-	void setDatatype(DatatypeDefinition value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration#getDatatype <em>Datatype</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetDatatype()
-	 * @see #getDatatype()
-	 * @see #setDatatype(DatatypeDefinition)
-	 * @generated
-	 */
-	void unsetDatatype();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration#getDatatype <em>Datatype</em>}' reference is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Datatype</em>' reference is set.
-	 * @see #unsetDatatype()
-	 * @see #getDatatype()
-	 * @see #setDatatype(DatatypeDefinition)
-	 * @generated
-	 */
-	boolean isSetDatatype();
-
-} // ProrPresentationConfiguration
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.rmf.reqif10.DatatypeDefinition;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Pror Presentation Configuration</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration#getDatatype <em>Datatype</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrPresentationConfiguration()
+ * @model abstract="true"
+ * @generated
+ */
+public interface ProrPresentationConfiguration extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Datatype</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Datatype</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Datatype</em>' reference.
+	 * @see #isSetDatatype()
+	 * @see #unsetDatatype()
+	 * @see #setDatatype(DatatypeDefinition)
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrPresentationConfiguration_Datatype()
+	 * @model unsettable="true" required="true"
+	 * @generated
+	 */
+	DatatypeDefinition getDatatype();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration#getDatatype <em>Datatype</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Datatype</em>' reference.
+	 * @see #isSetDatatype()
+	 * @see #unsetDatatype()
+	 * @see #getDatatype()
+	 * @generated
+	 */
+	void setDatatype(DatatypeDefinition value);
+
+	/**
+	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration#getDatatype <em>Datatype</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSetDatatype()
+	 * @see #getDatatype()
+	 * @see #setDatatype(DatatypeDefinition)
+	 * @generated
+	 */
+	void unsetDatatype();
+
+	/**
+	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration#getDatatype <em>Datatype</em>}' reference is set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em>Datatype</em>' reference is set.
+	 * @see #unsetDatatype()
+	 * @see #getDatatype()
+	 * @see #setDatatype(DatatypeDefinition)
+	 * @generated
+	 */
+	boolean isSetDatatype();
+
+} // ProrPresentationConfiguration
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrPresentationConfigurations.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrPresentationConfigurations.java
index ebfe44e..d2633f1 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrPresentationConfigurations.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrPresentationConfigurations.java
@@ -1,75 +1,67 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Pror Presentation Configurations</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations#getPresentationConfigurations <em>Presentation Configurations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrPresentationConfigurations()
- * @model
- * @generated
- */
-public interface ProrPresentationConfigurations extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Presentation Configurations</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Presentation Configurations</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Presentation Configurations</em>' containment reference list.
-	 * @see #isSetPresentationConfigurations()
-	 * @see #unsetPresentationConfigurations()
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrPresentationConfigurations_PresentationConfigurations()
-	 * @model containment="true" unsettable="true"
-	 *        extendedMetaData="name='presentationConfigurations' kind='element' namespace='##targetNamespace'"
-	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='presentationConfigurations' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
-	 * @generated
-	 */
-	EList<ProrPresentationConfiguration> getPresentationConfigurations();
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations#getPresentationConfigurations <em>Presentation Configurations</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetPresentationConfigurations()
-	 * @see #getPresentationConfigurations()
-	 * @generated
-	 */
-	void unsetPresentationConfigurations();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations#getPresentationConfigurations <em>Presentation Configurations</em>}' containment reference list is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Presentation Configurations</em>' containment reference list is set.
-	 * @see #unsetPresentationConfigurations()
-	 * @see #getPresentationConfigurations()
-	 * @generated
-	 */
-	boolean isSetPresentationConfigurations();
-
-} // ProrPresentationConfigurations
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Pror Presentation Configurations</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations#getPresentationConfigurations <em>Presentation Configurations</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrPresentationConfigurations()
+ * @model
+ * @generated
+ */
+public interface ProrPresentationConfigurations extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Presentation Configurations</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Presentation Configurations</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Presentation Configurations</em>' containment reference list.
+	 * @see #isSetPresentationConfigurations()
+	 * @see #unsetPresentationConfigurations()
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrPresentationConfigurations_PresentationConfigurations()
+	 * @model containment="true" unsettable="true"
+	 *        extendedMetaData="name='presentationConfigurations' kind='element' namespace='##targetNamespace'"
+	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='presentationConfigurations' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
+	 * @generated
+	 */
+	EList<ProrPresentationConfiguration> getPresentationConfigurations();
+
+	/**
+	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations#getPresentationConfigurations <em>Presentation Configurations</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSetPresentationConfigurations()
+	 * @see #getPresentationConfigurations()
+	 * @generated
+	 */
+	void unsetPresentationConfigurations();
+
+	/**
+	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations#getPresentationConfigurations <em>Presentation Configurations</em>}' containment reference list is set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em>Presentation Configurations</em>' containment reference list is set.
+	 * @see #unsetPresentationConfigurations()
+	 * @see #getPresentationConfigurations()
+	 * @generated
+	 */
+	boolean isSetPresentationConfigurations();
+
+} // ProrPresentationConfigurations
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrSpecViewConfiguration.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrSpecViewConfiguration.java
index 8a29546..57dca79 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrSpecViewConfiguration.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrSpecViewConfiguration.java
@@ -1,186 +1,179 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.rmf.reqif10.Specification;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Pror Spec View Configuration</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getSpecification <em>Specification</em>}</li>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getColumns <em>Columns</em>}</li>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getLeftHeaderColumn <em>Left Header Column</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrSpecViewConfiguration()
- * @model
- * @generated
- */
-public interface ProrSpecViewConfiguration extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Specification</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Specification</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Specification</em>' reference.
-	 * @see #isSetSpecification()
-	 * @see #unsetSpecification()
-	 * @see #setSpecification(Specification)
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrSpecViewConfiguration_Specification()
-	 * @model unsettable="true" required="true"
-	 * @generated
-	 */
-	Specification getSpecification();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getSpecification <em>Specification</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Specification</em>' reference.
-	 * @see #isSetSpecification()
-	 * @see #unsetSpecification()
-	 * @see #getSpecification()
-	 * @generated
-	 */
-	void setSpecification(Specification value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getSpecification <em>Specification</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetSpecification()
-	 * @see #getSpecification()
-	 * @see #setSpecification(Specification)
-	 * @generated
-	 */
-	void unsetSpecification();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getSpecification <em>Specification</em>}' reference is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Specification</em>' reference is set.
-	 * @see #unsetSpecification()
-	 * @see #getSpecification()
-	 * @see #setSpecification(Specification)
-	 * @generated
-	 */
-	boolean isSetSpecification();
-
-	/**
-	 * Returns the value of the '<em><b>Columns</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.rmf.reqif10.pror.configuration.Column}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Columns</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Columns</em>' containment reference list.
-	 * @see #isSetColumns()
-	 * @see #unsetColumns()
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrSpecViewConfiguration_Columns()
-	 * @model containment="true" unsettable="true"
-	 *        extendedMetaData="name='columns' kind='element' namespace='##targetNamespace'"
-	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='columns' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
-	 * @generated
-	 */
-	EList<Column> getColumns();
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getColumns <em>Columns</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetColumns()
-	 * @see #getColumns()
-	 * @generated
-	 */
-	void unsetColumns();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getColumns <em>Columns</em>}' containment reference list is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Columns</em>' containment reference list is set.
-	 * @see #unsetColumns()
-	 * @see #getColumns()
-	 * @generated
-	 */
-	boolean isSetColumns();
-
-	/**
-	 * Returns the value of the '<em><b>Left Header Column</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Left Header Column</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Left Header Column</em>' containment reference.
-	 * @see #isSetLeftHeaderColumn()
-	 * @see #unsetLeftHeaderColumn()
-	 * @see #setLeftHeaderColumn(Column)
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrSpecViewConfiguration_LeftHeaderColumn()
-	 * @model containment="true" unsettable="true" required="true"
-	 *        extendedMetaData="name='leftHeaderColumn' kind='element' namespace='##targetNamespace'"
-	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='leftHeaderColumn' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
-	 * @generated
-	 */
-	Column getLeftHeaderColumn();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getLeftHeaderColumn <em>Left Header Column</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Left Header Column</em>' containment reference.
-	 * @see #isSetLeftHeaderColumn()
-	 * @see #unsetLeftHeaderColumn()
-	 * @see #getLeftHeaderColumn()
-	 * @generated
-	 */
-	void setLeftHeaderColumn(Column value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getLeftHeaderColumn <em>Left Header Column</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetLeftHeaderColumn()
-	 * @see #getLeftHeaderColumn()
-	 * @see #setLeftHeaderColumn(Column)
-	 * @generated
-	 */
-	void unsetLeftHeaderColumn();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getLeftHeaderColumn <em>Left Header Column</em>}' containment reference is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Left Header Column</em>' containment reference is set.
-	 * @see #unsetLeftHeaderColumn()
-	 * @see #getLeftHeaderColumn()
-	 * @see #setLeftHeaderColumn(Column)
-	 * @generated
-	 */
-	boolean isSetLeftHeaderColumn();
-
-} // ProrSpecViewConfiguration
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.rmf.reqif10.Specification;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Pror Spec View Configuration</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getSpecification <em>Specification</em>}</li>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getColumns <em>Columns</em>}</li>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getLeftHeaderColumn <em>Left Header Column</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrSpecViewConfiguration()
+ * @model
+ * @generated
+ */
+public interface ProrSpecViewConfiguration extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Specification</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Specification</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Specification</em>' reference.
+	 * @see #isSetSpecification()
+	 * @see #unsetSpecification()
+	 * @see #setSpecification(Specification)
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrSpecViewConfiguration_Specification()
+	 * @model unsettable="true" required="true"
+	 * @generated
+	 */
+	Specification getSpecification();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getSpecification <em>Specification</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Specification</em>' reference.
+	 * @see #isSetSpecification()
+	 * @see #unsetSpecification()
+	 * @see #getSpecification()
+	 * @generated
+	 */
+	void setSpecification(Specification value);
+
+	/**
+	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getSpecification <em>Specification</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSetSpecification()
+	 * @see #getSpecification()
+	 * @see #setSpecification(Specification)
+	 * @generated
+	 */
+	void unsetSpecification();
+
+	/**
+	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getSpecification <em>Specification</em>}' reference is set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em>Specification</em>' reference is set.
+	 * @see #unsetSpecification()
+	 * @see #getSpecification()
+	 * @see #setSpecification(Specification)
+	 * @generated
+	 */
+	boolean isSetSpecification();
+
+	/**
+	 * Returns the value of the '<em><b>Columns</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.rmf.reqif10.pror.configuration.Column}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Columns</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Columns</em>' containment reference list.
+	 * @see #isSetColumns()
+	 * @see #unsetColumns()
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrSpecViewConfiguration_Columns()
+	 * @model containment="true" unsettable="true"
+	 *        extendedMetaData="name='columns' kind='element' namespace='##targetNamespace'"
+	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='columns' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
+	 * @generated
+	 */
+	EList<Column> getColumns();
+
+	/**
+	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getColumns <em>Columns</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSetColumns()
+	 * @see #getColumns()
+	 * @generated
+	 */
+	void unsetColumns();
+
+	/**
+	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getColumns <em>Columns</em>}' containment reference list is set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em>Columns</em>' containment reference list is set.
+	 * @see #unsetColumns()
+	 * @see #getColumns()
+	 * @generated
+	 */
+	boolean isSetColumns();
+
+	/**
+	 * Returns the value of the '<em><b>Left Header Column</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Left Header Column</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Left Header Column</em>' containment reference.
+	 * @see #isSetLeftHeaderColumn()
+	 * @see #unsetLeftHeaderColumn()
+	 * @see #setLeftHeaderColumn(Column)
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrSpecViewConfiguration_LeftHeaderColumn()
+	 * @model containment="true" unsettable="true" required="true"
+	 *        extendedMetaData="name='leftHeaderColumn' kind='element' namespace='##targetNamespace'"
+	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='leftHeaderColumn' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
+	 * @generated
+	 */
+	Column getLeftHeaderColumn();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getLeftHeaderColumn <em>Left Header Column</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Left Header Column</em>' containment reference.
+	 * @see #isSetLeftHeaderColumn()
+	 * @see #unsetLeftHeaderColumn()
+	 * @see #getLeftHeaderColumn()
+	 * @generated
+	 */
+	void setLeftHeaderColumn(Column value);
+
+	/**
+	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getLeftHeaderColumn <em>Left Header Column</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSetLeftHeaderColumn()
+	 * @see #getLeftHeaderColumn()
+	 * @see #setLeftHeaderColumn(Column)
+	 * @generated
+	 */
+	void unsetLeftHeaderColumn();
+
+	/**
+	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration#getLeftHeaderColumn <em>Left Header Column</em>}' containment reference is set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em>Left Header Column</em>' containment reference is set.
+	 * @see #unsetLeftHeaderColumn()
+	 * @see #getLeftHeaderColumn()
+	 * @see #setLeftHeaderColumn(Column)
+	 * @generated
+	 */
+	boolean isSetLeftHeaderColumn();
+
+} // ProrSpecViewConfiguration
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrToolExtension.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrToolExtension.java
index 294283c..b2e98aa 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrToolExtension.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/ProrToolExtension.java
@@ -1,187 +1,179 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Pror Tool Extension</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getSpecViewConfigurations <em>Spec View Configurations</em>}</li>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getGeneralConfiguration <em>General Configuration</em>}</li>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getPresentationConfigurations <em>Presentation Configurations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrToolExtension()
- * @model
- * @generated
- */
-public interface ProrToolExtension extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Spec View Configurations</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Spec View Configurations</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Spec View Configurations</em>' containment reference list.
-	 * @see #isSetSpecViewConfigurations()
-	 * @see #unsetSpecViewConfigurations()
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrToolExtension_SpecViewConfigurations()
-	 * @model containment="true" unsettable="true"
-	 *        extendedMetaData="name='specViewConfigurations' kind='element' namespace='##targetNamespace'"
-	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='specViewConfigurations' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
-	 * @generated
-	 */
-	EList<ProrSpecViewConfiguration> getSpecViewConfigurations();
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getSpecViewConfigurations <em>Spec View Configurations</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetSpecViewConfigurations()
-	 * @see #getSpecViewConfigurations()
-	 * @generated
-	 */
-	void unsetSpecViewConfigurations();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getSpecViewConfigurations <em>Spec View Configurations</em>}' containment reference list is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Spec View Configurations</em>' containment reference list is set.
-	 * @see #unsetSpecViewConfigurations()
-	 * @see #getSpecViewConfigurations()
-	 * @generated
-	 */
-	boolean isSetSpecViewConfigurations();
-
-	/**
-	 * Returns the value of the '<em><b>General Configuration</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>General Configuration</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>General Configuration</em>' containment reference.
-	 * @see #isSetGeneralConfiguration()
-	 * @see #unsetGeneralConfiguration()
-	 * @see #setGeneralConfiguration(ProrGeneralConfiguration)
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrToolExtension_GeneralConfiguration()
-	 * @model containment="true" unsettable="true" required="true"
-	 *        extendedMetaData="name='generalConfiguration' kind='element' namespace='##targetNamespace'"
-	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='generalConfiguration' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
-	 * @generated
-	 */
-	ProrGeneralConfiguration getGeneralConfiguration();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getGeneralConfiguration <em>General Configuration</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>General Configuration</em>' containment reference.
-	 * @see #isSetGeneralConfiguration()
-	 * @see #unsetGeneralConfiguration()
-	 * @see #getGeneralConfiguration()
-	 * @generated
-	 */
-	void setGeneralConfiguration(ProrGeneralConfiguration value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getGeneralConfiguration <em>General Configuration</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetGeneralConfiguration()
-	 * @see #getGeneralConfiguration()
-	 * @see #setGeneralConfiguration(ProrGeneralConfiguration)
-	 * @generated
-	 */
-	void unsetGeneralConfiguration();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getGeneralConfiguration <em>General Configuration</em>}' containment reference is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>General Configuration</em>' containment reference is set.
-	 * @see #unsetGeneralConfiguration()
-	 * @see #getGeneralConfiguration()
-	 * @see #setGeneralConfiguration(ProrGeneralConfiguration)
-	 * @generated
-	 */
-	boolean isSetGeneralConfiguration();
-
-	/**
-	 * Returns the value of the '<em><b>Presentation Configurations</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Presentation Configurations</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Presentation Configurations</em>' containment reference.
-	 * @see #isSetPresentationConfigurations()
-	 * @see #unsetPresentationConfigurations()
-	 * @see #setPresentationConfigurations(ProrPresentationConfigurations)
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrToolExtension_PresentationConfigurations()
-	 * @model containment="true" unsettable="true" required="true"
-	 *        extendedMetaData="name='presentationConfigurations' kind='element' namespace='##targetNamespace'"
-	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='presentationConfigurations' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
-	 * @generated
-	 */
-	ProrPresentationConfigurations getPresentationConfigurations();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getPresentationConfigurations <em>Presentation Configurations</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Presentation Configurations</em>' containment reference.
-	 * @see #isSetPresentationConfigurations()
-	 * @see #unsetPresentationConfigurations()
-	 * @see #getPresentationConfigurations()
-	 * @generated
-	 */
-	void setPresentationConfigurations(ProrPresentationConfigurations value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getPresentationConfigurations <em>Presentation Configurations</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetPresentationConfigurations()
-	 * @see #getPresentationConfigurations()
-	 * @see #setPresentationConfigurations(ProrPresentationConfigurations)
-	 * @generated
-	 */
-	void unsetPresentationConfigurations();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getPresentationConfigurations <em>Presentation Configurations</em>}' containment reference is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Presentation Configurations</em>' containment reference is set.
-	 * @see #unsetPresentationConfigurations()
-	 * @see #getPresentationConfigurations()
-	 * @see #setPresentationConfigurations(ProrPresentationConfigurations)
-	 * @generated
-	 */
-	boolean isSetPresentationConfigurations();
-
-} // ProrToolExtension
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Pror Tool Extension</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getSpecViewConfigurations <em>Spec View Configurations</em>}</li>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getGeneralConfiguration <em>General Configuration</em>}</li>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getPresentationConfigurations <em>Presentation Configurations</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrToolExtension()
+ * @model
+ * @generated
+ */
+public interface ProrToolExtension extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Spec View Configurations</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Spec View Configurations</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Spec View Configurations</em>' containment reference list.
+	 * @see #isSetSpecViewConfigurations()
+	 * @see #unsetSpecViewConfigurations()
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrToolExtension_SpecViewConfigurations()
+	 * @model containment="true" unsettable="true"
+	 *        extendedMetaData="name='specViewConfigurations' kind='element' namespace='##targetNamespace'"
+	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='specViewConfigurations' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
+	 * @generated
+	 */
+	EList<ProrSpecViewConfiguration> getSpecViewConfigurations();
+
+	/**
+	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getSpecViewConfigurations <em>Spec View Configurations</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSetSpecViewConfigurations()
+	 * @see #getSpecViewConfigurations()
+	 * @generated
+	 */
+	void unsetSpecViewConfigurations();
+
+	/**
+	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getSpecViewConfigurations <em>Spec View Configurations</em>}' containment reference list is set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em>Spec View Configurations</em>' containment reference list is set.
+	 * @see #unsetSpecViewConfigurations()
+	 * @see #getSpecViewConfigurations()
+	 * @generated
+	 */
+	boolean isSetSpecViewConfigurations();
+
+	/**
+	 * Returns the value of the '<em><b>General Configuration</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>General Configuration</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>General Configuration</em>' containment reference.
+	 * @see #isSetGeneralConfiguration()
+	 * @see #unsetGeneralConfiguration()
+	 * @see #setGeneralConfiguration(ProrGeneralConfiguration)
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrToolExtension_GeneralConfiguration()
+	 * @model containment="true" unsettable="true" required="true"
+	 *        extendedMetaData="name='generalConfiguration' kind='element' namespace='##targetNamespace'"
+	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='generalConfiguration' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
+	 * @generated
+	 */
+	ProrGeneralConfiguration getGeneralConfiguration();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getGeneralConfiguration <em>General Configuration</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>General Configuration</em>' containment reference.
+	 * @see #isSetGeneralConfiguration()
+	 * @see #unsetGeneralConfiguration()
+	 * @see #getGeneralConfiguration()
+	 * @generated
+	 */
+	void setGeneralConfiguration(ProrGeneralConfiguration value);
+
+	/**
+	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getGeneralConfiguration <em>General Configuration</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSetGeneralConfiguration()
+	 * @see #getGeneralConfiguration()
+	 * @see #setGeneralConfiguration(ProrGeneralConfiguration)
+	 * @generated
+	 */
+	void unsetGeneralConfiguration();
+
+	/**
+	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getGeneralConfiguration <em>General Configuration</em>}' containment reference is set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em>General Configuration</em>' containment reference is set.
+	 * @see #unsetGeneralConfiguration()
+	 * @see #getGeneralConfiguration()
+	 * @see #setGeneralConfiguration(ProrGeneralConfiguration)
+	 * @generated
+	 */
+	boolean isSetGeneralConfiguration();
+
+	/**
+	 * Returns the value of the '<em><b>Presentation Configurations</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Presentation Configurations</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Presentation Configurations</em>' containment reference.
+	 * @see #isSetPresentationConfigurations()
+	 * @see #unsetPresentationConfigurations()
+	 * @see #setPresentationConfigurations(ProrPresentationConfigurations)
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getProrToolExtension_PresentationConfigurations()
+	 * @model containment="true" unsettable="true" required="true"
+	 *        extendedMetaData="name='presentationConfigurations' kind='element' namespace='##targetNamespace'"
+	 *        annotation="http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData wrapperName='presentationConfigurations' featureWrapperElement='true' featureElement='false' classifierWrapperElement='false' classifierElement='true'"
+	 * @generated
+	 */
+	ProrPresentationConfigurations getPresentationConfigurations();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getPresentationConfigurations <em>Presentation Configurations</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Presentation Configurations</em>' containment reference.
+	 * @see #isSetPresentationConfigurations()
+	 * @see #unsetPresentationConfigurations()
+	 * @see #getPresentationConfigurations()
+	 * @generated
+	 */
+	void setPresentationConfigurations(ProrPresentationConfigurations value);
+
+	/**
+	 * Unsets the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getPresentationConfigurations <em>Presentation Configurations</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSetPresentationConfigurations()
+	 * @see #getPresentationConfigurations()
+	 * @see #setPresentationConfigurations(ProrPresentationConfigurations)
+	 * @generated
+	 */
+	void unsetPresentationConfigurations();
+
+	/**
+	 * Returns whether the value of the '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension#getPresentationConfigurations <em>Presentation Configurations</em>}' containment reference is set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return whether the value of the '<em>Presentation Configurations</em>' containment reference is set.
+	 * @see #unsetPresentationConfigurations()
+	 * @see #getPresentationConfigurations()
+	 * @see #setPresentationConfigurations(ProrPresentationConfigurations)
+	 * @generated
+	 */
+	boolean isSetPresentationConfigurations();
+
+} // ProrToolExtension
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/UnifiedColumn.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/UnifiedColumn.java
new file mode 100644
index 0000000..0fdd17a
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/UnifiedColumn.java
@@ -0,0 +1,17 @@
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Unified Column</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#getUnifiedColumn()
+ * @model
+ * @generated
+ */
+public interface UnifiedColumn extends Column {
+} // UnifiedColumn
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ColumnImpl.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ColumnImpl.java
index 0299cb5..2452c35 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ColumnImpl.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ColumnImpl.java
@@ -1,291 +1,285 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.rmf.reqif10.pror.configuration.Column;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Column</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ColumnImpl#getLabel <em>Label</em>}</li>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ColumnImpl#getWidth <em>Width</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ColumnImpl extends EObjectImpl implements Column {
-	/**
-	 * The default value of the '{@link #getLabel() <em>Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLabel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LABEL_EDEFAULT = "<PLEASE SET LABEL>";
-
-	/**
-	 * The cached value of the '{@link #getLabel() <em>Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLabel()
-	 * @generated
-	 * @ordered
-	 */
-	protected String label = LABEL_EDEFAULT;
-
-	/**
-	 * This is true if the Label attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean labelESet;
-
-	/**
-	 * The default value of the '{@link #getWidth() <em>Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int WIDTH_EDEFAULT = 100;
-
-	/**
-	 * The cached value of the '{@link #getWidth() <em>Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected int width = WIDTH_EDEFAULT;
-
-	/**
-	 * This is true if the Width attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean widthESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ColumnImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigurationPackage.Literals.COLUMN;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLabel() {
-		return label;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLabel(String newLabel) {
-		String oldLabel = label;
-		label = newLabel;
-		boolean oldLabelESet = labelESet;
-		labelESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.COLUMN__LABEL, oldLabel, label, !oldLabelESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetLabel() {
-		String oldLabel = label;
-		boolean oldLabelESet = labelESet;
-		label = LABEL_EDEFAULT;
-		labelESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.COLUMN__LABEL, oldLabel, LABEL_EDEFAULT, oldLabelESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetLabel() {
-		return labelESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getWidth() {
-		return width;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWidth(int newWidth) {
-		int oldWidth = width;
-		width = newWidth;
-		boolean oldWidthESet = widthESet;
-		widthESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.COLUMN__WIDTH, oldWidth, width, !oldWidthESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetWidth() {
-		int oldWidth = width;
-		boolean oldWidthESet = widthESet;
-		width = WIDTH_EDEFAULT;
-		widthESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.COLUMN__WIDTH, oldWidth, WIDTH_EDEFAULT, oldWidthESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetWidth() {
-		return widthESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ConfigurationPackage.COLUMN__LABEL:
-				return getLabel();
-			case ConfigurationPackage.COLUMN__WIDTH:
-				return getWidth();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ConfigurationPackage.COLUMN__LABEL:
-				setLabel((String)newValue);
-				return;
-			case ConfigurationPackage.COLUMN__WIDTH:
-				setWidth((Integer)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.COLUMN__LABEL:
-				unsetLabel();
-				return;
-			case ConfigurationPackage.COLUMN__WIDTH:
-				unsetWidth();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.COLUMN__LABEL:
-				return isSetLabel();
-			case ConfigurationPackage.COLUMN__WIDTH:
-				return isSetWidth();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (label: ");
-		if (labelESet) result.append(label); else result.append("<unset>");
-		result.append(", width: ");
-		if (widthESet) result.append(width); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //ColumnImpl
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.rmf.reqif10.pror.configuration.Column;
+import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Column</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ColumnImpl#getLabel <em>Label</em>}</li>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ColumnImpl#getWidth <em>Width</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ColumnImpl extends EObjectImpl implements Column {
+	/**
+	 * The default value of the '{@link #getLabel() <em>Label</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLabel()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String LABEL_EDEFAULT = "<PLEASE SET LABEL>";
+
+	/**
+	 * The cached value of the '{@link #getLabel() <em>Label</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLabel()
+	 * @generated
+	 * @ordered
+	 */
+	protected String label = LABEL_EDEFAULT;
+
+	/**
+	 * This is true if the Label attribute has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean labelESet;
+
+	/**
+	 * The default value of the '{@link #getWidth() <em>Width</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getWidth()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int WIDTH_EDEFAULT = 100;
+
+	/**
+	 * The cached value of the '{@link #getWidth() <em>Width</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getWidth()
+	 * @generated
+	 * @ordered
+	 */
+	protected int width = WIDTH_EDEFAULT;
+
+	/**
+	 * This is true if the Width attribute has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean widthESet;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ColumnImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ConfigurationPackage.Literals.COLUMN;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLabel() {
+		return label;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLabel(String newLabel) {
+		String oldLabel = label;
+		label = newLabel;
+		boolean oldLabelESet = labelESet;
+		labelESet = true;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.COLUMN__LABEL, oldLabel, label, !oldLabelESet));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetLabel() {
+		String oldLabel = label;
+		boolean oldLabelESet = labelESet;
+		label = LABEL_EDEFAULT;
+		labelESet = false;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.COLUMN__LABEL, oldLabel, LABEL_EDEFAULT, oldLabelESet));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetLabel() {
+		return labelESet;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getWidth() {
+		return width;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setWidth(int newWidth) {
+		int oldWidth = width;
+		width = newWidth;
+		boolean oldWidthESet = widthESet;
+		widthESet = true;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.COLUMN__WIDTH, oldWidth, width, !oldWidthESet));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetWidth() {
+		int oldWidth = width;
+		boolean oldWidthESet = widthESet;
+		width = WIDTH_EDEFAULT;
+		widthESet = false;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.COLUMN__WIDTH, oldWidth, WIDTH_EDEFAULT, oldWidthESet));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetWidth() {
+		return widthESet;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ConfigurationPackage.COLUMN__LABEL:
+				return getLabel();
+			case ConfigurationPackage.COLUMN__WIDTH:
+				return getWidth();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ConfigurationPackage.COLUMN__LABEL:
+				setLabel((String)newValue);
+				return;
+			case ConfigurationPackage.COLUMN__WIDTH:
+				setWidth((Integer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.COLUMN__LABEL:
+				unsetLabel();
+				return;
+			case ConfigurationPackage.COLUMN__WIDTH:
+				unsetWidth();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.COLUMN__LABEL:
+				return isSetLabel();
+			case ConfigurationPackage.COLUMN__WIDTH:
+				return isSetWidth();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (label: ");
+		if (labelESet) result.append(label); else result.append("<unset>");
+		result.append(", width: ");
+		if (widthESet) result.append(width); else result.append("<unset>");
+		result.append(')');
+		return result.toString();
+	}
+
+} //ColumnImpl
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ConfigurationFactoryImpl.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ConfigurationFactoryImpl.java
index 7592504..f5251b7 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ConfigurationFactoryImpl.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ConfigurationFactoryImpl.java
@@ -1,163 +1,161 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.rmf.reqif10.pror.configuration.Column;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationFactory;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
-import org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConfigurationFactoryImpl extends EFactoryImpl implements ConfigurationFactory {
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static ConfigurationFactory init() {
-		try {
-			ConfigurationFactory theConfigurationFactory = (ConfigurationFactory)EPackage.Registry.INSTANCE.getEFactory("http://eclipse.org/rmf/pror/toolextensions/1.0"); 
-			if (theConfigurationFactory != null) {
-				return theConfigurationFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new ConfigurationFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConfigurationFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case ConfigurationPackage.PROR_TOOL_EXTENSION: return createProrToolExtension();
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION: return createProrSpecViewConfiguration();
-			case ConfigurationPackage.COLUMN: return createColumn();
-			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS: return createProrPresentationConfigurations();
-			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION: return createProrGeneralConfiguration();
-			case ConfigurationPackage.LABEL_CONFIGURATION: return createLabelConfiguration();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProrToolExtension createProrToolExtension() {
-		ProrToolExtensionImpl prorToolExtension = new ProrToolExtensionImpl();
-		return prorToolExtension;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProrSpecViewConfiguration createProrSpecViewConfiguration() {
-		ProrSpecViewConfigurationImpl prorSpecViewConfiguration = new ProrSpecViewConfigurationImpl();
-		return prorSpecViewConfiguration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Column createColumn() {
-		ColumnImpl column = new ColumnImpl();
-		return column;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProrPresentationConfigurations createProrPresentationConfigurations() {
-		ProrPresentationConfigurationsImpl prorPresentationConfigurations = new ProrPresentationConfigurationsImpl();
-		return prorPresentationConfigurations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProrGeneralConfiguration createProrGeneralConfiguration() {
-		ProrGeneralConfigurationImpl prorGeneralConfiguration = new ProrGeneralConfigurationImpl();
-		return prorGeneralConfiguration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LabelConfiguration createLabelConfiguration() {
-		LabelConfigurationImpl labelConfiguration = new LabelConfigurationImpl();
-		return labelConfiguration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConfigurationPackage getConfigurationPackage() {
-		return (ConfigurationPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	@Deprecated
-	public static ConfigurationPackage getPackage() {
-		return ConfigurationPackage.eINSTANCE;
-	}
-
-} //ConfigFactoryImpl
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration.impl;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+import org.eclipse.rmf.reqif10.pror.configuration.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ConfigurationFactoryImpl extends EFactoryImpl implements ConfigurationFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static ConfigurationFactory init() {
+		try {
+			ConfigurationFactory theConfigurationFactory = (ConfigurationFactory)EPackage.Registry.INSTANCE.getEFactory(ConfigurationPackage.eNS_URI);
+			if (theConfigurationFactory != null) {
+				return theConfigurationFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new ConfigurationFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ConfigurationFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case ConfigurationPackage.PROR_TOOL_EXTENSION: return createProrToolExtension();
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION: return createProrSpecViewConfiguration();
+			case ConfigurationPackage.COLUMN: return createColumn();
+			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS: return createProrPresentationConfigurations();
+			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION: return createProrGeneralConfiguration();
+			case ConfigurationPackage.LABEL_CONFIGURATION: return createLabelConfiguration();
+			case ConfigurationPackage.UNIFIED_COLUMN: return createUnifiedColumn();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ProrToolExtension createProrToolExtension() {
+		ProrToolExtensionImpl prorToolExtension = new ProrToolExtensionImpl();
+		return prorToolExtension;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ProrSpecViewConfiguration createProrSpecViewConfiguration() {
+		ProrSpecViewConfigurationImpl prorSpecViewConfiguration = new ProrSpecViewConfigurationImpl();
+		return prorSpecViewConfiguration;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Column createColumn() {
+		ColumnImpl column = new ColumnImpl();
+		return column;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ProrPresentationConfigurations createProrPresentationConfigurations() {
+		ProrPresentationConfigurationsImpl prorPresentationConfigurations = new ProrPresentationConfigurationsImpl();
+		return prorPresentationConfigurations;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ProrGeneralConfiguration createProrGeneralConfiguration() {
+		ProrGeneralConfigurationImpl prorGeneralConfiguration = new ProrGeneralConfigurationImpl();
+		return prorGeneralConfiguration;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LabelConfiguration createLabelConfiguration() {
+		LabelConfigurationImpl labelConfiguration = new LabelConfigurationImpl();
+		return labelConfiguration;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public UnifiedColumn createUnifiedColumn() {
+		UnifiedColumnImpl unifiedColumn = new UnifiedColumnImpl();
+		return unifiedColumn;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ConfigurationPackage getConfigurationPackage() {
+		return (ConfigurationPackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static ConfigurationPackage getPackage() {
+		return ConfigurationPackage.eINSTANCE;
+	}
+
+} //ConfigurationFactoryImpl
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ConfigurationPackageImpl.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ConfigurationPackageImpl.java
index 29210fe..5241e2c 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ConfigurationPackageImpl.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ConfigurationPackageImpl.java
@@ -1,599 +1,616 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.emf.ecore.xml.namespace.XMLNamespacePackage;
-import org.eclipse.rmf.reqif10.ReqIF10Package;
-import org.eclipse.rmf.reqif10.impl.ReqIF10PackageImpl;
-import org.eclipse.rmf.reqif10.pror.configuration.Column;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationFactory;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
-import org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConfigurationPackageImpl extends EPackageImpl implements ConfigurationPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass prorToolExtensionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass prorSpecViewConfigurationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass columnEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass prorPresentationConfigurationsEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass prorPresentationConfigurationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass prorGeneralConfigurationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass labelConfigurationEClass = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private ConfigurationPackageImpl() {
-		super(eNS_URI, ConfigurationFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
-	 * 
-	 * <p>This method is used to initialize {@link ConfigurationPackage#eINSTANCE} when that field is accessed.
-	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static ConfigurationPackage init() {
-		if (isInited) return (ConfigurationPackage)EPackage.Registry.INSTANCE.getEPackage(ConfigurationPackage.eNS_URI);
-
-		// Obtain or create and register package
-		ConfigurationPackageImpl theConfigurationPackage = (ConfigurationPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof ConfigurationPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new ConfigurationPackageImpl());
-
-		isInited = true;
-
-		// Initialize simple dependencies
-		XMLNamespacePackage.eINSTANCE.eClass();
-
-		// Obtain or create and register interdependencies
-		ReqIF10PackageImpl theReqIF10Package = (ReqIF10PackageImpl)(EPackage.Registry.INSTANCE.getEPackage(ReqIF10Package.eNS_URI) instanceof ReqIF10PackageImpl ? EPackage.Registry.INSTANCE.getEPackage(ReqIF10Package.eNS_URI) : ReqIF10Package.eINSTANCE);
-
-		// Create package meta-data objects
-		theConfigurationPackage.createPackageContents();
-		theReqIF10Package.createPackageContents();
-
-		// Initialize created meta-data
-		theConfigurationPackage.initializePackageContents();
-		theReqIF10Package.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theConfigurationPackage.freeze();
-
-  
-		// Update the registry and return the package
-		EPackage.Registry.INSTANCE.put(ConfigurationPackage.eNS_URI, theConfigurationPackage);
-		return theConfigurationPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProrToolExtension() {
-		return prorToolExtensionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProrToolExtension_SpecViewConfigurations() {
-		return (EReference)prorToolExtensionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProrToolExtension_GeneralConfiguration() {
-		return (EReference)prorToolExtensionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProrToolExtension_PresentationConfigurations() {
-		return (EReference)prorToolExtensionEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProrSpecViewConfiguration() {
-		return prorSpecViewConfigurationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProrSpecViewConfiguration_Specification() {
-		return (EReference)prorSpecViewConfigurationEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProrSpecViewConfiguration_Columns() {
-		return (EReference)prorSpecViewConfigurationEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProrSpecViewConfiguration_LeftHeaderColumn() {
-		return (EReference)prorSpecViewConfigurationEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getColumn() {
-		return columnEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getColumn_Label() {
-		return (EAttribute)columnEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getColumn_Width() {
-		return (EAttribute)columnEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProrPresentationConfigurations() {
-		return prorPresentationConfigurationsEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProrPresentationConfigurations_PresentationConfigurations() {
-		return (EReference)prorPresentationConfigurationsEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProrPresentationConfiguration() {
-		return prorPresentationConfigurationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProrPresentationConfiguration_Datatype() {
-		return (EReference)prorPresentationConfigurationEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProrGeneralConfiguration() {
-		return prorGeneralConfigurationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProrGeneralConfiguration_LabelConfiguration() {
-		return (EReference)prorGeneralConfigurationEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLabelConfiguration() {
-		return labelConfigurationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLabelConfiguration_DefaultLabel() {
-		return (EAttribute)labelConfigurationEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConfigurationFactory getConfigurationFactory() {
-		return (ConfigurationFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		prorToolExtensionEClass = createEClass(PROR_TOOL_EXTENSION);
-		createEReference(prorToolExtensionEClass, PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS);
-		createEReference(prorToolExtensionEClass, PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION);
-		createEReference(prorToolExtensionEClass, PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS);
-
-		prorSpecViewConfigurationEClass = createEClass(PROR_SPEC_VIEW_CONFIGURATION);
-		createEReference(prorSpecViewConfigurationEClass, PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION);
-		createEReference(prorSpecViewConfigurationEClass, PROR_SPEC_VIEW_CONFIGURATION__COLUMNS);
-		createEReference(prorSpecViewConfigurationEClass, PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN);
-
-		columnEClass = createEClass(COLUMN);
-		createEAttribute(columnEClass, COLUMN__LABEL);
-		createEAttribute(columnEClass, COLUMN__WIDTH);
-
-		prorPresentationConfigurationsEClass = createEClass(PROR_PRESENTATION_CONFIGURATIONS);
-		createEReference(prorPresentationConfigurationsEClass, PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS);
-
-		prorPresentationConfigurationEClass = createEClass(PROR_PRESENTATION_CONFIGURATION);
-		createEReference(prorPresentationConfigurationEClass, PROR_PRESENTATION_CONFIGURATION__DATATYPE);
-
-		prorGeneralConfigurationEClass = createEClass(PROR_GENERAL_CONFIGURATION);
-		createEReference(prorGeneralConfigurationEClass, PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION);
-
-		labelConfigurationEClass = createEClass(LABEL_CONFIGURATION);
-		createEAttribute(labelConfigurationEClass, LABEL_CONFIGURATION__DEFAULT_LABEL);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Obtain other dependent packages
-		ReqIF10Package theReqIF10Package = (ReqIF10Package)EPackage.Registry.INSTANCE.getEPackage(ReqIF10Package.eNS_URI);
-
-		// Create type parameters
-
-		// Set bounds for type parameters
-
-		// Add supertypes to classes
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(prorToolExtensionEClass, ProrToolExtension.class, "ProrToolExtension", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getProrToolExtension_SpecViewConfigurations(), this.getProrSpecViewConfiguration(), null, "specViewConfigurations", null, 0, -1, ProrToolExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getProrToolExtension_GeneralConfiguration(), this.getProrGeneralConfiguration(), null, "generalConfiguration", null, 1, 1, ProrToolExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getProrToolExtension_PresentationConfigurations(), this.getProrPresentationConfigurations(), null, "presentationConfigurations", null, 1, 1, ProrToolExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(prorSpecViewConfigurationEClass, ProrSpecViewConfiguration.class, "ProrSpecViewConfiguration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getProrSpecViewConfiguration_Specification(), theReqIF10Package.getSpecification(), null, "specification", null, 1, 1, ProrSpecViewConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getProrSpecViewConfiguration_Columns(), this.getColumn(), null, "columns", null, 0, -1, ProrSpecViewConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getProrSpecViewConfiguration_LeftHeaderColumn(), this.getColumn(), null, "leftHeaderColumn", null, 1, 1, ProrSpecViewConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(columnEClass, Column.class, "Column", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getColumn_Label(), ecorePackage.getEString(), "label", "<PLEASE SET LABEL>", 1, 1, Column.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getColumn_Width(), ecorePackage.getEInt(), "width", "100", 1, 1, Column.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(prorPresentationConfigurationsEClass, ProrPresentationConfigurations.class, "ProrPresentationConfigurations", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getProrPresentationConfigurations_PresentationConfigurations(), this.getProrPresentationConfiguration(), null, "presentationConfigurations", null, 0, -1, ProrPresentationConfigurations.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(prorPresentationConfigurationEClass, ProrPresentationConfiguration.class, "ProrPresentationConfiguration", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getProrPresentationConfiguration_Datatype(), theReqIF10Package.getDatatypeDefinition(), null, "datatype", null, 1, 1, ProrPresentationConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(prorGeneralConfigurationEClass, ProrGeneralConfiguration.class, "ProrGeneralConfiguration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getProrGeneralConfiguration_LabelConfiguration(), this.getLabelConfiguration(), null, "labelConfiguration", null, 1, 1, ProrGeneralConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(labelConfigurationEClass, LabelConfiguration.class, "LabelConfiguration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getLabelConfiguration_DefaultLabel(), ecorePackage.getEString(), "defaultLabel", null, 0, -1, LabelConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-		// http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData
-		createXMLPersistenceMappingExtendedMetaDataAnnotations();
-	}
-
-	/**
-	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createExtendedMetaDataAnnotations() {
-		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		
-		addAnnotation
-		  (getProrToolExtension_SpecViewConfigurations(), 
-		   source, 
-		   new String[] {
-			 "name", "specViewConfigurations",
-			 "kind", "element",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getProrToolExtension_GeneralConfiguration(), 
-		   source, 
-		   new String[] {
-			 "name", "generalConfiguration",
-			 "kind", "element",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getProrToolExtension_PresentationConfigurations(), 
-		   source, 
-		   new String[] {
-			 "name", "presentationConfigurations",
-			 "kind", "element",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getProrSpecViewConfiguration_Columns(), 
-		   source, 
-		   new String[] {
-			 "name", "columns",
-			 "kind", "element",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getProrSpecViewConfiguration_LeftHeaderColumn(), 
-		   source, 
-		   new String[] {
-			 "name", "leftHeaderColumn",
-			 "kind", "element",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getProrPresentationConfigurations_PresentationConfigurations(), 
-		   source, 
-		   new String[] {
-			 "name", "presentationConfigurations",
-			 "kind", "element",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getProrGeneralConfiguration_LabelConfiguration(), 
-		   source, 
-		   new String[] {
-			 "name", "labelConfiguration",
-			 "kind", "element",
-			 "namespace", "##targetNamespace"
-		   });	
-	}
-
-	/**
-	 * Initializes the annotations for <b>http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createXMLPersistenceMappingExtendedMetaDataAnnotations() {
-		String source = "http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData";			
-		addAnnotation
-		  (getProrToolExtension_SpecViewConfigurations(), 
-		   source, 
-		   new String[] {
-			 "wrapperName", "specViewConfigurations",
-			 "featureWrapperElement", "true",
-			 "featureElement", "false",
-			 "classifierWrapperElement", "false",
-			 "classifierElement", "true"
-		   });			
-		addAnnotation
-		  (getProrToolExtension_GeneralConfiguration(), 
-		   source, 
-		   new String[] {
-			 "wrapperName", "generalConfiguration",
-			 "featureWrapperElement", "true",
-			 "featureElement", "false",
-			 "classifierWrapperElement", "false",
-			 "classifierElement", "true"
-		   });			
-		addAnnotation
-		  (getProrToolExtension_PresentationConfigurations(), 
-		   source, 
-		   new String[] {
-			 "wrapperName", "presentationConfigurations",
-			 "featureWrapperElement", "true",
-			 "featureElement", "false",
-			 "classifierWrapperElement", "false",
-			 "classifierElement", "true"
-		   });			
-		addAnnotation
-		  (getProrSpecViewConfiguration_Columns(), 
-		   source, 
-		   new String[] {
-			 "wrapperName", "columns",
-			 "featureWrapperElement", "true",
-			 "featureElement", "false",
-			 "classifierWrapperElement", "false",
-			 "classifierElement", "true"
-		   });			
-		addAnnotation
-		  (getProrSpecViewConfiguration_LeftHeaderColumn(), 
-		   source, 
-		   new String[] {
-			 "wrapperName", "leftHeaderColumn",
-			 "featureWrapperElement", "true",
-			 "featureElement", "false",
-			 "classifierWrapperElement", "false",
-			 "classifierElement", "true"
-		   });			
-		addAnnotation
-		  (getProrPresentationConfigurations_PresentationConfigurations(), 
-		   source, 
-		   new String[] {
-			 "wrapperName", "presentationConfigurations",
-			 "featureWrapperElement", "true",
-			 "featureElement", "false",
-			 "classifierWrapperElement", "false",
-			 "classifierElement", "true"
-		   });			
-		addAnnotation
-		  (getProrGeneralConfiguration_LabelConfiguration(), 
-		   source, 
-		   new String[] {
-			 "wrapperName", "labelConfiguration",
-			 "featureWrapperElement", "true",
-			 "featureElement", "false",
-			 "classifierWrapperElement", "false",
-			 "classifierElement", "true"
-		   });
-	}
-
-} //ConfigPackageImpl
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration.impl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+import org.eclipse.emf.ecore.xml.namespace.XMLNamespacePackage;
+
+import org.eclipse.rmf.reqif10.ReqIF10Package;
+
+import org.eclipse.rmf.reqif10.impl.ReqIF10PackageImpl;
+
+import org.eclipse.rmf.reqif10.pror.configuration.Column;
+import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationFactory;
+import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
+import org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension;
+import org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ConfigurationPackageImpl extends EPackageImpl implements ConfigurationPackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass prorToolExtensionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass prorSpecViewConfigurationEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass columnEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass prorPresentationConfigurationsEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass prorPresentationConfigurationEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass prorGeneralConfigurationEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass labelConfigurationEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass unifiedColumnEClass = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private ConfigurationPackageImpl() {
+		super(eNS_URI, ConfigurationFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link ConfigurationPackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static ConfigurationPackage init() {
+		if (isInited) return (ConfigurationPackage)EPackage.Registry.INSTANCE.getEPackage(ConfigurationPackage.eNS_URI);
+
+		// Obtain or create and register package
+		ConfigurationPackageImpl theConfigurationPackage = (ConfigurationPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof ConfigurationPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new ConfigurationPackageImpl());
+
+		isInited = true;
+
+		// Initialize simple dependencies
+		XMLNamespacePackage.eINSTANCE.eClass();
+
+		// Obtain or create and register interdependencies
+		ReqIF10PackageImpl theReqIF10Package = (ReqIF10PackageImpl)(EPackage.Registry.INSTANCE.getEPackage(ReqIF10Package.eNS_URI) instanceof ReqIF10PackageImpl ? EPackage.Registry.INSTANCE.getEPackage(ReqIF10Package.eNS_URI) : ReqIF10Package.eINSTANCE);
+
+		// Create package meta-data objects
+		theConfigurationPackage.createPackageContents();
+		theReqIF10Package.createPackageContents();
+
+		// Initialize created meta-data
+		theConfigurationPackage.initializePackageContents();
+		theReqIF10Package.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theConfigurationPackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(ConfigurationPackage.eNS_URI, theConfigurationPackage);
+		return theConfigurationPackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getProrToolExtension() {
+		return prorToolExtensionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getProrToolExtension_SpecViewConfigurations() {
+		return (EReference)prorToolExtensionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getProrToolExtension_GeneralConfiguration() {
+		return (EReference)prorToolExtensionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getProrToolExtension_PresentationConfigurations() {
+		return (EReference)prorToolExtensionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getProrSpecViewConfiguration() {
+		return prorSpecViewConfigurationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getProrSpecViewConfiguration_Specification() {
+		return (EReference)prorSpecViewConfigurationEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getProrSpecViewConfiguration_Columns() {
+		return (EReference)prorSpecViewConfigurationEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getProrSpecViewConfiguration_LeftHeaderColumn() {
+		return (EReference)prorSpecViewConfigurationEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getColumn() {
+		return columnEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getColumn_Label() {
+		return (EAttribute)columnEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getColumn_Width() {
+		return (EAttribute)columnEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getProrPresentationConfigurations() {
+		return prorPresentationConfigurationsEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getProrPresentationConfigurations_PresentationConfigurations() {
+		return (EReference)prorPresentationConfigurationsEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getProrPresentationConfiguration() {
+		return prorPresentationConfigurationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getProrPresentationConfiguration_Datatype() {
+		return (EReference)prorPresentationConfigurationEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getProrGeneralConfiguration() {
+		return prorGeneralConfigurationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getProrGeneralConfiguration_LabelConfiguration() {
+		return (EReference)prorGeneralConfigurationEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLabelConfiguration() {
+		return labelConfigurationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLabelConfiguration_DefaultLabel() {
+		return (EAttribute)labelConfigurationEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getUnifiedColumn() {
+		return unifiedColumnEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ConfigurationFactory getConfigurationFactory() {
+		return (ConfigurationFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		prorToolExtensionEClass = createEClass(PROR_TOOL_EXTENSION);
+		createEReference(prorToolExtensionEClass, PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS);
+		createEReference(prorToolExtensionEClass, PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION);
+		createEReference(prorToolExtensionEClass, PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS);
+
+		prorSpecViewConfigurationEClass = createEClass(PROR_SPEC_VIEW_CONFIGURATION);
+		createEReference(prorSpecViewConfigurationEClass, PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION);
+		createEReference(prorSpecViewConfigurationEClass, PROR_SPEC_VIEW_CONFIGURATION__COLUMNS);
+		createEReference(prorSpecViewConfigurationEClass, PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN);
+
+		columnEClass = createEClass(COLUMN);
+		createEAttribute(columnEClass, COLUMN__LABEL);
+		createEAttribute(columnEClass, COLUMN__WIDTH);
+
+		prorPresentationConfigurationsEClass = createEClass(PROR_PRESENTATION_CONFIGURATIONS);
+		createEReference(prorPresentationConfigurationsEClass, PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS);
+
+		prorPresentationConfigurationEClass = createEClass(PROR_PRESENTATION_CONFIGURATION);
+		createEReference(prorPresentationConfigurationEClass, PROR_PRESENTATION_CONFIGURATION__DATATYPE);
+
+		prorGeneralConfigurationEClass = createEClass(PROR_GENERAL_CONFIGURATION);
+		createEReference(prorGeneralConfigurationEClass, PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION);
+
+		labelConfigurationEClass = createEClass(LABEL_CONFIGURATION);
+		createEAttribute(labelConfigurationEClass, LABEL_CONFIGURATION__DEFAULT_LABEL);
+
+		unifiedColumnEClass = createEClass(UNIFIED_COLUMN);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Obtain other dependent packages
+		ReqIF10Package theReqIF10Package = (ReqIF10Package)EPackage.Registry.INSTANCE.getEPackage(ReqIF10Package.eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		unifiedColumnEClass.getESuperTypes().add(this.getColumn());
+
+		// Initialize classes and features; add operations and parameters
+		initEClass(prorToolExtensionEClass, ProrToolExtension.class, "ProrToolExtension", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getProrToolExtension_SpecViewConfigurations(), this.getProrSpecViewConfiguration(), null, "specViewConfigurations", null, 0, -1, ProrToolExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getProrToolExtension_GeneralConfiguration(), this.getProrGeneralConfiguration(), null, "generalConfiguration", null, 1, 1, ProrToolExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getProrToolExtension_PresentationConfigurations(), this.getProrPresentationConfigurations(), null, "presentationConfigurations", null, 1, 1, ProrToolExtension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(prorSpecViewConfigurationEClass, ProrSpecViewConfiguration.class, "ProrSpecViewConfiguration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getProrSpecViewConfiguration_Specification(), theReqIF10Package.getSpecification(), null, "specification", null, 1, 1, ProrSpecViewConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getProrSpecViewConfiguration_Columns(), this.getColumn(), null, "columns", null, 0, -1, ProrSpecViewConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getProrSpecViewConfiguration_LeftHeaderColumn(), this.getColumn(), null, "leftHeaderColumn", null, 1, 1, ProrSpecViewConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(columnEClass, Column.class, "Column", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getColumn_Label(), ecorePackage.getEString(), "label", "<PLEASE SET LABEL>", 1, 1, Column.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getColumn_Width(), ecorePackage.getEInt(), "width", "100", 1, 1, Column.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(prorPresentationConfigurationsEClass, ProrPresentationConfigurations.class, "ProrPresentationConfigurations", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getProrPresentationConfigurations_PresentationConfigurations(), this.getProrPresentationConfiguration(), null, "presentationConfigurations", null, 0, -1, ProrPresentationConfigurations.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(prorPresentationConfigurationEClass, ProrPresentationConfiguration.class, "ProrPresentationConfiguration", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getProrPresentationConfiguration_Datatype(), theReqIF10Package.getDatatypeDefinition(), null, "datatype", null, 1, 1, ProrPresentationConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(prorGeneralConfigurationEClass, ProrGeneralConfiguration.class, "ProrGeneralConfiguration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getProrGeneralConfiguration_LabelConfiguration(), this.getLabelConfiguration(), null, "labelConfiguration", null, 1, 1, ProrGeneralConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(labelConfigurationEClass, LabelConfiguration.class, "LabelConfiguration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLabelConfiguration_DefaultLabel(), ecorePackage.getEString(), "defaultLabel", null, 0, -1, LabelConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(unifiedColumnEClass, UnifiedColumn.class, "UnifiedColumn", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		// Create resource
+		createResource(eNS_URI);
+
+		// Create annotations
+		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
+		createExtendedMetaDataAnnotations();
+		// http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData
+		createXMLPersistenceMappingExtendedMetaDataAnnotations();
+	}
+
+	/**
+	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void createExtendedMetaDataAnnotations() {
+		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";	
+		addAnnotation
+		  (getProrToolExtension_SpecViewConfigurations(), 
+		   source, 
+		   new String[] {
+			 "name", "specViewConfigurations",
+			 "kind", "element",
+			 "namespace", "##targetNamespace"
+		   });	
+		addAnnotation
+		  (getProrToolExtension_GeneralConfiguration(), 
+		   source, 
+		   new String[] {
+			 "name", "generalConfiguration",
+			 "kind", "element",
+			 "namespace", "##targetNamespace"
+		   });	
+		addAnnotation
+		  (getProrToolExtension_PresentationConfigurations(), 
+		   source, 
+		   new String[] {
+			 "name", "presentationConfigurations",
+			 "kind", "element",
+			 "namespace", "##targetNamespace"
+		   });	
+		addAnnotation
+		  (getProrSpecViewConfiguration_Columns(), 
+		   source, 
+		   new String[] {
+			 "name", "columns",
+			 "kind", "element",
+			 "namespace", "##targetNamespace"
+		   });	
+		addAnnotation
+		  (getProrSpecViewConfiguration_LeftHeaderColumn(), 
+		   source, 
+		   new String[] {
+			 "name", "leftHeaderColumn",
+			 "kind", "element",
+			 "namespace", "##targetNamespace"
+		   });	
+		addAnnotation
+		  (getProrPresentationConfigurations_PresentationConfigurations(), 
+		   source, 
+		   new String[] {
+			 "name", "presentationConfigurations",
+			 "kind", "element",
+			 "namespace", "##targetNamespace"
+		   });	
+		addAnnotation
+		  (getProrGeneralConfiguration_LabelConfiguration(), 
+		   source, 
+		   new String[] {
+			 "name", "labelConfiguration",
+			 "kind", "element",
+			 "namespace", "##targetNamespace"
+		   });
+	}
+
+	/**
+	 * Initializes the annotations for <b>http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData</b>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void createXMLPersistenceMappingExtendedMetaDataAnnotations() {
+		String source = "http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData";	
+		addAnnotation
+		  (getProrToolExtension_SpecViewConfigurations(), 
+		   source, 
+		   new String[] {
+			 "wrapperName", "specViewConfigurations",
+			 "featureWrapperElement", "true",
+			 "featureElement", "false",
+			 "classifierWrapperElement", "false",
+			 "classifierElement", "true"
+		   });	
+		addAnnotation
+		  (getProrToolExtension_GeneralConfiguration(), 
+		   source, 
+		   new String[] {
+			 "wrapperName", "generalConfiguration",
+			 "featureWrapperElement", "true",
+			 "featureElement", "false",
+			 "classifierWrapperElement", "false",
+			 "classifierElement", "true"
+		   });	
+		addAnnotation
+		  (getProrToolExtension_PresentationConfigurations(), 
+		   source, 
+		   new String[] {
+			 "wrapperName", "presentationConfigurations",
+			 "featureWrapperElement", "true",
+			 "featureElement", "false",
+			 "classifierWrapperElement", "false",
+			 "classifierElement", "true"
+		   });	
+		addAnnotation
+		  (getProrSpecViewConfiguration_Columns(), 
+		   source, 
+		   new String[] {
+			 "wrapperName", "columns",
+			 "featureWrapperElement", "true",
+			 "featureElement", "false",
+			 "classifierWrapperElement", "false",
+			 "classifierElement", "true"
+		   });	
+		addAnnotation
+		  (getProrSpecViewConfiguration_LeftHeaderColumn(), 
+		   source, 
+		   new String[] {
+			 "wrapperName", "leftHeaderColumn",
+			 "featureWrapperElement", "true",
+			 "featureElement", "false",
+			 "classifierWrapperElement", "false",
+			 "classifierElement", "true"
+		   });	
+		addAnnotation
+		  (getProrPresentationConfigurations_PresentationConfigurations(), 
+		   source, 
+		   new String[] {
+			 "wrapperName", "presentationConfigurations",
+			 "featureWrapperElement", "true",
+			 "featureElement", "false",
+			 "classifierWrapperElement", "false",
+			 "classifierElement", "true"
+		   });	
+		addAnnotation
+		  (getProrGeneralConfiguration_LabelConfiguration(), 
+		   source, 
+		   new String[] {
+			 "wrapperName", "labelConfiguration",
+			 "featureWrapperElement", "true",
+			 "featureElement", "false",
+			 "classifierWrapperElement", "false",
+			 "classifierElement", "true"
+		   });
+	}
+
+} //ConfigurationPackageImpl
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/LabelConfigurationImpl.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/LabelConfigurationImpl.java
index efd7fde..6b4ecdc 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/LabelConfigurationImpl.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/LabelConfigurationImpl.java
@@ -1,173 +1,168 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
-import org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Label Configuration</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.LabelConfigurationImpl#getDefaultLabel <em>Default Label</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LabelConfigurationImpl extends EObjectImpl implements LabelConfiguration {
-	/**
-	 * The cached value of the '{@link #getDefaultLabel() <em>Default Label</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultLabel()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<String> defaultLabel;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LabelConfigurationImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigurationPackage.Literals.LABEL_CONFIGURATION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList<String> getDefaultLabel() {
-		if (defaultLabel == null) {
-			defaultLabel = new EDataTypeUniqueEList.Unsettable<String>(String.class, this, ConfigurationPackage.LABEL_CONFIGURATION__DEFAULT_LABEL);
-		}
-		return defaultLabel;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetDefaultLabel() {
-		if (defaultLabel != null) ((InternalEList.Unsettable<?>)defaultLabel).unset();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetDefaultLabel() {
-		return defaultLabel != null && ((InternalEList.Unsettable<?>)defaultLabel).isSet();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ConfigurationPackage.LABEL_CONFIGURATION__DEFAULT_LABEL:
-				return getDefaultLabel();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ConfigurationPackage.LABEL_CONFIGURATION__DEFAULT_LABEL:
-				getDefaultLabel().clear();
-				getDefaultLabel().addAll((Collection<? extends String>)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.LABEL_CONFIGURATION__DEFAULT_LABEL:
-				unsetDefaultLabel();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.LABEL_CONFIGURATION__DEFAULT_LABEL:
-				return isSetDefaultLabel();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (defaultLabel: ");
-		result.append(defaultLabel);
-		result.append(')');
-		return result.toString();
-	}
-
-} //LabelConfigurationImpl
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
+import org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Label Configuration</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.LabelConfigurationImpl#getDefaultLabel <em>Default Label</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class LabelConfigurationImpl extends EObjectImpl implements LabelConfiguration {
+	/**
+	 * The cached value of the '{@link #getDefaultLabel() <em>Default Label</em>}' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDefaultLabel()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<String> defaultLabel;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LabelConfigurationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ConfigurationPackage.Literals.LABEL_CONFIGURATION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<String> getDefaultLabel() {
+		if (defaultLabel == null) {
+			defaultLabel = new EDataTypeUniqueEList.Unsettable<String>(String.class, this, ConfigurationPackage.LABEL_CONFIGURATION__DEFAULT_LABEL);
+		}
+		return defaultLabel;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetDefaultLabel() {
+		if (defaultLabel != null) ((InternalEList.Unsettable<?>)defaultLabel).unset();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetDefaultLabel() {
+		return defaultLabel != null && ((InternalEList.Unsettable<?>)defaultLabel).isSet();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ConfigurationPackage.LABEL_CONFIGURATION__DEFAULT_LABEL:
+				return getDefaultLabel();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ConfigurationPackage.LABEL_CONFIGURATION__DEFAULT_LABEL:
+				getDefaultLabel().clear();
+				getDefaultLabel().addAll((Collection<? extends String>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.LABEL_CONFIGURATION__DEFAULT_LABEL:
+				unsetDefaultLabel();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.LABEL_CONFIGURATION__DEFAULT_LABEL:
+				return isSetDefaultLabel();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (defaultLabel: ");
+		result.append(defaultLabel);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LabelConfigurationImpl
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrGeneralConfigurationImpl.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrGeneralConfigurationImpl.java
index 28013c0..252f4b1 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrGeneralConfigurationImpl.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrGeneralConfigurationImpl.java
@@ -1,243 +1,237 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
-import org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Pror General Configuration</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrGeneralConfigurationImpl#getLabelConfiguration <em>Label Configuration</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProrGeneralConfigurationImpl extends EObjectImpl implements ProrGeneralConfiguration {
-	/**
-	 * The cached value of the '{@link #getLabelConfiguration() <em>Label Configuration</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLabelConfiguration()
-	 * @generated
-	 * @ordered
-	 */
-	protected LabelConfiguration labelConfiguration;
-
-	/**
-	 * This is true if the Label Configuration containment reference has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean labelConfigurationESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProrGeneralConfigurationImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigurationPackage.Literals.PROR_GENERAL_CONFIGURATION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LabelConfiguration getLabelConfiguration() {
-		return labelConfiguration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetLabelConfiguration(LabelConfiguration newLabelConfiguration, NotificationChain msgs) {
-		LabelConfiguration oldLabelConfiguration = labelConfiguration;
-		labelConfiguration = newLabelConfiguration;
-		boolean oldLabelConfigurationESet = labelConfigurationESet;
-		labelConfigurationESet = true;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, oldLabelConfiguration, newLabelConfiguration, !oldLabelConfigurationESet);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLabelConfiguration(LabelConfiguration newLabelConfiguration) {
-		if (newLabelConfiguration != labelConfiguration) {
-			NotificationChain msgs = null;
-			if (labelConfiguration != null)
-				msgs = ((InternalEObject)labelConfiguration).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, null, msgs);
-			if (newLabelConfiguration != null)
-				msgs = ((InternalEObject)newLabelConfiguration).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, null, msgs);
-			msgs = basicSetLabelConfiguration(newLabelConfiguration, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else {
-			boolean oldLabelConfigurationESet = labelConfigurationESet;
-			labelConfigurationESet = true;
-			if (eNotificationRequired())
-				eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, newLabelConfiguration, newLabelConfiguration, !oldLabelConfigurationESet));
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicUnsetLabelConfiguration(NotificationChain msgs) {
-		LabelConfiguration oldLabelConfiguration = labelConfiguration;
-		labelConfiguration = null;
-		boolean oldLabelConfigurationESet = labelConfigurationESet;
-		labelConfigurationESet = false;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, oldLabelConfiguration, null, oldLabelConfigurationESet);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetLabelConfiguration() {
-		if (labelConfiguration != null) {
-			NotificationChain msgs = null;
-			msgs = ((InternalEObject)labelConfiguration).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, null, msgs);
-			msgs = basicUnsetLabelConfiguration(msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else {
-			boolean oldLabelConfigurationESet = labelConfigurationESet;
-			labelConfigurationESet = false;
-			if (eNotificationRequired())
-				eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, null, null, oldLabelConfigurationESet));
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetLabelConfiguration() {
-		return labelConfigurationESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION:
-				return basicUnsetLabelConfiguration(msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION:
-				return getLabelConfiguration();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION:
-				setLabelConfiguration((LabelConfiguration)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION:
-				unsetLabelConfiguration();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION:
-				return isSetLabelConfiguration();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ProrGeneralConfigurationImpl
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
+import org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Pror General Configuration</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrGeneralConfigurationImpl#getLabelConfiguration <em>Label Configuration</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ProrGeneralConfigurationImpl extends EObjectImpl implements ProrGeneralConfiguration {
+	/**
+	 * The cached value of the '{@link #getLabelConfiguration() <em>Label Configuration</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLabelConfiguration()
+	 * @generated
+	 * @ordered
+	 */
+	protected LabelConfiguration labelConfiguration;
+
+	/**
+	 * This is true if the Label Configuration containment reference has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean labelConfigurationESet;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ProrGeneralConfigurationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ConfigurationPackage.Literals.PROR_GENERAL_CONFIGURATION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LabelConfiguration getLabelConfiguration() {
+		return labelConfiguration;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetLabelConfiguration(LabelConfiguration newLabelConfiguration, NotificationChain msgs) {
+		LabelConfiguration oldLabelConfiguration = labelConfiguration;
+		labelConfiguration = newLabelConfiguration;
+		boolean oldLabelConfigurationESet = labelConfigurationESet;
+		labelConfigurationESet = true;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, oldLabelConfiguration, newLabelConfiguration, !oldLabelConfigurationESet);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLabelConfiguration(LabelConfiguration newLabelConfiguration) {
+		if (newLabelConfiguration != labelConfiguration) {
+			NotificationChain msgs = null;
+			if (labelConfiguration != null)
+				msgs = ((InternalEObject)labelConfiguration).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, null, msgs);
+			if (newLabelConfiguration != null)
+				msgs = ((InternalEObject)newLabelConfiguration).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, null, msgs);
+			msgs = basicSetLabelConfiguration(newLabelConfiguration, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else {
+			boolean oldLabelConfigurationESet = labelConfigurationESet;
+			labelConfigurationESet = true;
+			if (eNotificationRequired())
+				eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, newLabelConfiguration, newLabelConfiguration, !oldLabelConfigurationESet));
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicUnsetLabelConfiguration(NotificationChain msgs) {
+		LabelConfiguration oldLabelConfiguration = labelConfiguration;
+		labelConfiguration = null;
+		boolean oldLabelConfigurationESet = labelConfigurationESet;
+		labelConfigurationESet = false;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, oldLabelConfiguration, null, oldLabelConfigurationESet);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetLabelConfiguration() {
+		if (labelConfiguration != null) {
+			NotificationChain msgs = null;
+			msgs = ((InternalEObject)labelConfiguration).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, null, msgs);
+			msgs = basicUnsetLabelConfiguration(msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else {
+			boolean oldLabelConfigurationESet = labelConfigurationESet;
+			labelConfigurationESet = false;
+			if (eNotificationRequired())
+				eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION, null, null, oldLabelConfigurationESet));
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetLabelConfiguration() {
+		return labelConfigurationESet;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION:
+				return basicUnsetLabelConfiguration(msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION:
+				return getLabelConfiguration();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION:
+				setLabelConfiguration((LabelConfiguration)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION:
+				unsetLabelConfiguration();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION__LABEL_CONFIGURATION:
+				return isSetLabelConfiguration();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ProrGeneralConfigurationImpl
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrPresentationConfigurationImpl.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrPresentationConfigurationImpl.java
index 338dbc2..afff36e 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrPresentationConfigurationImpl.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrPresentationConfigurationImpl.java
@@ -1,198 +1,192 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.rmf.reqif10.DatatypeDefinition;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Pror Presentation Configuration</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationImpl#getDatatype <em>Datatype</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class ProrPresentationConfigurationImpl extends EObjectImpl implements ProrPresentationConfiguration {
-	/**
-	 * The cached value of the '{@link #getDatatype() <em>Datatype</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDatatype()
-	 * @generated
-	 * @ordered
-	 */
-	protected DatatypeDefinition datatype;
-
-	/**
-	 * This is true if the Datatype reference has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean datatypeESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProrPresentationConfigurationImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigurationPackage.Literals.PROR_PRESENTATION_CONFIGURATION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DatatypeDefinition getDatatype() {
-		if (datatype != null && datatype.eIsProxy()) {
-			InternalEObject oldDatatype = (InternalEObject)datatype;
-			datatype = (DatatypeDefinition)eResolveProxy(oldDatatype);
-			if (datatype != oldDatatype) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE, oldDatatype, datatype));
-			}
-		}
-		return datatype;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DatatypeDefinition basicGetDatatype() {
-		return datatype;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDatatype(DatatypeDefinition newDatatype) {
-		DatatypeDefinition oldDatatype = datatype;
-		datatype = newDatatype;
-		boolean oldDatatypeESet = datatypeESet;
-		datatypeESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE, oldDatatype, datatype, !oldDatatypeESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetDatatype() {
-		DatatypeDefinition oldDatatype = datatype;
-		boolean oldDatatypeESet = datatypeESet;
-		datatype = null;
-		datatypeESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE, oldDatatype, null, oldDatatypeESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetDatatype() {
-		return datatypeESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE:
-				if (resolve) return getDatatype();
-				return basicGetDatatype();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE:
-				setDatatype((DatatypeDefinition)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE:
-				unsetDatatype();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE:
-				return isSetDatatype();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ProrPresentationConfigurationImpl
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.rmf.reqif10.DatatypeDefinition;
+
+import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Pror Presentation Configuration</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationImpl#getDatatype <em>Datatype</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public abstract class ProrPresentationConfigurationImpl extends EObjectImpl implements ProrPresentationConfiguration {
+	/**
+	 * The cached value of the '{@link #getDatatype() <em>Datatype</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDatatype()
+	 * @generated
+	 * @ordered
+	 */
+	protected DatatypeDefinition datatype;
+
+	/**
+	 * This is true if the Datatype reference has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean datatypeESet;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ProrPresentationConfigurationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ConfigurationPackage.Literals.PROR_PRESENTATION_CONFIGURATION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DatatypeDefinition getDatatype() {
+		if (datatype != null && datatype.eIsProxy()) {
+			InternalEObject oldDatatype = (InternalEObject)datatype;
+			datatype = (DatatypeDefinition)eResolveProxy(oldDatatype);
+			if (datatype != oldDatatype) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE, oldDatatype, datatype));
+			}
+		}
+		return datatype;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DatatypeDefinition basicGetDatatype() {
+		return datatype;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDatatype(DatatypeDefinition newDatatype) {
+		DatatypeDefinition oldDatatype = datatype;
+		datatype = newDatatype;
+		boolean oldDatatypeESet = datatypeESet;
+		datatypeESet = true;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE, oldDatatype, datatype, !oldDatatypeESet));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetDatatype() {
+		DatatypeDefinition oldDatatype = datatype;
+		boolean oldDatatypeESet = datatypeESet;
+		datatype = null;
+		datatypeESet = false;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE, oldDatatype, null, oldDatatypeESet));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetDatatype() {
+		return datatypeESet;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE:
+				if (resolve) return getDatatype();
+				return basicGetDatatype();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE:
+				setDatatype((DatatypeDefinition)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE:
+				unsetDatatype();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION__DATATYPE:
+				return isSetDatatype();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ProrPresentationConfigurationImpl
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrPresentationConfigurationsImpl.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrPresentationConfigurationsImpl.java
index e2eb43e..64dec86 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrPresentationConfigurationsImpl.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrPresentationConfigurationsImpl.java
@@ -1,174 +1,170 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Pror Presentation Configurations</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationsImpl#getPresentationConfigurations <em>Presentation Configurations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProrPresentationConfigurationsImpl extends EObjectImpl implements ProrPresentationConfigurations {
-	/**
-	 * The cached value of the '{@link #getPresentationConfigurations() <em>Presentation Configurations</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentationConfigurations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<ProrPresentationConfiguration> presentationConfigurations;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProrPresentationConfigurationsImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigurationPackage.Literals.PROR_PRESENTATION_CONFIGURATIONS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList<ProrPresentationConfiguration> getPresentationConfigurations() {
-		if (presentationConfigurations == null) {
-			presentationConfigurations = new EObjectContainmentEList.Unsettable<ProrPresentationConfiguration>(ProrPresentationConfiguration.class, this, ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS);
-		}
-		return presentationConfigurations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetPresentationConfigurations() {
-		if (presentationConfigurations != null) ((InternalEList.Unsettable<?>)presentationConfigurations).unset();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetPresentationConfigurations() {
-		return presentationConfigurations != null && ((InternalEList.Unsettable<?>)presentationConfigurations).isSet();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS:
-				return ((InternalEList<?>)getPresentationConfigurations()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS:
-				return getPresentationConfigurations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS:
-				getPresentationConfigurations().clear();
-				getPresentationConfigurations().addAll((Collection<? extends ProrPresentationConfiguration>)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS:
-				unsetPresentationConfigurations();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS:
-				return isSetPresentationConfigurations();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ProrPresentationConfigurationsImpl
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Pror Presentation Configurations</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrPresentationConfigurationsImpl#getPresentationConfigurations <em>Presentation Configurations</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ProrPresentationConfigurationsImpl extends EObjectImpl implements ProrPresentationConfigurations {
+	/**
+	 * The cached value of the '{@link #getPresentationConfigurations() <em>Presentation Configurations</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPresentationConfigurations()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<ProrPresentationConfiguration> presentationConfigurations;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ProrPresentationConfigurationsImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ConfigurationPackage.Literals.PROR_PRESENTATION_CONFIGURATIONS;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<ProrPresentationConfiguration> getPresentationConfigurations() {
+		if (presentationConfigurations == null) {
+			presentationConfigurations = new EObjectContainmentEList.Unsettable<ProrPresentationConfiguration>(ProrPresentationConfiguration.class, this, ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS);
+		}
+		return presentationConfigurations;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetPresentationConfigurations() {
+		if (presentationConfigurations != null) ((InternalEList.Unsettable<?>)presentationConfigurations).unset();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetPresentationConfigurations() {
+		return presentationConfigurations != null && ((InternalEList.Unsettable<?>)presentationConfigurations).isSet();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS:
+				return ((InternalEList<?>)getPresentationConfigurations()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS:
+				return getPresentationConfigurations();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS:
+				getPresentationConfigurations().clear();
+				getPresentationConfigurations().addAll((Collection<? extends ProrPresentationConfiguration>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS:
+				unsetPresentationConfigurations();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS__PRESENTATION_CONFIGURATIONS:
+				return isSetPresentationConfigurations();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ProrPresentationConfigurationsImpl
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrSpecViewConfigurationImpl.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrSpecViewConfigurationImpl.java
index 6797911..498c0fa 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrSpecViewConfigurationImpl.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrSpecViewConfigurationImpl.java
@@ -1,399 +1,395 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.rmf.reqif10.Specification;
-import org.eclipse.rmf.reqif10.pror.configuration.Column;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Pror Spec View Configuration</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl#getSpecification <em>Specification</em>}</li>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl#getColumns <em>Columns</em>}</li>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl#getLeftHeaderColumn <em>Left Header Column</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProrSpecViewConfigurationImpl extends EObjectImpl implements ProrSpecViewConfiguration {
-	/**
-	 * The cached value of the '{@link #getSpecification() <em>Specification</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSpecification()
-	 * @generated
-	 * @ordered
-	 */
-	protected Specification specification;
-
-	/**
-	 * This is true if the Specification reference has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean specificationESet;
-
-	/**
-	 * The cached value of the '{@link #getColumns() <em>Columns</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getColumns()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<Column> columns;
-
-	/**
-	 * The cached value of the '{@link #getLeftHeaderColumn() <em>Left Header Column</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLeftHeaderColumn()
-	 * @generated
-	 * @ordered
-	 */
-	protected Column leftHeaderColumn;
-
-	/**
-	 * This is true if the Left Header Column containment reference has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean leftHeaderColumnESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProrSpecViewConfigurationImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigurationPackage.Literals.PROR_SPEC_VIEW_CONFIGURATION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Specification getSpecification() {
-		if (specification != null && specification.eIsProxy()) {
-			InternalEObject oldSpecification = (InternalEObject)specification;
-			specification = (Specification)eResolveProxy(oldSpecification);
-			if (specification != oldSpecification) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION, oldSpecification, specification));
-			}
-		}
-		return specification;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Specification basicGetSpecification() {
-		return specification;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSpecification(Specification newSpecification) {
-		Specification oldSpecification = specification;
-		specification = newSpecification;
-		boolean oldSpecificationESet = specificationESet;
-		specificationESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION, oldSpecification, specification, !oldSpecificationESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetSpecification() {
-		Specification oldSpecification = specification;
-		boolean oldSpecificationESet = specificationESet;
-		specification = null;
-		specificationESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION, oldSpecification, null, oldSpecificationESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetSpecification() {
-		return specificationESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList<Column> getColumns() {
-		if (columns == null) {
-			columns = new EObjectContainmentEList.Unsettable<Column>(Column.class, this, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__COLUMNS);
-		}
-		return columns;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetColumns() {
-		if (columns != null) ((InternalEList.Unsettable<?>)columns).unset();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetColumns() {
-		return columns != null && ((InternalEList.Unsettable<?>)columns).isSet();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Column getLeftHeaderColumn() {
-		return leftHeaderColumn;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetLeftHeaderColumn(Column newLeftHeaderColumn, NotificationChain msgs) {
-		Column oldLeftHeaderColumn = leftHeaderColumn;
-		leftHeaderColumn = newLeftHeaderColumn;
-		boolean oldLeftHeaderColumnESet = leftHeaderColumnESet;
-		leftHeaderColumnESet = true;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, oldLeftHeaderColumn, newLeftHeaderColumn, !oldLeftHeaderColumnESet);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLeftHeaderColumn(Column newLeftHeaderColumn) {
-		if (newLeftHeaderColumn != leftHeaderColumn) {
-			NotificationChain msgs = null;
-			if (leftHeaderColumn != null)
-				msgs = ((InternalEObject)leftHeaderColumn).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, null, msgs);
-			if (newLeftHeaderColumn != null)
-				msgs = ((InternalEObject)newLeftHeaderColumn).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, null, msgs);
-			msgs = basicSetLeftHeaderColumn(newLeftHeaderColumn, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else {
-			boolean oldLeftHeaderColumnESet = leftHeaderColumnESet;
-			leftHeaderColumnESet = true;
-			if (eNotificationRequired())
-				eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, newLeftHeaderColumn, newLeftHeaderColumn, !oldLeftHeaderColumnESet));
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicUnsetLeftHeaderColumn(NotificationChain msgs) {
-		Column oldLeftHeaderColumn = leftHeaderColumn;
-		leftHeaderColumn = null;
-		boolean oldLeftHeaderColumnESet = leftHeaderColumnESet;
-		leftHeaderColumnESet = false;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, oldLeftHeaderColumn, null, oldLeftHeaderColumnESet);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetLeftHeaderColumn() {
-		if (leftHeaderColumn != null) {
-			NotificationChain msgs = null;
-			msgs = ((InternalEObject)leftHeaderColumn).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, null, msgs);
-			msgs = basicUnsetLeftHeaderColumn(msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else {
-			boolean oldLeftHeaderColumnESet = leftHeaderColumnESet;
-			leftHeaderColumnESet = false;
-			if (eNotificationRequired())
-				eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, null, null, oldLeftHeaderColumnESet));
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetLeftHeaderColumn() {
-		return leftHeaderColumnESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__COLUMNS:
-				return ((InternalEList<?>)getColumns()).basicRemove(otherEnd, msgs);
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN:
-				return basicUnsetLeftHeaderColumn(msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION:
-				if (resolve) return getSpecification();
-				return basicGetSpecification();
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__COLUMNS:
-				return getColumns();
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN:
-				return getLeftHeaderColumn();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION:
-				setSpecification((Specification)newValue);
-				return;
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__COLUMNS:
-				getColumns().clear();
-				getColumns().addAll((Collection<? extends Column>)newValue);
-				return;
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN:
-				setLeftHeaderColumn((Column)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION:
-				unsetSpecification();
-				return;
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__COLUMNS:
-				unsetColumns();
-				return;
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN:
-				unsetLeftHeaderColumn();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION:
-				return isSetSpecification();
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__COLUMNS:
-				return isSetColumns();
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN:
-				return isSetLeftHeaderColumn();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ProrSpecViewConfigurationImpl
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.rmf.reqif10.Specification;
+
+import org.eclipse.rmf.reqif10.pror.configuration.Column;
+import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Pror Spec View Configuration</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl#getSpecification <em>Specification</em>}</li>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl#getColumns <em>Columns</em>}</li>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrSpecViewConfigurationImpl#getLeftHeaderColumn <em>Left Header Column</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ProrSpecViewConfigurationImpl extends EObjectImpl implements ProrSpecViewConfiguration {
+	/**
+	 * The cached value of the '{@link #getSpecification() <em>Specification</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSpecification()
+	 * @generated
+	 * @ordered
+	 */
+	protected Specification specification;
+
+	/**
+	 * This is true if the Specification reference has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean specificationESet;
+
+	/**
+	 * The cached value of the '{@link #getColumns() <em>Columns</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getColumns()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Column> columns;
+
+	/**
+	 * The cached value of the '{@link #getLeftHeaderColumn() <em>Left Header Column</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLeftHeaderColumn()
+	 * @generated
+	 * @ordered
+	 */
+	protected Column leftHeaderColumn;
+
+	/**
+	 * This is true if the Left Header Column containment reference has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean leftHeaderColumnESet;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ProrSpecViewConfigurationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ConfigurationPackage.Literals.PROR_SPEC_VIEW_CONFIGURATION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Specification getSpecification() {
+		if (specification != null && specification.eIsProxy()) {
+			InternalEObject oldSpecification = (InternalEObject)specification;
+			specification = (Specification)eResolveProxy(oldSpecification);
+			if (specification != oldSpecification) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION, oldSpecification, specification));
+			}
+		}
+		return specification;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Specification basicGetSpecification() {
+		return specification;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSpecification(Specification newSpecification) {
+		Specification oldSpecification = specification;
+		specification = newSpecification;
+		boolean oldSpecificationESet = specificationESet;
+		specificationESet = true;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION, oldSpecification, specification, !oldSpecificationESet));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetSpecification() {
+		Specification oldSpecification = specification;
+		boolean oldSpecificationESet = specificationESet;
+		specification = null;
+		specificationESet = false;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION, oldSpecification, null, oldSpecificationESet));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetSpecification() {
+		return specificationESet;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Column> getColumns() {
+		if (columns == null) {
+			columns = new EObjectContainmentEList.Unsettable<Column>(Column.class, this, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__COLUMNS);
+		}
+		return columns;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetColumns() {
+		if (columns != null) ((InternalEList.Unsettable<?>)columns).unset();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetColumns() {
+		return columns != null && ((InternalEList.Unsettable<?>)columns).isSet();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Column getLeftHeaderColumn() {
+		return leftHeaderColumn;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetLeftHeaderColumn(Column newLeftHeaderColumn, NotificationChain msgs) {
+		Column oldLeftHeaderColumn = leftHeaderColumn;
+		leftHeaderColumn = newLeftHeaderColumn;
+		boolean oldLeftHeaderColumnESet = leftHeaderColumnESet;
+		leftHeaderColumnESet = true;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, oldLeftHeaderColumn, newLeftHeaderColumn, !oldLeftHeaderColumnESet);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLeftHeaderColumn(Column newLeftHeaderColumn) {
+		if (newLeftHeaderColumn != leftHeaderColumn) {
+			NotificationChain msgs = null;
+			if (leftHeaderColumn != null)
+				msgs = ((InternalEObject)leftHeaderColumn).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, null, msgs);
+			if (newLeftHeaderColumn != null)
+				msgs = ((InternalEObject)newLeftHeaderColumn).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, null, msgs);
+			msgs = basicSetLeftHeaderColumn(newLeftHeaderColumn, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else {
+			boolean oldLeftHeaderColumnESet = leftHeaderColumnESet;
+			leftHeaderColumnESet = true;
+			if (eNotificationRequired())
+				eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, newLeftHeaderColumn, newLeftHeaderColumn, !oldLeftHeaderColumnESet));
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicUnsetLeftHeaderColumn(NotificationChain msgs) {
+		Column oldLeftHeaderColumn = leftHeaderColumn;
+		leftHeaderColumn = null;
+		boolean oldLeftHeaderColumnESet = leftHeaderColumnESet;
+		leftHeaderColumnESet = false;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, oldLeftHeaderColumn, null, oldLeftHeaderColumnESet);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetLeftHeaderColumn() {
+		if (leftHeaderColumn != null) {
+			NotificationChain msgs = null;
+			msgs = ((InternalEObject)leftHeaderColumn).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, null, msgs);
+			msgs = basicUnsetLeftHeaderColumn(msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else {
+			boolean oldLeftHeaderColumnESet = leftHeaderColumnESet;
+			leftHeaderColumnESet = false;
+			if (eNotificationRequired())
+				eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN, null, null, oldLeftHeaderColumnESet));
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetLeftHeaderColumn() {
+		return leftHeaderColumnESet;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__COLUMNS:
+				return ((InternalEList<?>)getColumns()).basicRemove(otherEnd, msgs);
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN:
+				return basicUnsetLeftHeaderColumn(msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION:
+				if (resolve) return getSpecification();
+				return basicGetSpecification();
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__COLUMNS:
+				return getColumns();
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN:
+				return getLeftHeaderColumn();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION:
+				setSpecification((Specification)newValue);
+				return;
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__COLUMNS:
+				getColumns().clear();
+				getColumns().addAll((Collection<? extends Column>)newValue);
+				return;
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN:
+				setLeftHeaderColumn((Column)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION:
+				unsetSpecification();
+				return;
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__COLUMNS:
+				unsetColumns();
+				return;
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN:
+				unsetLeftHeaderColumn();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__SPECIFICATION:
+				return isSetSpecification();
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__COLUMNS:
+				return isSetColumns();
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION__LEFT_HEADER_COLUMN:
+				return isSetLeftHeaderColumn();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ProrSpecViewConfigurationImpl
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrToolExtensionImpl.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrToolExtensionImpl.java
index eb4e49b..162e5c4 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrToolExtensionImpl.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/ProrToolExtensionImpl.java
@@ -1,433 +1,428 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Pror Tool Extension</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl#getSpecViewConfigurations <em>Spec View Configurations</em>}</li>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl#getGeneralConfiguration <em>General Configuration</em>}</li>
- *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl#getPresentationConfigurations <em>Presentation Configurations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProrToolExtensionImpl extends EObjectImpl implements ProrToolExtension {
-	/**
-	 * The cached value of the '{@link #getSpecViewConfigurations() <em>Spec View Configurations</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSpecViewConfigurations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<ProrSpecViewConfiguration> specViewConfigurations;
-
-	/**
-	 * The cached value of the '{@link #getGeneralConfiguration() <em>General Configuration</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGeneralConfiguration()
-	 * @generated
-	 * @ordered
-	 */
-	protected ProrGeneralConfiguration generalConfiguration;
-
-	/**
-	 * This is true if the General Configuration containment reference has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean generalConfigurationESet;
-
-	/**
-	 * The cached value of the '{@link #getPresentationConfigurations() <em>Presentation Configurations</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentationConfigurations()
-	 * @generated
-	 * @ordered
-	 */
-	protected ProrPresentationConfigurations presentationConfigurations;
-
-	/**
-	 * This is true if the Presentation Configurations containment reference has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean presentationConfigurationsESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Set to public, so that the framework can instantiate this class.
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public ProrToolExtensionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigurationPackage.Literals.PROR_TOOL_EXTENSION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList<ProrSpecViewConfiguration> getSpecViewConfigurations() {
-		if (specViewConfigurations == null) {
-			specViewConfigurations = new EObjectContainmentEList.Unsettable<ProrSpecViewConfiguration>(ProrSpecViewConfiguration.class, this, ConfigurationPackage.PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS);
-		}
-		return specViewConfigurations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetSpecViewConfigurations() {
-		if (specViewConfigurations != null) ((InternalEList.Unsettable<?>)specViewConfigurations).unset();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetSpecViewConfigurations() {
-		return specViewConfigurations != null && ((InternalEList.Unsettable<?>)specViewConfigurations).isSet();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProrGeneralConfiguration getGeneralConfiguration() {
-		return generalConfiguration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetGeneralConfiguration(ProrGeneralConfiguration newGeneralConfiguration, NotificationChain msgs) {
-		ProrGeneralConfiguration oldGeneralConfiguration = generalConfiguration;
-		generalConfiguration = newGeneralConfiguration;
-		boolean oldGeneralConfigurationESet = generalConfigurationESet;
-		generalConfigurationESet = true;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, oldGeneralConfiguration, newGeneralConfiguration, !oldGeneralConfigurationESet);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGeneralConfiguration(ProrGeneralConfiguration newGeneralConfiguration) {
-		if (newGeneralConfiguration != generalConfiguration) {
-			NotificationChain msgs = null;
-			if (generalConfiguration != null)
-				msgs = ((InternalEObject)generalConfiguration).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, null, msgs);
-			if (newGeneralConfiguration != null)
-				msgs = ((InternalEObject)newGeneralConfiguration).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, null, msgs);
-			msgs = basicSetGeneralConfiguration(newGeneralConfiguration, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else {
-			boolean oldGeneralConfigurationESet = generalConfigurationESet;
-			generalConfigurationESet = true;
-			if (eNotificationRequired())
-				eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, newGeneralConfiguration, newGeneralConfiguration, !oldGeneralConfigurationESet));
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicUnsetGeneralConfiguration(NotificationChain msgs) {
-		ProrGeneralConfiguration oldGeneralConfiguration = generalConfiguration;
-		generalConfiguration = null;
-		boolean oldGeneralConfigurationESet = generalConfigurationESet;
-		generalConfigurationESet = false;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, oldGeneralConfiguration, null, oldGeneralConfigurationESet);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetGeneralConfiguration() {
-		if (generalConfiguration != null) {
-			NotificationChain msgs = null;
-			msgs = ((InternalEObject)generalConfiguration).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, null, msgs);
-			msgs = basicUnsetGeneralConfiguration(msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else {
-			boolean oldGeneralConfigurationESet = generalConfigurationESet;
-			generalConfigurationESet = false;
-			if (eNotificationRequired())
-				eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, null, null, oldGeneralConfigurationESet));
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetGeneralConfiguration() {
-		return generalConfigurationESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProrPresentationConfigurations getPresentationConfigurations() {
-		return presentationConfigurations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPresentationConfigurations(ProrPresentationConfigurations newPresentationConfigurations, NotificationChain msgs) {
-		ProrPresentationConfigurations oldPresentationConfigurations = presentationConfigurations;
-		presentationConfigurations = newPresentationConfigurations;
-		boolean oldPresentationConfigurationsESet = presentationConfigurationsESet;
-		presentationConfigurationsESet = true;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, oldPresentationConfigurations, newPresentationConfigurations, !oldPresentationConfigurationsESet);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPresentationConfigurations(ProrPresentationConfigurations newPresentationConfigurations) {
-		if (newPresentationConfigurations != presentationConfigurations) {
-			NotificationChain msgs = null;
-			if (presentationConfigurations != null)
-				msgs = ((InternalEObject)presentationConfigurations).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, null, msgs);
-			if (newPresentationConfigurations != null)
-				msgs = ((InternalEObject)newPresentationConfigurations).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, null, msgs);
-			msgs = basicSetPresentationConfigurations(newPresentationConfigurations, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else {
-			boolean oldPresentationConfigurationsESet = presentationConfigurationsESet;
-			presentationConfigurationsESet = true;
-			if (eNotificationRequired())
-				eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, newPresentationConfigurations, newPresentationConfigurations, !oldPresentationConfigurationsESet));
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicUnsetPresentationConfigurations(NotificationChain msgs) {
-		ProrPresentationConfigurations oldPresentationConfigurations = presentationConfigurations;
-		presentationConfigurations = null;
-		boolean oldPresentationConfigurationsESet = presentationConfigurationsESet;
-		presentationConfigurationsESet = false;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, oldPresentationConfigurations, null, oldPresentationConfigurationsESet);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetPresentationConfigurations() {
-		if (presentationConfigurations != null) {
-			NotificationChain msgs = null;
-			msgs = ((InternalEObject)presentationConfigurations).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, null, msgs);
-			msgs = basicUnsetPresentationConfigurations(msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else {
-			boolean oldPresentationConfigurationsESet = presentationConfigurationsESet;
-			presentationConfigurationsESet = false;
-			if (eNotificationRequired())
-				eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, null, null, oldPresentationConfigurationsESet));
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetPresentationConfigurations() {
-		return presentationConfigurationsESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS:
-				return ((InternalEList<?>)getSpecViewConfigurations()).basicRemove(otherEnd, msgs);
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION:
-				return basicUnsetGeneralConfiguration(msgs);
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS:
-				return basicUnsetPresentationConfigurations(msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS:
-				return getSpecViewConfigurations();
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION:
-				return getGeneralConfiguration();
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS:
-				return getPresentationConfigurations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS:
-				getSpecViewConfigurations().clear();
-				getSpecViewConfigurations().addAll((Collection<? extends ProrSpecViewConfiguration>)newValue);
-				return;
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION:
-				setGeneralConfiguration((ProrGeneralConfiguration)newValue);
-				return;
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS:
-				setPresentationConfigurations((ProrPresentationConfigurations)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS:
-				unsetSpecViewConfigurations();
-				return;
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION:
-				unsetGeneralConfiguration();
-				return;
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS:
-				unsetPresentationConfigurations();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS:
-				return isSetSpecViewConfigurations();
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION:
-				return isSetGeneralConfiguration();
-			case ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS:
-				return isSetPresentationConfigurations();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ProrToolExtensionImpl
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
+import org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Pror Tool Extension</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl#getSpecViewConfigurations <em>Spec View Configurations</em>}</li>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl#getGeneralConfiguration <em>General Configuration</em>}</li>
+ *   <li>{@link org.eclipse.rmf.reqif10.pror.configuration.impl.ProrToolExtensionImpl#getPresentationConfigurations <em>Presentation Configurations</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ProrToolExtensionImpl extends EObjectImpl implements ProrToolExtension {
+	/**
+	 * The cached value of the '{@link #getSpecViewConfigurations() <em>Spec View Configurations</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSpecViewConfigurations()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<ProrSpecViewConfiguration> specViewConfigurations;
+
+	/**
+	 * The cached value of the '{@link #getGeneralConfiguration() <em>General Configuration</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getGeneralConfiguration()
+	 * @generated
+	 * @ordered
+	 */
+	protected ProrGeneralConfiguration generalConfiguration;
+
+	/**
+	 * This is true if the General Configuration containment reference has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean generalConfigurationESet;
+
+	/**
+	 * The cached value of the '{@link #getPresentationConfigurations() <em>Presentation Configurations</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPresentationConfigurations()
+	 * @generated
+	 * @ordered
+	 */
+	protected ProrPresentationConfigurations presentationConfigurations;
+
+	/**
+	 * This is true if the Presentation Configurations containment reference has been set.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean presentationConfigurationsESet;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ProrToolExtensionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ConfigurationPackage.Literals.PROR_TOOL_EXTENSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<ProrSpecViewConfiguration> getSpecViewConfigurations() {
+		if (specViewConfigurations == null) {
+			specViewConfigurations = new EObjectContainmentEList.Unsettable<ProrSpecViewConfiguration>(ProrSpecViewConfiguration.class, this, ConfigurationPackage.PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS);
+		}
+		return specViewConfigurations;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetSpecViewConfigurations() {
+		if (specViewConfigurations != null) ((InternalEList.Unsettable<?>)specViewConfigurations).unset();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetSpecViewConfigurations() {
+		return specViewConfigurations != null && ((InternalEList.Unsettable<?>)specViewConfigurations).isSet();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ProrGeneralConfiguration getGeneralConfiguration() {
+		return generalConfiguration;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetGeneralConfiguration(ProrGeneralConfiguration newGeneralConfiguration, NotificationChain msgs) {
+		ProrGeneralConfiguration oldGeneralConfiguration = generalConfiguration;
+		generalConfiguration = newGeneralConfiguration;
+		boolean oldGeneralConfigurationESet = generalConfigurationESet;
+		generalConfigurationESet = true;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, oldGeneralConfiguration, newGeneralConfiguration, !oldGeneralConfigurationESet);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setGeneralConfiguration(ProrGeneralConfiguration newGeneralConfiguration) {
+		if (newGeneralConfiguration != generalConfiguration) {
+			NotificationChain msgs = null;
+			if (generalConfiguration != null)
+				msgs = ((InternalEObject)generalConfiguration).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, null, msgs);
+			if (newGeneralConfiguration != null)
+				msgs = ((InternalEObject)newGeneralConfiguration).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, null, msgs);
+			msgs = basicSetGeneralConfiguration(newGeneralConfiguration, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else {
+			boolean oldGeneralConfigurationESet = generalConfigurationESet;
+			generalConfigurationESet = true;
+			if (eNotificationRequired())
+				eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, newGeneralConfiguration, newGeneralConfiguration, !oldGeneralConfigurationESet));
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicUnsetGeneralConfiguration(NotificationChain msgs) {
+		ProrGeneralConfiguration oldGeneralConfiguration = generalConfiguration;
+		generalConfiguration = null;
+		boolean oldGeneralConfigurationESet = generalConfigurationESet;
+		generalConfigurationESet = false;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, oldGeneralConfiguration, null, oldGeneralConfigurationESet);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetGeneralConfiguration() {
+		if (generalConfiguration != null) {
+			NotificationChain msgs = null;
+			msgs = ((InternalEObject)generalConfiguration).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, null, msgs);
+			msgs = basicUnsetGeneralConfiguration(msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else {
+			boolean oldGeneralConfigurationESet = generalConfigurationESet;
+			generalConfigurationESet = false;
+			if (eNotificationRequired())
+				eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION, null, null, oldGeneralConfigurationESet));
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetGeneralConfiguration() {
+		return generalConfigurationESet;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ProrPresentationConfigurations getPresentationConfigurations() {
+		return presentationConfigurations;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetPresentationConfigurations(ProrPresentationConfigurations newPresentationConfigurations, NotificationChain msgs) {
+		ProrPresentationConfigurations oldPresentationConfigurations = presentationConfigurations;
+		presentationConfigurations = newPresentationConfigurations;
+		boolean oldPresentationConfigurationsESet = presentationConfigurationsESet;
+		presentationConfigurationsESet = true;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, oldPresentationConfigurations, newPresentationConfigurations, !oldPresentationConfigurationsESet);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setPresentationConfigurations(ProrPresentationConfigurations newPresentationConfigurations) {
+		if (newPresentationConfigurations != presentationConfigurations) {
+			NotificationChain msgs = null;
+			if (presentationConfigurations != null)
+				msgs = ((InternalEObject)presentationConfigurations).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, null, msgs);
+			if (newPresentationConfigurations != null)
+				msgs = ((InternalEObject)newPresentationConfigurations).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, null, msgs);
+			msgs = basicSetPresentationConfigurations(newPresentationConfigurations, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else {
+			boolean oldPresentationConfigurationsESet = presentationConfigurationsESet;
+			presentationConfigurationsESet = true;
+			if (eNotificationRequired())
+				eNotify(new ENotificationImpl(this, Notification.SET, ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, newPresentationConfigurations, newPresentationConfigurations, !oldPresentationConfigurationsESet));
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicUnsetPresentationConfigurations(NotificationChain msgs) {
+		ProrPresentationConfigurations oldPresentationConfigurations = presentationConfigurations;
+		presentationConfigurations = null;
+		boolean oldPresentationConfigurationsESet = presentationConfigurationsESet;
+		presentationConfigurationsESet = false;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, oldPresentationConfigurations, null, oldPresentationConfigurationsESet);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void unsetPresentationConfigurations() {
+		if (presentationConfigurations != null) {
+			NotificationChain msgs = null;
+			msgs = ((InternalEObject)presentationConfigurations).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, null, msgs);
+			msgs = basicUnsetPresentationConfigurations(msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else {
+			boolean oldPresentationConfigurationsESet = presentationConfigurationsESet;
+			presentationConfigurationsESet = false;
+			if (eNotificationRequired())
+				eNotify(new ENotificationImpl(this, Notification.UNSET, ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS, null, null, oldPresentationConfigurationsESet));
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSetPresentationConfigurations() {
+		return presentationConfigurationsESet;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS:
+				return ((InternalEList<?>)getSpecViewConfigurations()).basicRemove(otherEnd, msgs);
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION:
+				return basicUnsetGeneralConfiguration(msgs);
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS:
+				return basicUnsetPresentationConfigurations(msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS:
+				return getSpecViewConfigurations();
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION:
+				return getGeneralConfiguration();
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS:
+				return getPresentationConfigurations();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS:
+				getSpecViewConfigurations().clear();
+				getSpecViewConfigurations().addAll((Collection<? extends ProrSpecViewConfiguration>)newValue);
+				return;
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION:
+				setGeneralConfiguration((ProrGeneralConfiguration)newValue);
+				return;
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS:
+				setPresentationConfigurations((ProrPresentationConfigurations)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS:
+				unsetSpecViewConfigurations();
+				return;
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION:
+				unsetGeneralConfiguration();
+				return;
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS:
+				unsetPresentationConfigurations();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__SPEC_VIEW_CONFIGURATIONS:
+				return isSetSpecViewConfigurations();
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__GENERAL_CONFIGURATION:
+				return isSetGeneralConfiguration();
+			case ConfigurationPackage.PROR_TOOL_EXTENSION__PRESENTATION_CONFIGURATIONS:
+				return isSetPresentationConfigurations();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ProrToolExtensionImpl
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/UnifiedColumnImpl.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/UnifiedColumnImpl.java
new file mode 100644
index 0000000..693cc5d
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/impl/UnifiedColumnImpl.java
@@ -0,0 +1,39 @@
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
+import org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Unified Column</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class UnifiedColumnImpl extends ColumnImpl implements UnifiedColumn {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UnifiedColumnImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ConfigurationPackage.Literals.UNIFIED_COLUMN;
+	}
+
+} //UnifiedColumnImpl
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationAdapterFactory.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationAdapterFactory.java
index 21a62a6..20bd688 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationAdapterFactory.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationAdapterFactory.java
@@ -1,241 +1,246 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.rmf.reqif10.pror.configuration.Column;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
-import org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage
- * @generated
- */
-public class ConfigurationAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static ConfigurationPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConfigurationAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = ConfigurationPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	@Override
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch that delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConfigurationSwitch<Adapter> modelSwitch =
-		new ConfigurationSwitch<Adapter>() {
-			@Override
-			public Adapter caseProrToolExtension(ProrToolExtension object) {
-				return createProrToolExtensionAdapter();
-			}
-			@Override
-			public Adapter caseProrSpecViewConfiguration(ProrSpecViewConfiguration object) {
-				return createProrSpecViewConfigurationAdapter();
-			}
-			@Override
-			public Adapter caseColumn(Column object) {
-				return createColumnAdapter();
-			}
-			@Override
-			public Adapter caseProrPresentationConfigurations(ProrPresentationConfigurations object) {
-				return createProrPresentationConfigurationsAdapter();
-			}
-			@Override
-			public Adapter caseProrPresentationConfiguration(ProrPresentationConfiguration object) {
-				return createProrPresentationConfigurationAdapter();
-			}
-			@Override
-			public Adapter caseProrGeneralConfiguration(ProrGeneralConfiguration object) {
-				return createProrGeneralConfigurationAdapter();
-			}
-			@Override
-			public Adapter caseLabelConfiguration(LabelConfiguration object) {
-				return createLabelConfigurationAdapter();
-			}
-			@Override
-			public Adapter defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	@Override
-	public Adapter createAdapter(Notifier target) {
-		return modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension <em>Pror Tool Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension
-	 * @generated
-	 */
-	public Adapter createProrToolExtensionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration <em>Pror Spec View Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration
-	 * @generated
-	 */
-	public Adapter createProrSpecViewConfigurationAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.Column <em>Column</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.Column
-	 * @generated
-	 */
-	public Adapter createColumnAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations <em>Pror Presentation Configurations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations
-	 * @generated
-	 */
-	public Adapter createProrPresentationConfigurationsAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration <em>Pror Presentation Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration
-	 * @generated
-	 */
-	public Adapter createProrPresentationConfigurationAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration <em>Pror General Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration
-	 * @generated
-	 */
-	public Adapter createProrGeneralConfigurationAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration <em>Label Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration
-	 * @generated
-	 */
-	public Adapter createLabelConfigurationAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //ConfigAdapterFactory
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration.util;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.rmf.reqif10.pror.configuration.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage
+ * @generated
+ */
+public class ConfigurationAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static ConfigurationPackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ConfigurationAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = ConfigurationPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ConfigurationSwitch<Adapter> modelSwitch =
+		new ConfigurationSwitch<Adapter>() {
+			@Override
+			public Adapter caseProrToolExtension(ProrToolExtension object) {
+				return createProrToolExtensionAdapter();
+			}
+			@Override
+			public Adapter caseProrSpecViewConfiguration(ProrSpecViewConfiguration object) {
+				return createProrSpecViewConfigurationAdapter();
+			}
+			@Override
+			public Adapter caseColumn(Column object) {
+				return createColumnAdapter();
+			}
+			@Override
+			public Adapter caseProrPresentationConfigurations(ProrPresentationConfigurations object) {
+				return createProrPresentationConfigurationsAdapter();
+			}
+			@Override
+			public Adapter caseProrPresentationConfiguration(ProrPresentationConfiguration object) {
+				return createProrPresentationConfigurationAdapter();
+			}
+			@Override
+			public Adapter caseProrGeneralConfiguration(ProrGeneralConfiguration object) {
+				return createProrGeneralConfigurationAdapter();
+			}
+			@Override
+			public Adapter caseLabelConfiguration(LabelConfiguration object) {
+				return createLabelConfigurationAdapter();
+			}
+			@Override
+			public Adapter caseUnifiedColumn(UnifiedColumn object) {
+				return createUnifiedColumnAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension <em>Pror Tool Extension</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension
+	 * @generated
+	 */
+	public Adapter createProrToolExtensionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration <em>Pror Spec View Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration
+	 * @generated
+	 */
+	public Adapter createProrSpecViewConfigurationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.Column <em>Column</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.Column
+	 * @generated
+	 */
+	public Adapter createColumnAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations <em>Pror Presentation Configurations</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations
+	 * @generated
+	 */
+	public Adapter createProrPresentationConfigurationsAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration <em>Pror Presentation Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration
+	 * @generated
+	 */
+	public Adapter createProrPresentationConfigurationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration <em>Pror General Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration
+	 * @generated
+	 */
+	public Adapter createProrGeneralConfigurationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration <em>Label Configuration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration
+	 * @generated
+	 */
+	public Adapter createLabelConfigurationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn <em>Unified Column</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn
+	 * @generated
+	 */
+	public Adapter createUnifiedColumnAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //ConfigurationAdapterFactory
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationResourceFactoryImpl.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationResourceFactoryImpl.java
deleted file mode 100644
index 7cf92a7..0000000
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationResourceFactoryImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.rmf.reqif10.pror.configuration.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource Factory</b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.rmf.reqif10.pror.configuration.util.ConfigurationResourceImpl
- * @generated
- */
-public class ConfigurationResourceFactoryImpl extends ResourceFactoryImpl {
-	/**
-	 * Creates an instance of the resource factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConfigurationResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Resource createResource(URI uri) {
-		XMLResource result = new ConfigurationResourceImpl(uri);
-		result.getDefaultSaveOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-		result.getDefaultLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-
-		result.getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
-
-		result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-		result.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-
-		result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
-		return result;
-	}
-
-} //ConfigurationResourceFactoryImpl
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationResourceImpl.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationResourceImpl.java
deleted file mode 100644
index 0e1ad84..0000000
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationResourceImpl.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.rmf.reqif10.pror.configuration.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource </b> associated with the package.
- * <!-- end-user-doc -->
- * @see org.eclipse.rmf.reqif10.pror.configuration.util.ConfigurationResourceFactoryImpl
- * @generated
- */
-public class ConfigurationResourceImpl extends XMLResourceImpl {
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param uri the URI of the new resource.
-	 * @generated
-	 */
-	public ConfigurationResourceImpl(URI uri) {
-		super(uri);
-	}
-
-} //ConfigurationResourceImpl
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationSwitch.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationSwitch.java
index f4ef911..fe3c828 100644
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationSwitch.java
+++ b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationSwitch.java
@@ -1,251 +1,258 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Michael Jastram - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.rmf.reqif10.pror.configuration.util;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.util.Switch;
-import org.eclipse.rmf.reqif10.pror.configuration.Column;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
-import org.eclipse.rmf.reqif10.pror.configuration.LabelConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrGeneralConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfigurations;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
-import org.eclipse.rmf.reqif10.pror.configuration.ProrToolExtension;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage
- * @generated
- */
-public class ConfigurationSwitch<T> extends Switch<T> {
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static ConfigurationPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConfigurationSwitch() {
-		if (modelPackage == null) {
-			modelPackage = ConfigurationPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Checks whether this is a switch for the given package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @parameter ePackage the package in question.
-	 * @return whether this is a switch for the given package.
-	 * @generated
-	 */
-	@Override
-	protected boolean isSwitchFor(EPackage ePackage) {
-		return ePackage == modelPackage;
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	@Override
-	protected T doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case ConfigurationPackage.PROR_TOOL_EXTENSION: {
-				ProrToolExtension prorToolExtension = (ProrToolExtension)theEObject;
-				T result = caseProrToolExtension(prorToolExtension);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION: {
-				ProrSpecViewConfiguration prorSpecViewConfiguration = (ProrSpecViewConfiguration)theEObject;
-				T result = caseProrSpecViewConfiguration(prorSpecViewConfiguration);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ConfigurationPackage.COLUMN: {
-				Column column = (Column)theEObject;
-				T result = caseColumn(column);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS: {
-				ProrPresentationConfigurations prorPresentationConfigurations = (ProrPresentationConfigurations)theEObject;
-				T result = caseProrPresentationConfigurations(prorPresentationConfigurations);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION: {
-				ProrPresentationConfiguration prorPresentationConfiguration = (ProrPresentationConfiguration)theEObject;
-				T result = caseProrPresentationConfiguration(prorPresentationConfiguration);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION: {
-				ProrGeneralConfiguration prorGeneralConfiguration = (ProrGeneralConfiguration)theEObject;
-				T result = caseProrGeneralConfiguration(prorGeneralConfiguration);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ConfigurationPackage.LABEL_CONFIGURATION: {
-				LabelConfiguration labelConfiguration = (LabelConfiguration)theEObject;
-				T result = caseLabelConfiguration(labelConfiguration);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Pror Tool Extension</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Pror Tool Extension</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseProrToolExtension(ProrToolExtension object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Pror Spec View Configuration</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Pror Spec View Configuration</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseProrSpecViewConfiguration(ProrSpecViewConfiguration object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Column</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Column</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseColumn(Column object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Pror Presentation Configurations</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Pror Presentation Configurations</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseProrPresentationConfigurations(ProrPresentationConfigurations object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Pror Presentation Configuration</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Pror Presentation Configuration</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseProrPresentationConfiguration(ProrPresentationConfiguration object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Pror General Configuration</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Pror General Configuration</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseProrGeneralConfiguration(ProrGeneralConfiguration object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Label Configuration</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Label Configuration</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseLabelConfiguration(LabelConfiguration object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	@Override
-	public T defaultCase(EObject object) {
-		return null;
-	}
-
-} //ConfigSwitch
+/**
+ */
+package org.eclipse.rmf.reqif10.pror.configuration.util;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+import org.eclipse.rmf.reqif10.pror.configuration.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage
+ * @generated
+ */
+public class ConfigurationSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static ConfigurationPackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ConfigurationSwitch() {
+		if (modelPackage == null) {
+			modelPackage = ConfigurationPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @parameter ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case ConfigurationPackage.PROR_TOOL_EXTENSION: {
+				ProrToolExtension prorToolExtension = (ProrToolExtension)theEObject;
+				T result = caseProrToolExtension(prorToolExtension);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ConfigurationPackage.PROR_SPEC_VIEW_CONFIGURATION: {
+				ProrSpecViewConfiguration prorSpecViewConfiguration = (ProrSpecViewConfiguration)theEObject;
+				T result = caseProrSpecViewConfiguration(prorSpecViewConfiguration);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ConfigurationPackage.COLUMN: {
+				Column column = (Column)theEObject;
+				T result = caseColumn(column);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATIONS: {
+				ProrPresentationConfigurations prorPresentationConfigurations = (ProrPresentationConfigurations)theEObject;
+				T result = caseProrPresentationConfigurations(prorPresentationConfigurations);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ConfigurationPackage.PROR_PRESENTATION_CONFIGURATION: {
+				ProrPresentationConfiguration prorPresentationConfiguration = (ProrPresentationConfiguration)theEObject;
+				T result = caseProrPresentationConfiguration(prorPresentationConfiguration);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ConfigurationPackage.PROR_GENERAL_CONFIGURATION: {
+				ProrGeneralConfiguration prorGeneralConfiguration = (ProrGeneralConfiguration)theEObject;
+				T result = caseProrGeneralConfiguration(prorGeneralConfiguration);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ConfigurationPackage.LABEL_CONFIGURATION: {
+				LabelConfiguration labelConfiguration = (LabelConfiguration)theEObject;
+				T result = caseLabelConfiguration(labelConfiguration);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ConfigurationPackage.UNIFIED_COLUMN: {
+				UnifiedColumn unifiedColumn = (UnifiedColumn)theEObject;
+				T result = caseUnifiedColumn(unifiedColumn);
+				if (result == null) result = caseColumn(unifiedColumn);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Pror Tool Extension</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Pror Tool Extension</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseProrToolExtension(ProrToolExtension object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Pror Spec View Configuration</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Pror Spec View Configuration</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseProrSpecViewConfiguration(ProrSpecViewConfiguration object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Column</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Column</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseColumn(Column object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Pror Presentation Configurations</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Pror Presentation Configurations</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseProrPresentationConfigurations(ProrPresentationConfigurations object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Pror Presentation Configuration</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Pror Presentation Configuration</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseProrPresentationConfiguration(ProrPresentationConfiguration object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Pror General Configuration</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Pror General Configuration</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseProrGeneralConfiguration(ProrGeneralConfiguration object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Label Configuration</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Label Configuration</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLabelConfiguration(LabelConfiguration object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Unified Column</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Unified Column</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseUnifiedColumn(UnifiedColumn object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //ConfigurationSwitch
diff --git a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationXMLProcessor.java b/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationXMLProcessor.java
deleted file mode 100644
index 9105fa9..0000000
--- a/org.eclipse.rmf.reqif10.pror/src/org/eclipse/rmf/reqif10/pror/configuration/util/ConfigurationXMLProcessor.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.rmf.reqif10.pror.configuration.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-import org.eclipse.rmf.reqif10.pror.configuration.ConfigurationPackage;
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConfigurationXMLProcessor extends XMLProcessor {
-
-	/**
-	 * Public constructor to instantiate the helper.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConfigurationXMLProcessor() {
-		super((EPackage.Registry.INSTANCE));
-		ConfigurationPackage.eINSTANCE.eClass();
-	}
-	
-	/**
-	 * Register for "*" and "xml" file extensions the ConfigurationResourceFactoryImpl factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected Map<String, Resource.Factory> getRegistrations() {
-		if (registrations == null) {
-			super.getRegistrations();
-			registrations.put(XML_EXTENSION, new ConfigurationResourceFactoryImpl());
-			registrations.put(STAR_EXTENSION, new ConfigurationResourceFactoryImpl());
-		}
-		return registrations;
-	}
-
-} //ConfigurationXMLProcessor
diff --git a/org.eclipse.rmf.serialization/.classpath b/org.eclipse.rmf.reqif10.search.test/.classpath
similarity index 75%
rename from org.eclipse.rmf.serialization/.classpath
rename to org.eclipse.rmf.reqif10.search.test/.classpath
index 472ee29..3daaadd 100644
--- a/org.eclipse.rmf.serialization/.classpath
+++ b/org.eclipse.rmf.reqif10.search.test/.classpath
@@ -1,7 +1,8 @@
 <?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="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/org.eclipse.rmf.reqif10.search.test/.gitignore b/org.eclipse.rmf.reqif10.search.test/.gitignore
new file mode 100644
index 0000000..c0a0d46
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/.gitignore
@@ -0,0 +1,3 @@
+/bin/
+/target/
+
diff --git a/org.eclipse.rmf.serialization/.project b/org.eclipse.rmf.reqif10.search.test/.project
similarity index 92%
rename from org.eclipse.rmf.serialization/.project
rename to org.eclipse.rmf.reqif10.search.test/.project
index 3a80015..e5ce847 100644
--- a/org.eclipse.rmf.serialization/.project
+++ b/org.eclipse.rmf.reqif10.search.test/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.rmf.serialization</name>
+	<name>org.eclipse.rmf.reqif10.search.test</name>
 	<comment></comment>
 	<projects>
 	</projects>
@@ -22,7 +22,7 @@
 		</buildCommand>
 	</buildSpec>
 	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
 	</natures>
 </projectDescription>
diff --git a/org.eclipse.rmf.reqif10.search.test/META-INF/MANIFEST.MF b/org.eclipse.rmf.reqif10.search.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b40476c
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/META-INF/MANIFEST.MF
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Fragment-Host: org.eclipse.rmf.reqif10.search
+Bundle-Name: Tests for Search
+Bundle-SymbolicName: org.eclipse.rmf.reqif10.search.test
+Bundle-Version: 0.12.0.qualifier
+Export-Package: org.eclipse.rmf.reqif10.search.test,
+ org.eclipse.rmf.reqif10.search.testdata
+Bundle-Vendor: Formal Mind GmbH
+Require-Bundle: org.eclipse.rmf.reqif10.pror.tests,
+ org.eclipse.emf.edit,
+ org.junit;bundle-version="4.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.rmf.reqif10.search.test/build.properties b/org.eclipse.rmf.reqif10.search.test/build.properties
new file mode 100644
index 0000000..b107977
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/build.properties
@@ -0,0 +1,3 @@
+source.. = src/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.rmf.reqif10.search.test/pom.xml b/org.eclipse.rmf.reqif10.search.test/pom.xml
new file mode 100644
index 0000000..2d137f4
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/pom.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.rmf</groupId>
+		<artifactId>org.eclipse.rmf.releng</artifactId>
+		<version>0.12.0-SNAPSHOT</version>
+		<relativePath>../org.eclipse.rmf.releng/pom.xml</relativePath>
+	</parent>
+	<groupId>org.eclipse.rmf.plugins</groupId>
+	<artifactId>org.eclipse.rmf.reqif10.search.test</artifactId>
+	<properties>
+    	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  	</properties>
+	<packaging>eclipse-test-plugin</packaging>
+	<profiles>
+		<profile>
+			<id>macosx</id>
+			<activation>
+				<os>
+					<family>mac</family>
+				</os>
+			</activation>
+			<properties>
+				<test.vmargs>-Xmx512m -XX:MaxPermSize=256m -XstartOnFirstThread</test.vmargs>
+			</properties>
+		</profile>
+		<profile>
+			<id>other-os</id>
+			<activation>
+				<os>
+					<family>!mac</family>
+				</os>
+			</activation>
+			<properties>
+				<test.vmargs>-Xmx512m -XX:MaxPermSize=256m</test.vmargs>
+			</properties>
+		</profile>
+	</profiles>
+	<build>
+		<sourceDirectory>src</sourceDirectory>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-surefire-plugin</artifactId>
+				<version>${tycho.version}</version>
+				<configuration>
+					<includes>
+						<include>**/*Test.class</include>
+					</includes>
+					<useUIHarness>false</useUIHarness>
+					<useUIThread>false</useUIThread>
+					<argLine>${test.vmargs}</argLine>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<version>${antrun.version}</version>
+				<executions>
+					<execution>
+						<id>generate-commit-id</id>
+						<phase>generate-sources</phase>
+						<configuration>
+							<target>
+								<mkdir dir="${project.build.outputDirectory}"/>
+								<touch file = "${project.build.outputDirectory}/commit-id" /> 
+								<exec executable="git" output="${project.build.outputDirectory}/commit-id">
+									<arg value="rev-parse" />
+									<arg value="HEAD" />
+								</exec>
+							</target>
+						</configuration>
+						<goals>
+							<goal>run</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/AbstractFilterTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/AbstractFilterTest.java
new file mode 100644
index 0000000..4b5e733
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/AbstractFilterTest.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+
+
+
+package org.eclipse.rmf.reqif10.search.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.rmf.reqif10.AttributeDefinition;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.SpecObjectType;
+import org.eclipse.rmf.reqif10.pror.testframework.AbstractItemProviderTest;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.junit.Test;
+
+public abstract class AbstractFilterTest extends AbstractItemProviderTest {
+
+	static Map<Operator, Integer> operatorCounts = new HashMap<Operator, Integer>();
+
+	/**
+	 * The fixture for this Identifiable test case.
+	 */
+	protected SpecElementWithAttributes fixture = null;
+
+	/**
+	 * Sets the fixture for this Identifiable test case.
+	 */
+	protected void setFixture(SpecElementWithAttributes fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Identifiable test case.
+	 */
+	protected SpecElementWithAttributes getFixture() {
+		return fixture;
+	}
+	
+	
+	/**
+	 * runs the filters matcher against the fixture
+	 * @param filter
+	 * @param expected
+	 */
+	public void doMatch(IFilter filter, boolean expected){
+		Integer c = operatorCounts.get(filter.getOperator());
+		c = (c == null ? 1 : ++c);
+		operatorCounts.put(filter.getOperator(), c);
+		
+		System.out.println(filter.toString());
+		
+		assertEquals(expected, filter.match(getFixture()));
+	}
+	
+	
+	@Test
+	public void testExceptionsUnsupportedOperation() throws Exception {
+		if (getSupportedOperators() == null)
+			fail("getSupportedOperators returned null");
+		
+		for (Operator operator : Operator.values()) {
+			if (getSupportedOperators().contains(operator)){
+				continue;
+			}
+			
+			Exception exception = null;
+			try{
+				createFilterInstance(operator);
+			}catch (Exception e){
+				exception = e;
+			}
+			assertTrue(operator.toString() + " should not be supported", exception != null);
+			assertTrue(exception instanceof IllegalArgumentException);
+			assertTrue(exception.getMessage().contains(operator.toString()));
+		}
+	}
+
+	public abstract Set<Operator> getSupportedOperators();
+
+	public abstract IFilter createFilterInstance(Operator operator);
+	
+		
+	@Test
+	public void testOnEmptyAttribute() throws Exception {
+		getFixture().getValues().clear();
+		doEmptyTest();
+	}
+	
+	@Test
+	public void testOnNullValue() throws Exception {
+		createFixture(null);
+		doEmptyTest();
+	}
+
+	/**
+	 * this test defines a filters behavior if a match is run against an empty value
+	 * 
+	 * it will be called two times: 
+	 *  on a specObject in which the attribute is not set at all
+	 *  on a specObject in which the attribute is set, but theValue is null
+	 * 
+	 * @throws Exception
+	 */
+	public abstract void doEmptyTest() throws Exception;
+	
+	
+	public abstract void createFixture(Object object);
+	
+	
+	/**
+	 * create a specObjectType, adds the give attributeDefinition and sets it as the type of the specObject
+	 * 
+	 * @param specObject
+	 */
+	protected void createSpecObjectType(SpecObject specObject, AttributeDefinition attributeDefinition){
+		SpecObjectType specObjectType = ReqIF10Factory.eINSTANCE.createSpecObjectType();
+		specObjectType.getSpecAttributes().add(attributeDefinition);
+		specObject.setType(specObjectType);
+		
+	}
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/AttributeTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/AttributeTest.java
new file mode 100644
index 0000000..ee51680
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/AttributeTest.java
@@ -0,0 +1,121 @@
+package org.eclipse.rmf.reqif10.search.test;
+
+import java.util.GregorianCalendar;
+import java.util.Set;
+
+import org.eclipse.rmf.reqif10.AttributeDefinitionString;
+import org.eclipse.rmf.reqif10.AttributeValueString;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionString;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.SpecObjectType;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.rmf.reqif10.search.filter.StringFilter;
+import org.junit.Test;
+
+public class AttributeTest extends AbstractFilterTest{
+
+	private AttributeDefinitionString attributeDefinition;
+
+	
+	@Test
+	public void testIsSet() throws Exception {
+		StringFilter filter;
+		
+		// The attribute is defined and a value is set
+		createFixture("test", true);
+		filter = new StringFilter(IFilter.Operator.IS_SET, "", attributeDefinition, false);
+		doMatch(filter, true);
+		
+		// The attribute is defined and the value is null
+		createFixture(null, true);
+		filter = new StringFilter(IFilter.Operator.IS_SET, "", attributeDefinition, false);
+		doMatch(filter, false);
+		
+		// The attribute is not defined
+		createFixture(null, false);
+		filter = new StringFilter(IFilter.Operator.IS_SET, "", attributeDefinition, false);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testIsNotSet() throws Exception {
+		/* is not set: return true only if the attribute exisits, but is not set (irrespective of default value).
+		 */
+		StringFilter filter;
+		
+		// The attribute is defined and a value is set
+		createFixture("test", true);
+		filter = new StringFilter(IFilter.Operator.IS_NOT_SET, "", attributeDefinition, false);
+		doMatch(filter, false);
+		
+		// The attribute is defined and the value is null
+		createFixture(null, true);
+		filter = new StringFilter(IFilter.Operator.IS_NOT_SET, "", attributeDefinition, false);
+		doMatch(filter, true);
+
+		// The attribute is not defined
+		createFixture(null, false);
+		filter = new StringFilter(IFilter.Operator.IS_NOT_SET, "", attributeDefinition, false);
+		doMatch(filter, false);
+		
+	}
+	
+	
+	public void createFixture(Object value, boolean withAttribute) {
+		String theValue = (String) value;
+		
+		attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionString();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionString definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionString();
+		definition.setIdentifier("DD_ID0");
+		attributeDefinition.setType(definition);
+		
+		AttributeValueString attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueString();
+		attributeValue.setDefinition(attributeDefinition);
+		if (value != null){
+			attributeValue.setTheValue(theValue);
+		}
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		specObject.getValues().add(attributeValue);
+		specObject.setLastChange(new GregorianCalendar(2014, 12, 03));
+		specObject.setIdentifier("THE_SPECOBJECT_ID");
+		specObject.setDesc("THE_SPECOBJECT_DESC");
+		specObject.setLongName("THE_SPECOBJECT_LONG_NAME");
+		
+		SpecObjectType specObjectType = ReqIF10Factory.eINSTANCE.createSpecObjectType();
+		if (withAttribute){
+			specObjectType.getSpecAttributes().add(attributeDefinition);
+		}
+		specObject.setType(specObjectType);
+		
+		setFixture(specObject);
+	}
+	
+	@Override
+	public void createFixture(Object value) {
+		createFixture(value, true);
+	}
+
+	@Override
+	public Set<Operator> getSupportedOperators() {
+		return StringFilter.SUPPORTED_OPERATORS;
+	}
+
+	@Override
+	public IFilter createFilterInstance(Operator operator) {
+		return new StringFilter(operator, "", attributeDefinition, true);
+	}
+
+	@Override
+	public void doEmptyTest() throws Exception {
+		// Do nothing
+	}
+	
+	@Override
+	public void testOnEmptyAttribute() throws Exception {
+		// Do nothing
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/BoolFilterDefaultsTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/BoolFilterDefaultsTest.java
new file mode 100644
index 0000000..1e37382
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/BoolFilterDefaultsTest.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.test;
+
+import org.eclipse.rmf.reqif10.AttributeValueBoolean;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionBoolean;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.SpecObjectType;
+import org.junit.Test;
+
+public class BoolFilterDefaultsTest extends BoolFilterTest {
+
+	
+	@Test
+	public void testOnEmptyAttribute() throws Exception {
+		// Do nothing, since this test will fall back on default values 
+	}
+	
+	
+	public void createFixture(Object value){
+		if ((value != null) && ! (value instanceof Boolean)) {
+			throw new IllegalArgumentException();	
+		}
+		
+		attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionBoolean();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionBoolean definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionBoolean();
+		definition.setIdentifier("DD_ID0");
+		attributeDefinition.setType(definition);
+		AttributeValueBoolean attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueBoolean();
+		attributeValue.setDefinition(attributeDefinition);
+		if (value == null){
+			//attributeValue.setTheValue(false);
+			// we do nothing here to simulate a non set value
+			// attributeValue.isSetTheValue() will return false
+		}else{
+			attributeValue.setTheValue((Boolean) value);
+		}
+		attributeDefinition.setDefaultValue(attributeValue);
+		
+		SpecObjectType specObjectType = ReqIF10Factory.eINSTANCE.createSpecObjectType();
+		specObjectType.getSpecAttributes().add(attributeDefinition);
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		specObject.setType(specObjectType);
+		
+		setFixture(specObject);
+	}
+	
+	@Override
+	public void testIsSet() throws Exception {
+		// super would fail because of the changed fixture
+	}
+
+	@Override
+	public void testIsNotSet() throws Exception {
+		// super would fail because of the changed fixture
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/BoolFilterTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/BoolFilterTest.java
new file mode 100644
index 0000000..7bd75bf
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/BoolFilterTest.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.rmf.reqif10.search.test;
+
+import java.util.Set;
+
+import org.eclipse.rmf.reqif10.AttributeDefinitionBoolean;
+import org.eclipse.rmf.reqif10.AttributeValueBoolean;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionBoolean;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.search.filter.BoolFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.junit.Before;
+import org.junit.Test;
+
+public class BoolFilterTest extends AbstractFilterTest {
+
+	AttributeDefinitionBoolean attributeDefinition;
+
+	@Before
+	public void setUp(){
+		createFixture(true);
+	}
+	
+
+	@Test
+	public void testIsTrue() throws Exception {
+		BoolFilter filter;
+		filter = new BoolFilter(Operator.IS, true, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new BoolFilter(Operator.IS, false, attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testIsFalse() throws Exception {
+		createFixture(false);
+		
+		BoolFilter filter;
+		filter = new BoolFilter(Operator.IS, true, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new BoolFilter(Operator.IS, false, attributeDefinition);
+		doMatch(filter, true);
+	}
+	
+
+	@Test
+	public void testIsSet() throws Exception {
+		BoolFilter filter;
+		filter = new BoolFilter(Operator.IS_SET, true, attributeDefinition);
+		doMatch(filter, true);
+		
+		AttributeDefinitionBoolean nonExistingAttributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionBoolean();
+		nonExistingAttributeDefinition.setIdentifier("AD_ID0");
+		
+		filter = new BoolFilter(Operator.IS, false, nonExistingAttributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testIsNotSet() throws Exception {
+		BoolFilter filter;
+		filter = new BoolFilter(Operator.IS_NOT_SET, true, attributeDefinition);
+		doMatch(filter, false);
+		
+		AttributeDefinitionBoolean nonExistingAttributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionBoolean();
+		nonExistingAttributeDefinition.setIdentifier("AD_ID1");
+		
+		filter = new BoolFilter(Operator.IS_NOT_SET, false, nonExistingAttributeDefinition);
+		doMatch(filter, false);
+	}	
+	
+	
+	/* 
+	 * A match on a specObject that does not contain this attribute should always return false
+	 */
+	public void doEmptyTest() throws Exception {
+		
+		BoolFilter filter = new BoolFilter(Operator.IS, true, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new BoolFilter(Operator.IS, false, attributeDefinition);
+		doMatch(filter, false);
+	}	
+	
+	
+		
+	public void createFixture(Object value){
+		if ((value != null) && ! (value instanceof Boolean)) {
+			throw new IllegalArgumentException();	
+		}
+		
+		attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionBoolean();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionBoolean definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionBoolean();
+		definition.setIdentifier("DD_ID0");
+		attributeDefinition.setType(definition);
+		AttributeValueBoolean attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueBoolean();
+		attributeValue.setDefinition(attributeDefinition);
+		if (value == null){
+			//attributeValue.setTheValue(false);
+			// we do nothing here to simulate a non set value
+			// attributeValue.isSetTheValue() will return false
+		}else{
+			attributeValue.setTheValue((Boolean) value);
+		}
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		specObject.getValues().add(attributeValue);
+		
+		createSpecObjectType(specObject, attributeDefinition);
+		
+		setFixture(specObject);
+	}
+
+
+	@Override
+	public BoolFilter createFilterInstance(Operator operator) {
+		return new BoolFilter(operator, true, attributeDefinition); 
+	}
+
+
+	@Override
+	public Set<Operator> getSupportedOperators() {
+		return BoolFilter.SUPPORTED_OPERATORS;
+	}
+
+
+
+	
+	
+	
+	
+
+
+
+	
+
+}
\ No newline at end of file
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/CompoundFilterTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/CompoundFilterTest.java
new file mode 100644
index 0000000..775c3ab
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/CompoundFilterTest.java
@@ -0,0 +1,129 @@
+package org.eclipse.rmf.reqif10.search.test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.rmf.reqif10.AttributeDefinitionBoolean;
+import org.eclipse.rmf.reqif10.AttributeValueBoolean;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionBoolean;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.search.filter.BoolFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.rmf.reqif10.search.filter.SimpleCompoundFilter;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CompoundFilterTest extends AbstractFilterTest {
+
+	private AttributeDefinitionBoolean attributeDefinition1;
+	private AttributeDefinitionBoolean attributeDefinition2;
+	private AttributeDefinitionBoolean attributeDefinition3;
+	private BoolFilter filterTrue1;
+	private BoolFilter filterTrue2;
+	private BoolFilter filterFalse1;
+	private List<IFilter> filters;
+
+	@Before
+	public void setUp() {
+		createFixture(true);
+		
+		filterTrue1 = new BoolFilter(IFilter.Operator.IS, true, attributeDefinition1);
+		filterTrue2 = new BoolFilter(IFilter.Operator.IS, true, attributeDefinition2);
+		filterFalse1 = new BoolFilter(IFilter.Operator.IS, true, attributeDefinition3);
+		
+		filters = new ArrayList<IFilter>();
+		filters.add(filterTrue1);
+		filters.add(filterTrue2);
+		filters.add(filterFalse1);
+	}
+	
+	
+	@Test
+	public void testOr() throws Exception {
+		SimpleCompoundFilter filter = new SimpleCompoundFilter(filters, true);
+		doMatch(filter, true);
+	}
+	
+	
+	@Test
+	public void testAnd() throws Exception {
+		SimpleCompoundFilter filter = new SimpleCompoundFilter(filters, false);
+		doMatch(filter, true);
+	}
+	
+	@Test
+	public void testAnd2() throws Exception {
+		filters.clear();
+		filters.add(filterTrue1);
+		filters.add(filterTrue2);
+		
+		SimpleCompoundFilter filter = new SimpleCompoundFilter(filters, false);
+		doMatch(filter, true);
+	}
+	
+	@Override
+	public void createFixture(Object value) {
+		if ((value != null) && !(value instanceof Boolean)) {
+			throw new IllegalArgumentException();
+		}
+
+		
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		attributeDefinition1 = createBooleanAttribute(specObject, true);
+		attributeDefinition2 = createBooleanAttribute(specObject, true);
+		attributeDefinition3 = createBooleanAttribute(specObject, false);
+
+		createSpecObjectType(specObject, attributeDefinition1);
+
+		setFixture(specObject);
+	}
+	
+	
+	
+	/* creates a new datatypeDefinition, attributeDefinition and attributeValue and adds it to the element
+	 * 
+	 * returns the newly created AttributeDefinition
+	 */
+	private AttributeDefinitionBoolean createBooleanAttribute(SpecElementWithAttributes element, Boolean value){
+		AttributeDefinitionBoolean attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionBoolean();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionBoolean definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionBoolean();
+		definition.setIdentifier("DD_ID0");
+		attributeDefinition.setType(definition);
+		AttributeValueBoolean attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueBoolean();
+		attributeValue.setDefinition(attributeDefinition);
+		attributeValue.setTheValue((Boolean) value);
+		
+		element.getValues().add(attributeValue);
+		
+		return attributeDefinition;
+	}
+	
+
+	@Override
+	public Set<Operator> getSupportedOperators() {
+		return null;
+	}
+
+	@Override
+	public IFilter createFilterInstance(Operator operator) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void doEmptyTest() throws Exception {
+		// TODO Auto-generated method stub
+	}
+
+	
+	@Override
+	public void testExceptionsUnsupportedOperation() throws Exception {
+	
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/DateFilterDefaultsTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/DateFilterDefaultsTest.java
new file mode 100644
index 0000000..f168f4b
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/DateFilterDefaultsTest.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.test;
+
+import java.util.GregorianCalendar;
+
+import org.eclipse.rmf.reqif10.AttributeValueDate;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionDate;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.SpecObjectType;
+import org.junit.Test;
+
+public class DateFilterDefaultsTest extends DateFilterTest {
+
+	@Test
+	public void testOnEmptyAttribute() {
+		// Do nothing, since this test will fall back on default values 
+	}
+	
+	
+	
+	@Override	
+	public void createFixture(Object value){
+		GregorianCalendar theValue = (GregorianCalendar) value;
+		
+		attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionDate();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionDate definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionDate();
+		definition.setIdentifier("DD_ID0");
+		attributeDefinition.setType(definition);
+		AttributeValueDate attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueDate();
+		attributeValue.setDefinition(attributeDefinition);
+		attributeValue.setTheValue(theValue);
+		attributeDefinition.setDefaultValue(attributeValue);	
+		
+		SpecObjectType specObjectType = ReqIF10Factory.eINSTANCE.createSpecObjectType();
+		specObjectType.getSpecAttributes().add(attributeDefinition);
+		
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		//specObject.getValues().add(attributeValue);
+		specObject.setLastChange(new GregorianCalendar(2014, 11, 03, 12, 0, 0));
+		
+		createSpecObjectType(specObject, attributeDefinition);
+		
+		setFixture(specObject);
+	}
+
+	
+	@Override
+	public void testIsSet() throws Exception {
+		// super would fail because of the changed fixture
+	}
+
+	@Override
+	public void testIsNotSet() throws Exception {
+		// super would fail because of the changed fixture
+	}
+	
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/DateFilterTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/DateFilterTest.java
new file mode 100644
index 0000000..0e54fdb
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/DateFilterTest.java
@@ -0,0 +1,442 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ *     Michael Jastram - adding SUPPORTED_OPERATIONS
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.test;
+
+import java.util.GregorianCalendar;
+import java.util.Set;
+import java.util.TimeZone;
+
+import org.eclipse.rmf.reqif10.AttributeDefinitionDate;
+import org.eclipse.rmf.reqif10.AttributeValueDate;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionDate;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.search.filter.DateFilter;
+import org.eclipse.rmf.reqif10.search.filter.DateFilter.InternalAttribute;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class DateFilterTest extends AbstractFilterTest{
+
+	SpecObject specObject;
+	AttributeDefinitionDate attributeDefinition; 
+
+	@Rule public ExpectedException thrown= ExpectedException.none();
+	
+	@Override	
+	public void createFixture(Object value){
+		GregorianCalendar theValue = (GregorianCalendar) value;
+		
+		attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionDate();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionDate definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionDate();
+		definition.setIdentifier("DD_ID0");
+		attributeDefinition.setType(definition);
+		AttributeValueDate attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueDate();
+		attributeValue.setDefinition(attributeDefinition);
+		attributeValue.setTheValue(theValue);
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		specObject.getValues().add(attributeValue);
+		specObject.setLastChange(new GregorianCalendar(2014, 11, 03, 12, 0, 0));
+		
+		createSpecObjectType(specObject, attributeDefinition);
+		
+		setFixture(specObject);
+	}	
+	
+	
+	@Before
+	public void setUp(){
+		createFixture(new GregorianCalendar(2014, 11, 03));
+	}
+	
+	
+	@Test
+	public void testIs() throws Exception {
+		DateFilter filter;
+			
+		filter = new DateFilter(IFilter.Operator.IS, new GregorianCalendar(2014, 11, 03), null,  attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.IS, new GregorianCalendar(2014, 11, 04), null,  attributeDefinition);
+		doMatch(filter, false);
+
+		filter = new DateFilter(IFilter.Operator.IS, new GregorianCalendar(2014,11,03,0,0,0), null,  attributeDefinition);
+		doMatch(filter, true);
+		
+		// we do the match on date only, the time of the day should be ignored 
+		createFixture(new GregorianCalendar(2014, 11, 03, 13, 14, 15));		
+		filter = new DateFilter(IFilter.Operator.IS, new GregorianCalendar(2014,11,03), null,  attributeDefinition);
+		doMatch(filter, true);
+				
+		// for is and is_not operator the time of the day is ignored
+		filter = new DateFilter(IFilter.Operator.IS, new GregorianCalendar(2014,11,03,20,0,0), null,  attributeDefinition);
+		doMatch(filter, true);
+		
+		// match two different representations of the same point in time (i.e. different time zones)
+		GregorianCalendar fixtureDate = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
+		fixtureDate.set(2014, 11, 3, 23, 0, 0);
+		GregorianCalendar filterDate = new GregorianCalendar(TimeZone.getTimeZone("GMT+9"));
+		filterDate.set(2014, 11, 4, 8, 0, 0);
+		//System.out.println((filterDate.getTimeInMillis() - fixtureDate.getTimeInMillis()) / 1000 / 60 / 60);
+		
+		createFixture(fixtureDate);
+		filter = new DateFilter(IFilter.Operator.IS, filterDate, null,  attributeDefinition);
+		doMatch(filter, true);
+		
+		
+	}
+	
+	
+	@Test
+	public void testIsOnInternal() throws Exception {
+		DateFilter filter;
+		
+		filter = new DateFilter(IFilter.Operator.IS, new GregorianCalendar(2014, 11, 03), null,  DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.IS, new GregorianCalendar(2014, 11, 04), null,  DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+
+		filter = new DateFilter(IFilter.Operator.IS, new GregorianCalendar(2014,11,03,0,0,0), null,  DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+	}
+	
+	
+	@Test
+	public void testIsNot() throws Exception {
+		DateFilter filter;
+		
+		filter = new DateFilter(IFilter.Operator.IS_NOT, new GregorianCalendar(2014, 11, 04), null,  attributeDefinition);
+		doMatch(filter, true);
+
+		filter = new DateFilter(IFilter.Operator.IS_NOT, new GregorianCalendar(2014, 11, 03), null,  attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testIsNotOnInternal() throws Exception {
+		DateFilter filter;
+		
+		filter = new DateFilter(IFilter.Operator.IS_NOT, new GregorianCalendar(2014, 11, 04), null,  DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+
+		filter = new DateFilter(IFilter.Operator.IS_NOT, new GregorianCalendar(2014, 11, 03), null,  DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+	}
+	
+
+	@Test
+	public void testBetween() throws Exception {
+		DateFilter filter;
+		
+		filter = new DateFilter(IFilter.Operator.BETWEEN, new GregorianCalendar(2014, 11, 01), new GregorianCalendar(2014, 11, 04), attributeDefinition);
+		doMatch(filter, true);
+		filter = new DateFilter(IFilter.Operator.BETWEEN, new GregorianCalendar(2014, 11, 04), new GregorianCalendar(2014, 11, 01), attributeDefinition);
+		doMatch(filter, true);
+
+		filter = new DateFilter(IFilter.Operator.BETWEEN, new GregorianCalendar(2014, 11, 03), new GregorianCalendar(2014, 11, 03), attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.BETWEEN, new GregorianCalendar(2014, 11, 01), new GregorianCalendar(2014, 11, 03), attributeDefinition);
+		doMatch(filter, true);
+		filter = new DateFilter(IFilter.Operator.BETWEEN, new GregorianCalendar(2014, 11, 03), new GregorianCalendar(2014, 11, 06), attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.BETWEEN, new GregorianCalendar(2014, 01, 01), new GregorianCalendar(2014, 11, 01), attributeDefinition);
+		doMatch(filter, false);
+	}
+		
+	@Test
+	public void testBetweenOnInternal() throws Exception {
+		DateFilter filter;
+		
+		filter = new DateFilter(IFilter.Operator.BETWEEN, new GregorianCalendar(2014, 11, 01), new GregorianCalendar(2014, 11, 04), DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+
+		filter = new DateFilter(IFilter.Operator.BETWEEN, new GregorianCalendar(2014, 11, 03), new GregorianCalendar(2014, 11, 03), DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.BETWEEN, new GregorianCalendar(2014, 01, 01), new GregorianCalendar(2014, 11, 01), DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testBefore() throws Exception {
+		DateFilter filter;
+		
+		filter = new DateFilter(IFilter.Operator.BEFORE, new GregorianCalendar(2015, 1, 1), new GregorianCalendar(2014, 11, 04), attributeDefinition);
+		doMatch(filter, true);
+
+		filter = new DateFilter(IFilter.Operator.BEFORE, new GregorianCalendar(2014, 11, 3), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new DateFilter(IFilter.Operator.BEFORE, new GregorianCalendar(2014, 1, 1), null, attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testBeforeOnInternal(){
+		DateFilter filter;
+		filter = new DateFilter(IFilter.Operator.BEFORE, new GregorianCalendar(2015, 1, 1), new GregorianCalendar(2014, 11, 04), DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+
+		filter = new DateFilter(IFilter.Operator.BEFORE, new GregorianCalendar(2014, 11, 3), null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+		
+		filter = new DateFilter(IFilter.Operator.BEFORE, new GregorianCalendar(2014, 1, 1), null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testAfter() throws Exception {
+		DateFilter filter;
+		
+		filter = new DateFilter(IFilter.Operator.AFTER, new GregorianCalendar(2000, 1, 1), null, attributeDefinition);
+		doMatch(filter, true);
+
+		filter = new DateFilter(IFilter.Operator.AFTER, new GregorianCalendar(3000, 1, 1), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new DateFilter(IFilter.Operator.AFTER, new GregorianCalendar(2014, 11, 03), null, attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testAfterOnInternal() throws Exception {
+		DateFilter filter;
+		
+		filter = new DateFilter(IFilter.Operator.AFTER, new GregorianCalendar(2000, 1, 1), null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+
+		filter = new DateFilter(IFilter.Operator.AFTER, new GregorianCalendar(3000, 1, 1), null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+		
+		filter = new DateFilter(IFilter.Operator.AFTER, new GregorianCalendar(2014, 11, 02), null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.AFTER, new GregorianCalendar(2014, 11, 03, 0, 0, 0), null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.AFTER, new GregorianCalendar(2014, 11, 03), null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.AFTER, new GregorianCalendar(2014, 11, 03, 12, 0, 0), null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+	}
+	
+	
+	public void doEmptyTest(){
+		DateFilter filter;
+		
+		filter = new DateFilter(IFilter.Operator.IS, new GregorianCalendar(2014, 1, 1), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new DateFilter(IFilter.Operator.IS_NOT, new GregorianCalendar(2014, 1, 1), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.BETWEEN, new GregorianCalendar(2014, 1, 1), new GregorianCalendar(2014, 1, 1), attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new DateFilter(IFilter.Operator.BEFORE, new GregorianCalendar(2014, 1, 1), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new DateFilter(IFilter.Operator.AFTER, new GregorianCalendar(2000, 1, 1), null, attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testInternalAttributes() throws Exception {
+		DateFilter filter;
+
+		filter = new DateFilter(IFilter.Operator.IS, new GregorianCalendar(
+				2014, 11, 3), null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+
+		filter = new DateFilter(IFilter.Operator.IS, new GregorianCalendar(
+				2014, 11, 3, 17, 0, 0), null,
+				DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+
+		filter = new DateFilter(IFilter.Operator.IS, new GregorianCalendar(
+				2014, 11, 4), null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+
+		filter = new DateFilter(IFilter.Operator.IS_NOT, new GregorianCalendar(
+				2014, 11, 4), null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+
+		filter = new DateFilter(IFilter.Operator.IS_NOT,
+				new GregorianCalendar(2014, 11, 3, 23, 59, 59),
+				null,
+				DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+
+		filter = new DateFilter(IFilter.Operator.BETWEEN,
+				new GregorianCalendar(2014, 11, 3, 23, 59, 59),
+				new GregorianCalendar(2014, 11, 3, 23, 59, 59),
+				DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+
+		filter = new DateFilter(IFilter.Operator.BETWEEN,
+				new GregorianCalendar(2014, 11, 3, 0, 0, 0),
+				new GregorianCalendar(2014, 11, 3, 23, 59, 59),
+				DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.BETWEEN,
+				new GregorianCalendar(2014, 11, 3, 12, 0, 0),
+				new GregorianCalendar(2014, 11, 3, 23, 59, 59),
+				DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.BETWEEN,
+				new GregorianCalendar(2014, 11, 3, 0, 0, 0),
+				new GregorianCalendar(2014, 11, 3, 12, 0, 0),
+				DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.BEFORE,
+				new GregorianCalendar(2014, 11, 3, 23, 59, 59),
+				null,
+				DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.BEFORE,
+				new GregorianCalendar(2014, 11, 3, 12, 0, 0),
+				null,
+				DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+		
+		filter = new DateFilter(IFilter.Operator.BEFORE,
+				new GregorianCalendar(2014, 11, 4),
+				null,
+				DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.BEFORE,
+				new GregorianCalendar(2014, 11, 3),
+				null,
+				DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+		
+		filter = new DateFilter(IFilter.Operator.AFTER,
+				new GregorianCalendar(2014, 11, 3),
+				null,
+				DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(IFilter.Operator.AFTER,
+				new GregorianCalendar(2014, 11, 3, 12, 0, 0),
+				null,
+				DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+		
+		filter = new DateFilter(IFilter.Operator.AFTER,
+				new GregorianCalendar(2014, 11, 5),
+				null,
+				DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+	}
+	
+	
+	
+	@Test
+	public void testIsSet() throws Exception {
+		DateFilter filter;
+		
+		filter = new DateFilter(IFilter.Operator.IS_SET, new GregorianCalendar(2014, 1, 1), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		AttributeDefinitionDate attributeDefinition2 = ReqIF10Factory.eINSTANCE.createAttributeDefinitionDate();
+		attributeDefinition2.setIdentifier("AD_ID1");
+		
+		filter = new DateFilter(IFilter.Operator.IS_SET, new GregorianCalendar(2014, 1, 1), null, attributeDefinition2);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testIsNotSet() throws Exception {
+		DateFilter filter;
+		
+		filter = new DateFilter(IFilter.Operator.IS_NOT_SET, new GregorianCalendar(2014, 1, 1), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		AttributeDefinitionDate attributeDefinition2 = ReqIF10Factory.eINSTANCE.createAttributeDefinitionDate();
+		attributeDefinition2.setIdentifier("AD_ID1");
+		
+		filter = new DateFilter(IFilter.Operator.IS_NOT_SET, new GregorianCalendar(2014, 1, 1), null, attributeDefinition2);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testIsSetInternal() throws Exception {
+		DateFilter filter;
+		
+		filter = new DateFilter(Operator.IS_SET, new GregorianCalendar(2014, 1, 1), null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+		
+		filter = new DateFilter(Operator.IS_SET, null, null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+		
+		getFixture().setLastChange(null);
+		filter = new DateFilter(Operator.IS_SET, null, null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testIsNotSetInternal() throws Exception {
+		DateFilter filter;
+		
+		filter = new DateFilter(Operator.IS_NOT_SET, new GregorianCalendar(2014, 1, 1), null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+		
+		filter = new DateFilter(Operator.IS_NOT_SET, null, null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, false);
+		
+		getFixture().setLastChange(null);
+		filter = new DateFilter(Operator.IS_NOT_SET, null, null, DateFilter.InternalAttribute.LAST_CHANGE);
+		doMatch(filter, true);
+	}
+	
+	
+	@Test
+	public void testExceptionsAttributeDefinition() throws Exception {
+		thrown.expect(IllegalArgumentException.class);
+		new DateFilter(IFilter.Operator.BEFORE, new GregorianCalendar(2014, 1, 1), null, (AttributeDefinitionDate) null);
+	}
+	
+	@Test
+	public void testExceptionsInternalAttribute() throws Exception {
+		thrown.expect(IllegalArgumentException.class);
+		new DateFilter(IFilter.Operator.BEFORE, new GregorianCalendar(2014, 1, 1), null, (InternalAttribute) null);
+	}
+	
+	@Override
+	public DateFilter createFilterInstance(Operator operator) {
+		return new DateFilter(operator, new GregorianCalendar(2014, 1, 1), null, attributeDefinition);
+	}
+
+	@Override
+	public Set<Operator> getSupportedOperators() {
+		return DateFilter.SUPPORTED_OPERATORS;
+	}
+	
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/EnumFilterDefaultsTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/EnumFilterDefaultsTest.java
new file mode 100644
index 0000000..4280e1d
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/EnumFilterDefaultsTest.java
@@ -0,0 +1,67 @@
+package org.eclipse.rmf.reqif10.search.test;
+
+import java.util.Collection;
+
+import org.eclipse.rmf.reqif10.AttributeValueEnumeration;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionEnumeration;
+import org.eclipse.rmf.reqif10.EnumValue;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.junit.Test;
+
+public class EnumFilterDefaultsTest extends EnumFilterTest {
+
+
+	@Test
+	public void testOnEmptyAttribute() {
+		// Do nothing, since this test will fall back on default values 
+	}
+	
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public void createFixture(Object values) {
+		if (specifiedValues == null){
+			throw new NullPointerException();
+		}
+		
+		Collection<EnumValue> enumValues = null;
+		if (values instanceof Collection<?>) {
+			enumValues = (Collection<EnumValue>) values;
+		}else if (values != null){
+			throw new IllegalArgumentException();
+		}
+		
+		
+		attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionEnumeration();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionEnumeration definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionEnumeration();
+		definition.setIdentifier("DD_ID0");
+		definition.getSpecifiedValues().addAll(specifiedValues);
+		attributeDefinition.setType(definition);
+		
+		AttributeValueEnumeration attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueEnumeration();
+		attributeValue.setDefinition(attributeDefinition);
+		if (enumValues != null){
+			attributeValue.getValues().addAll(enumValues);
+		}
+		attributeDefinition.setDefaultValue(attributeValue);
+		
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		
+		createSpecObjectType(specObject, attributeDefinition);
+		
+		setFixture(specObject);
+	}
+	
+	@Override
+	public void testIsSet() throws Exception {
+		// super would fail because of the changed fixture
+	}
+
+	@Override
+	public void testIsNotSet() throws Exception {
+		// super would fail because of the changed fixture
+	}	
+	
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/EnumFilterTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/EnumFilterTest.java
new file mode 100644
index 0000000..c70badc
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/EnumFilterTest.java
@@ -0,0 +1,276 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.test;
+
+import java.math.BigInteger;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.Set;
+
+import org.eclipse.rmf.reqif10.AttributeDefinitionEnumeration;
+import org.eclipse.rmf.reqif10.AttributeValueEnumeration;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionEnumeration;
+import org.eclipse.rmf.reqif10.EmbeddedValue;
+import org.eclipse.rmf.reqif10.EnumValue;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.search.filter.EnumFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EnumFilterTest extends AbstractFilterTest{
+
+	AttributeDefinitionEnumeration attributeDefinition;
+	LinkedList<EnumValue> specifiedValues;
+	
+	@Before
+	public void setUp(){
+		specifiedValues = new LinkedList<EnumValue>();
+		specifiedValues.add(createEnumValue(1));
+		specifiedValues.add(createEnumValue(2));
+		specifiedValues.add(createEnumValue(3));
+		
+		createFixture(specifiedValues);
+	}
+	
+	
+	@Test
+	public void testEquals() throws Exception {
+		EnumFilter filter;
+		LinkedList<EnumValue> testValues = new LinkedList<EnumValue>();
+		testValues.addAll(specifiedValues);
+		
+		createFixture(testValues);
+		filter = new EnumFilter(Operator.EQUALS, specifiedValues, attributeDefinition);
+		doMatch(filter, true);
+		
+		testValues.clear();
+		testValues.add(specifiedValues.get(2));
+		testValues.add(specifiedValues.get(0));
+		testValues.add(specifiedValues.get(1));
+		createFixture(testValues);
+		filter = new EnumFilter(Operator.EQUALS, specifiedValues, attributeDefinition);
+		doMatch(filter, true);
+		
+		testValues.removeFirst();
+		createFixture(testValues);
+		filter = new EnumFilter(Operator.EQUALS, specifiedValues, attributeDefinition);
+		doMatch(filter, false);
+		
+		createFixture(specifiedValues);
+		filter = new EnumFilter(Operator.EQUALS, testValues, attributeDefinition);
+		doMatch(filter, false);
+		
+		testValues.clear();
+		testValues.addAll(specifiedValues);
+		testValues.addAll(specifiedValues);
+		createFixture(specifiedValues);
+		filter = new EnumFilter(Operator.EQUALS, testValues, attributeDefinition);
+		doMatch(filter, true);
+	}
+	
+	@Test
+	public void testNotEquals() throws Exception {
+		EnumFilter filter;
+		LinkedList<EnumValue> testValues = new LinkedList<EnumValue>();
+		testValues.addAll(specifiedValues);
+		
+		createFixture(testValues);
+		filter = new EnumFilter(Operator.NOT_EQUALS, specifiedValues, attributeDefinition);
+		doMatch(filter, false);
+		
+		testValues.removeFirst();
+		createFixture(testValues);
+		filter = new EnumFilter(Operator.NOT_EQUALS, specifiedValues, attributeDefinition);
+		doMatch(filter, true);
+		
+		createFixture(specifiedValues);
+		filter = new EnumFilter(Operator.NOT_EQUALS, testValues, attributeDefinition);
+		doMatch(filter, true);
+	}
+	
+	
+	@Test
+	public void testContainsAll() throws Exception {
+		EnumFilter filter;
+				
+		createFixture(specifiedValues);
+		filter = new EnumFilter(Operator.CONTAINS_ALL, specifiedValues, attributeDefinition);
+		doMatch(filter, true);
+		
+		createFixture(specifiedValues);
+		LinkedList<EnumValue> testValues = new LinkedList<EnumValue>();
+		testValues.add(specifiedValues.get(0));
+		filter = new EnumFilter(Operator.CONTAINS_ALL, specifiedValues, attributeDefinition);
+		doMatch(filter, true);
+		
+		testValues.add(specifiedValues.get(2));
+		filter = new EnumFilter(Operator.CONTAINS_ALL, specifiedValues, attributeDefinition);
+		doMatch(filter, true);
+		
+		testValues.add(specifiedValues.get(1));
+		filter = new EnumFilter(Operator.CONTAINS_ALL, specifiedValues, attributeDefinition);
+		doMatch(filter, true);
+		
+		testValues.clear();
+		testValues.add(specifiedValues.getFirst());
+		createFixture(testValues);
+		filter = new EnumFilter(Operator.CONTAINS_ALL, specifiedValues, attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testContainsAny() throws Exception {
+		EnumFilter filter;
+		
+		createFixture(specifiedValues);
+		filter = new EnumFilter(Operator.CONTAINS_ANY, specifiedValues, attributeDefinition);
+		doMatch(filter, true);
+		
+		LinkedList<EnumValue> testValues = new LinkedList<EnumValue>();
+		testValues.add(specifiedValues.get(1));
+		createFixture(testValues);
+		filter = new EnumFilter(Operator.CONTAINS_ANY, specifiedValues, attributeDefinition);
+		doMatch(filter, true);
+		
+		LinkedList<EnumValue> testValues2 = new LinkedList<EnumValue>();
+		testValues2.add(specifiedValues.get(0));
+		createFixture(testValues);
+		filter = new EnumFilter(Operator.CONTAINS_ANY, testValues2, attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	
+	
+	@Test
+	public void testIsSet() throws Exception {
+		EnumFilter filter;
+		
+		filter = new EnumFilter(IFilter.Operator.IS_SET, specifiedValues, attributeDefinition);
+		doMatch(filter, true);
+		
+		AttributeDefinitionEnumeration attributeDefinition2 = ReqIF10Factory.eINSTANCE.createAttributeDefinitionEnumeration();
+		attributeDefinition2.setIdentifier("AD_ID1");
+		
+		filter = new EnumFilter(IFilter.Operator.IS_SET, specifiedValues, attributeDefinition2);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testIsNotSet() throws Exception {
+		EnumFilter filter;
+		
+		filter = new EnumFilter(IFilter.Operator.IS_NOT_SET, specifiedValues, attributeDefinition);
+		doMatch(filter, false);
+		
+		AttributeDefinitionEnumeration attributeDefinition2 = ReqIF10Factory.eINSTANCE.createAttributeDefinitionEnumeration();
+		attributeDefinition2.setIdentifier("AD_ID1");
+		
+		filter = new EnumFilter(IFilter.Operator.IS_NOT_SET, specifiedValues, attributeDefinition2);
+		doMatch(filter, false);
+	}	
+	
+
+	@Override
+	public void doEmptyTest() throws Exception {
+		EnumFilter filter;
+		LinkedList<EnumValue> emptyList = new LinkedList<EnumValue>();
+		
+		filter = new EnumFilter(Operator.EQUALS, specifiedValues, attributeDefinition);
+		doMatch(filter, false);
+		filter = new EnumFilter(Operator.EQUALS, emptyList, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new EnumFilter(Operator.NOT_EQUALS, specifiedValues, attributeDefinition);
+		doMatch(filter, true);
+		filter = new EnumFilter(Operator.NOT_EQUALS, emptyList, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new EnumFilter(Operator.CONTAINS_ALL, specifiedValues, attributeDefinition);
+		doMatch(filter, false);
+		filter = new EnumFilter(Operator.CONTAINS_ALL, emptyList, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new EnumFilter(Operator.CONTAINS_ANY, specifiedValues, attributeDefinition);
+		doMatch(filter, false);
+		filter = new EnumFilter(Operator.CONTAINS_ANY, emptyList, attributeDefinition);
+		doMatch(filter, true);
+		
+	}
+	
+		
+	@Override
+	public Set<Operator> getSupportedOperators() {
+		return EnumFilter.SUPPORTED_OPERATORS;
+	}
+
+	@Override
+	public IFilter createFilterInstance(Operator operator) {
+		return new EnumFilter(operator, specifiedValues, attributeDefinition);
+	}
+
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public void createFixture(Object values) {
+		if (specifiedValues == null){
+			throw new NullPointerException();
+		}
+		
+		Collection<EnumValue> enumValues = null;
+		if (values instanceof Collection<?>) {
+			enumValues = (Collection<EnumValue>) values;
+		}else if (values != null){
+			throw new IllegalArgumentException();
+		}
+		
+		
+		attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionEnumeration();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionEnumeration definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionEnumeration();
+		definition.setIdentifier("DD_ID0");
+		definition.getSpecifiedValues().addAll(specifiedValues);
+		attributeDefinition.setType(definition);
+		
+		AttributeValueEnumeration attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueEnumeration();
+		attributeValue.setDefinition(attributeDefinition);
+		if (enumValues != null){
+			attributeValue.getValues().addAll(enumValues);
+		}
+		
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		specObject.getValues().add(attributeValue);
+		
+		createSpecObjectType(specObject, attributeDefinition);
+		
+		setFixture(specObject);
+	}
+
+	/*
+	 * Constructs an enumValue
+	 * 
+	 * The id and embeddedValue is derived from the number parameter, hence only numbers should be given 
+	 */
+	private EnumValue createEnumValue(Integer number){
+		EnumValue enumValue = ReqIF10Factory.eINSTANCE.createEnumValue();
+		enumValue.setIdentifier("ENUMVALUE_" + number);
+		EmbeddedValue embeddedValue = ReqIF10Factory.eINSTANCE.createEmbeddedValue();
+		embeddedValue.setKey(new BigInteger(number.toString()));
+		embeddedValue.setOtherContent(number.toString());
+		enumValue.setProperties(embeddedValue);
+		
+		return enumValue;
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/IntegerFilterDefaultsTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/IntegerFilterDefaultsTest.java
new file mode 100644
index 0000000..29b5d92
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/IntegerFilterDefaultsTest.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.test;
+
+import java.math.BigInteger;
+
+import org.eclipse.rmf.reqif10.AttributeValueInteger;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionInteger;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.junit.Test;
+
+public class IntegerFilterDefaultsTest extends IntegerFilterTest {
+
+	@Test
+	public void testOnEmptyAttribute() throws Exception {
+		// Do nothing, since this test will fall back on default values 
+	}
+	
+	/**
+	 * Sets the value as the defaultValue.
+	 * No value is set on the specObject
+	 * All test from super class should then pass using the default value of the attribute 
+	 */
+	@Override
+	public void createFixture(Object value) {
+		BigInteger theValue = (BigInteger) value;
+		
+		attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionInteger();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionInteger definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionInteger();
+		definition.setIdentifier("DD_ID0");
+		
+		attributeDefinition.setType(definition);
+		AttributeValueInteger attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueInteger();
+		attributeValue.setDefinition(attributeDefinition);
+		attributeValue.setTheValue(theValue);
+		attributeDefinition.setDefaultValue(attributeValue);
+		
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		createSpecObjectType(specObject, attributeDefinition);
+		
+		setFixture(specObject);
+	}
+
+	@Override
+	public void testIsSet() throws Exception {
+		// super would fail because of the changed fixture
+	}
+
+	@Override
+	public void testIsNotSet() throws Exception {
+		// super would fail because of the changed fixture
+	}
+	
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/IntegerFilterTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/IntegerFilterTest.java
new file mode 100644
index 0000000..7eeab00
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/IntegerFilterTest.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.test;
+
+import java.math.BigInteger;
+import java.util.Set;
+
+import org.eclipse.rmf.reqif10.AttributeDefinitionInteger;
+import org.eclipse.rmf.reqif10.AttributeValueInteger;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionInteger;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.rmf.reqif10.search.filter.NumberFilter;
+import org.junit.Before;
+import org.junit.Test;
+
+public class IntegerFilterTest extends AbstractFilterTest {
+
+	
+	AttributeDefinitionInteger attributeDefinition;
+
+	
+	
+	@Before
+	public void setUp(){
+		createFixture(new BigInteger("1"));
+	}
+	
+	
+	@Test
+	public void testIs() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.IS, BigInteger.ONE, null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.IS, BigInteger.ZERO, null, attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testIsNot() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.IS_NOT, new BigInteger("0"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.IS_NOT, BigInteger.ONE, null, attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testBetween() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.BETWEEN, new BigInteger("0"), new BigInteger("2"), attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.BETWEEN, new BigInteger("0"), new BigInteger("1"), attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.BETWEEN, new BigInteger("1"), new BigInteger("2"), attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.BETWEEN, new BigInteger("2"), new BigInteger("3"), attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new NumberFilter(Operator.BETWEEN, new BigInteger("3"), new BigInteger("0"), attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testGreater() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.GREATER, new BigInteger("0"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.GREATER, new BigInteger("1"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.GREATER, new BigInteger("2"), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new NumberFilter(Operator.GREATER, new BigInteger("0"), new BigInteger("2"), attributeDefinition);
+		doMatch(filter, true);
+	}
+	
+	
+	@Test
+	public void testSmaller() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.SMALLER, new BigInteger("2"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.SMALLER, new BigInteger("1"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.SMALLER, new BigInteger("0"), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new NumberFilter(Operator.SMALLER, new BigInteger("0"), new BigInteger("2"), attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testIsSet() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.IS_SET, new BigInteger("2"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		AttributeDefinitionInteger attributeDefinition2 = ReqIF10Factory.eINSTANCE.createAttributeDefinitionInteger();
+		attributeDefinition2.setIdentifier("AD_ID1");
+		
+		filter = new NumberFilter(Operator.IS_SET, new BigInteger("2"), null, attributeDefinition2);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testIsNotSet() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.IS_NOT_SET, new BigInteger("2"), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		AttributeDefinitionInteger attributeDefinition2 = ReqIF10Factory.eINSTANCE.createAttributeDefinitionInteger();
+		attributeDefinition2.setIdentifier("AD_ID1");
+		
+		filter = new NumberFilter(Operator.IS_NOT_SET, new BigInteger("2"), null, attributeDefinition2);
+		doMatch(filter, false);
+	}	
+	
+	
+	@Override
+	public IFilter createFilterInstance(Operator operator) {
+		return new NumberFilter(operator, BigInteger.ZERO, null, attributeDefinition);
+	}
+	
+
+
+	@Override
+	public void doEmptyTest() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.IS, new BigInteger("0"), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new NumberFilter(Operator.IS_NOT, new BigInteger("10"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.BETWEEN, new BigInteger("0"), new BigInteger("10"), attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new NumberFilter(Operator.GREATER, new BigInteger("0"), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new NumberFilter(Operator.SMALLER, new BigInteger("0"), null, attributeDefinition);
+		doMatch(filter, false);
+	}
+
+
+	@Override
+	public void createFixture(Object value) {
+		BigInteger theValue = (BigInteger) value;
+		
+		attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionInteger();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionInteger definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionInteger();
+		definition.setIdentifier("DD_ID0");
+		attributeDefinition.setType(definition);
+		AttributeValueInteger attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueInteger();
+		attributeValue.setDefinition(attributeDefinition);
+		attributeValue.setTheValue(theValue);
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		specObject.getValues().add(attributeValue);
+		
+		createSpecObjectType(specObject, attributeDefinition);
+		
+		setFixture(specObject);
+	}
+
+
+	@Override
+	public Set<Operator> getSupportedOperators() {
+		return NumberFilter.SUPPORTED_OPERATORS;
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/RealFilterDefaultsTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/RealFilterDefaultsTest.java
new file mode 100644
index 0000000..4313dc9
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/RealFilterDefaultsTest.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.test;
+
+import org.eclipse.rmf.reqif10.AttributeValueReal;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionReal;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.SpecObjectType;
+import org.junit.Test;
+
+public class RealFilterDefaultsTest extends RealFilterTest {
+
+	@Test
+	public void testOnEmptyAttribute() throws Exception {
+		// Do nothing, since this test will fall back on default values 
+	}
+	
+	
+	/**
+	 * Sets the value as the defaultValue.
+	 * No value is set on the specObject
+	 * All test from super class should then pass using the default value of the attribute 
+	 */
+	@Override
+	public void createFixture(Object value) {
+		Double theValue = (Double) value;
+		
+		attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionReal();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionReal definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionReal();
+		definition.setIdentifier("DD_ID0");
+		attributeDefinition.setType(definition);
+		AttributeValueReal attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueReal();
+		attributeValue.setDefinition(attributeDefinition);
+		
+		if (theValue != null){
+			attributeValue.setTheValue(theValue);
+		}
+		
+		attributeDefinition.setDefaultValue(attributeValue);
+		
+		SpecObjectType specObjectType = ReqIF10Factory.eINSTANCE.createSpecObjectType();
+		specObjectType.getSpecAttributes().add(attributeDefinition);
+		
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		specObject.setType(specObjectType);
+		
+		setFixture(specObject);
+	}
+	
+	
+	@Override
+	public void testIsSet() throws Exception {
+		// super would fail because of the changed fixture
+	}
+
+	@Override
+	public void testIsNotSet() throws Exception {
+		// super would fail because of the changed fixture
+	}
+	
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/RealFilterTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/RealFilterTest.java
new file mode 100644
index 0000000..9c48206
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/RealFilterTest.java
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.test;
+
+import java.util.Set;
+
+import org.eclipse.rmf.reqif10.AttributeDefinitionInteger;
+import org.eclipse.rmf.reqif10.AttributeDefinitionReal;
+import org.eclipse.rmf.reqif10.AttributeValueReal;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionReal;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.rmf.reqif10.search.filter.NumberFilter;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RealFilterTest extends AbstractFilterTest {
+
+	
+	AttributeDefinitionReal attributeDefinition;
+
+	
+	
+	@Before
+	public void setUp(){
+		createFixture(new Double("1"));
+	}
+	
+	
+	@Test
+	public void testIs() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.IS, new Double("1"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.IS, new Double("0"), null, attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testIsNot() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.IS_NOT, new Double("0"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.IS_NOT, new Double("1"), null, attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testBetween() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.BETWEEN, new Double("0"), new Double("2"), attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.BETWEEN, new Double("0"), new Double("1"), attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.BETWEEN, new Double("1"), new Double("2"), attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.BETWEEN, new Double("2"), new Double("3"), attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new NumberFilter(Operator.BETWEEN, new Double("3"), new Double("0"), attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testGreater() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.GREATER, new Double("0"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.GREATER, new Double("1"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.GREATER, new Double("2"), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new NumberFilter(Operator.GREATER, new Double("0"), new Double("2"), attributeDefinition);
+		doMatch(filter, true);
+	}
+	
+	
+	@Test
+	public void testSmaller() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.SMALLER, new Double("2"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.SMALLER, new Double("1"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.SMALLER, new Double("0"), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new NumberFilter(Operator.SMALLER, new Double("0"), new Double("2"), attributeDefinition);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testIsSet() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.IS_SET, new Double("2"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		AttributeDefinitionReal attributeDefinition2 = ReqIF10Factory.eINSTANCE.createAttributeDefinitionReal();
+		attributeDefinition2.setIdentifier("AD_ID1");
+		
+		filter = new NumberFilter(Operator.IS_SET, new Double("2"), null, attributeDefinition2);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testIsNotSet() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.IS_NOT_SET, new Double("2"), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		AttributeDefinitionInteger attributeDefinition2 = ReqIF10Factory.eINSTANCE.createAttributeDefinitionInteger();
+		attributeDefinition2.setIdentifier("AD_ID1");
+		
+		filter = new NumberFilter(Operator.IS_NOT_SET, new Double("2"), null, attributeDefinition2);
+		doMatch(filter, false);
+	}	
+	
+	
+	
+	@Override
+	public IFilter createFilterInstance(Operator operator) {
+		return new NumberFilter(operator, new Double(0), null, attributeDefinition);
+	}
+	
+
+
+	@Override
+	public void doEmptyTest() throws Exception {
+		NumberFilter filter;
+		
+		filter = new NumberFilter(Operator.IS, new Double("0"), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new NumberFilter(Operator.IS_NOT, new Double("10"), null, attributeDefinition);
+		doMatch(filter, true);
+		
+		filter = new NumberFilter(Operator.BETWEEN, new Double("0"), new Double("10"), attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new NumberFilter(Operator.GREATER, new Double("0"), null, attributeDefinition);
+		doMatch(filter, false);
+		
+		filter = new NumberFilter(Operator.SMALLER, new Double("0"), null, attributeDefinition);
+		doMatch(filter, false);
+	}
+
+
+	@Override
+	public void createFixture(Object value) {
+		Double theValue = (Double) value;
+		
+		attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionReal();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionReal definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionReal();
+		definition.setIdentifier("DD_ID0");
+		attributeDefinition.setType(definition);
+		AttributeValueReal attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueReal();
+		attributeValue.setDefinition(attributeDefinition);
+		
+		if (theValue != null){
+			System.out.println("seeting the value " + theValue);
+			attributeValue.setTheValue(theValue);
+		}
+		
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		specObject.getValues().add(attributeValue);
+		
+		createSpecObjectType(specObject, attributeDefinition);
+		
+		setFixture(specObject);
+	}
+
+
+	@Override
+	public Set<Operator> getSupportedOperators() {
+		return NumberFilter.SUPPORTED_OPERATORS;
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/SimpleCompoundFilterTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/SimpleCompoundFilterTest.java
new file mode 100644
index 0000000..3c0740c
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/SimpleCompoundFilterTest.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.math.BigInteger;
+import java.util.GregorianCalendar;
+import java.util.LinkedList;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.rmf.reqif10.AttributeDefinition;
+import org.eclipse.rmf.reqif10.AttributeDefinitionDate;
+import org.eclipse.rmf.reqif10.AttributeDefinitionInteger;
+import org.eclipse.rmf.reqif10.AttributeDefinitionString;
+import org.eclipse.rmf.reqif10.AttributeValue;
+import org.eclipse.rmf.reqif10.ReqIF;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
+import org.eclipse.rmf.reqif10.pror.testframework.AbstractItemProviderTest;
+import org.eclipse.rmf.reqif10.search.filter.DateFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.rmf.reqif10.search.filter.NumberFilter;
+import org.eclipse.rmf.reqif10.search.filter.SimpleCompoundFilter;
+import org.eclipse.rmf.reqif10.search.filter.StringFilter;
+import org.eclipse.rmf.reqif10.search.testdata.TestData;
+import org.junit.Test;
+
+public class SimpleCompoundFilterTest extends AbstractItemProviderTest {
+
+	
+	@Test
+	public void testName() throws Exception {
+		URI uri = TestData.getURI("testMultipleAttributes.reqif");
+		final Resource resource = editingDomain.getResourceSet().getResource(uri, true);
+		final ReqIF reqif = (ReqIF) resource.getContents().get(0);
+		SpecObject so = reqif.getCoreContent().getSpecObjects().get(0);
+		
+		
+		AttributeDefinitionString adString = null;
+		AttributeDefinitionDate adDate = null;
+		AttributeDefinitionInteger adInteger = null;
+		for (AttributeValue attributeValue : so.getValues()) {
+			AttributeDefinition attributeDefinition = ReqIF10Util.getAttributeDefinition(attributeValue);
+			System.out.println(attributeDefinition.getClass());
+			if (attributeDefinition instanceof AttributeDefinitionString) {
+				adString = (AttributeDefinitionString) attributeDefinition;
+			}
+			if (attributeDefinition instanceof AttributeDefinitionInteger) {
+				adInteger = (AttributeDefinitionInteger) attributeDefinition;
+			}
+			if (attributeDefinition instanceof AttributeDefinitionDate) {
+				adDate = (AttributeDefinitionDate) attributeDefinition;
+			}
+		}
+		
+		
+		LinkedList<IFilter> filters = new LinkedList<IFilter>();
+		filters.add(new DateFilter(Operator.AFTER, new GregorianCalendar(2014, 1, 1), null, adDate)); // matches
+		filters.add(new NumberFilter(Operator.GREATER, new BigInteger("100"), null, adInteger)); // does not match
+		filters.add(new StringFilter(Operator.CONTAINS, "c", adString, false)); // matches
+			
+		
+		SimpleCompoundFilter orFilter = new SimpleCompoundFilter(filters, true);
+		for (SpecObject specObject : reqif.getCoreContent().getSpecObjects()) {
+			assertTrue(orFilter.match(specObject));
+		}
+		
+		
+		SimpleCompoundFilter andFilter = new SimpleCompoundFilter(filters, false);
+		for (SpecObject specObject : reqif.getCoreContent().getSpecObjects()) {
+			assertFalse(andFilter.match(specObject));
+		}
+		
+		filters = new LinkedList<IFilter>();
+		filters.add(new DateFilter(Operator.AFTER, new GregorianCalendar(2014, 1, 1), null, adDate)); // matches
+		filters.add(new StringFilter(Operator.CONTAINS, "c", adString, false)); // matches
+
+		andFilter = new SimpleCompoundFilter(filters, false);
+		for (SpecObject specObject : reqif.getCoreContent().getSpecObjects()) {
+			assertTrue(andFilter.match(specObject));
+		}
+		
+	}
+	
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/StringFilterDefaultsValueTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/StringFilterDefaultsValueTest.java
new file mode 100644
index 0000000..9206478
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/StringFilterDefaultsValueTest.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.test;
+
+import java.util.GregorianCalendar;
+
+import org.eclipse.rmf.reqif10.AttributeValueString;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionString;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.SpecObjectType;
+import org.junit.Test;
+
+public class StringFilterDefaultsValueTest extends StringFilterTest {
+
+	@Test
+	public void testOnEmptyAttribute() throws Exception {
+		// Do nothing, since this test will fall back on default values 
+	}
+	
+
+	/**
+	 * Sets the value as the defaultValue.
+	 * No value is set on the specObject
+	 * All test from super class should then pass using the default value of the attribute 
+	 */
+	@Override
+	public void createFixture(Object value) {
+		String theValue = (String) value;
+		
+		attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionString();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionString definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionString();
+		definition.setIdentifier("DD_ID0");
+		attributeDefinition.setType(definition);
+		
+		AttributeValueString attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueString();
+		attributeValue.setDefinition(attributeDefinition);
+		attributeValue.setTheValue(theValue);
+		attributeDefinition.setDefaultValue(attributeValue);
+
+		SpecObjectType specObjectType = ReqIF10Factory.eINSTANCE.createSpecObjectType();
+		specObjectType.getSpecAttributes().add(attributeDefinition);
+		
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		specObject.setType(specObjectType);
+		specObject.setLastChange(new GregorianCalendar(2014, 12, 03));
+		specObject.setIdentifier("THE_SPECOBJECT_ID");
+		specObject.setDesc("THE_SPECOBJECT_DESC");
+		specObject.setLongName("THE_SPECOBJECT_LONG_NAME");
+		
+		createSpecObjectType(specObject, attributeDefinition);
+		
+		setFixture(specObject);
+
+	}
+	
+	@Override
+	public void testIsSet() throws Exception {
+		// super would fail because of the changed fixture
+	}
+
+	@Override
+	public void testIsNotSet() throws Exception {
+		// super would fail because of the changed fixture
+	}
+	
+	
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/StringFilterInternalTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/StringFilterInternalTest.java
new file mode 100644
index 0000000..ada170f
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/StringFilterInternalTest.java
@@ -0,0 +1,197 @@
+package org.eclipse.rmf.reqif10.search.test;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.Set;
+
+import org.eclipse.rmf.reqif10.AttributeDefinitionString;
+import org.eclipse.rmf.reqif10.AttributeValueString;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionString;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.search.filter.AbstractTextFilter;
+import org.eclipse.rmf.reqif10.search.filter.AbstractTextFilter.InternalAttribute;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.rmf.reqif10.search.filter.StringFilter;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+
+@RunWith(Parameterized.class)
+public class StringFilterInternalTest extends AbstractFilterTest {
+
+	@Parameters
+	public static Collection<Object[]> data() {
+				
+		/*
+		 * AbstractTextFilter.InternalAttribute.DESC => THE_SPECOBJECT_DESC
+		 * AbstractTextFilter.InternalAttribute.IDENTIFIER  => THE_SPECOBJECT_ID
+		 * AbstractTextFilter.InternalAttribute.LONG_NAME => THE_SPECOBJECT_LONG_NAME
+		 *
+		 * Operator, FilterValue, Attribute, expectedResult
+		 * 
+		 */
+		
+		
+		HashMap<InternalAttribute, String> values = new HashMap<AbstractTextFilter.InternalAttribute, String>();
+		values.put(AbstractTextFilter.InternalAttribute.DESC, "THE_SPECOBJECT_DESC");
+		values.put(AbstractTextFilter.InternalAttribute.IDENTIFIER, "THE_SPECOBJECT_ID");
+		values.put(AbstractTextFilter.InternalAttribute.LONG_NAME, "THE_SPECOBJECT_LONG_NAME");
+		
+		
+		ArrayList<Object[]> testData = new ArrayList<Object[]>();
+		 
+		for (AbstractTextFilter.InternalAttribute attribute : values.keySet()) {
+			// match the value on the value
+			testData.add(new Object[] { 
+					IFilter.Operator.EQUALS, values.get(attribute), attribute, true,
+					true });
+			testData.add(new Object[] { 
+					IFilter.Operator.NOT_EQUALS, values.get(attribute), attribute, true,
+					false });
+			
+			// match the value on the value.toLowerCase and caseInSensitive
+			testData.add(new Object[] { 
+					IFilter.Operator.EQUALS, values.get(attribute).toLowerCase(), attribute, false,
+					true });
+			testData.add(new Object[] { 
+					IFilter.Operator.NOT_EQUALS, values.get(attribute).toLowerCase(), attribute, false,
+					false });
+			
+			// match the value on the value.toLowerCase and caseSensitive
+			testData.add(new Object[] { 
+					IFilter.Operator.EQUALS, values.get(attribute).toLowerCase(), attribute, true,
+					false });
+			testData.add(new Object[] { 
+					IFilter.Operator.NOT_EQUALS, values.get(attribute).toLowerCase(), attribute, true,
+					true });
+			
+			
+			testData.add(new Object[] { 
+					IFilter.Operator.CONTAINS, "THE_", attribute, true,
+					true });
+			testData.add(new Object[] { 
+					IFilter.Operator.CONTAINS, "THE_", attribute, false,
+					true });
+			testData.add(new Object[] { 
+					IFilter.Operator.CONTAINS, "the_", attribute, true,
+					false });
+			
+			
+			testData.add(new Object[] { 
+					IFilter.Operator.NOT_CONTAINS, "E", attribute, true,
+					false });
+			testData.add(new Object[] { 
+					IFilter.Operator.NOT_CONTAINS, "e", attribute, false,
+					false });
+			testData.add(new Object[] { 
+					IFilter.Operator.NOT_CONTAINS, "XXX", attribute, true,
+					true });
+			
+			testData.add(new Object[] { 
+					IFilter.Operator.REGEXP, ".*E.*", attribute, true,
+					true });
+			testData.add(new Object[] { 
+					IFilter.Operator.REGEXP, ".*e.*", attribute, false,
+					true });
+			testData.add(new Object[] { 
+					IFilter.Operator.REGEXP, ".*e.*", attribute, true,
+					false });
+			
+		}
+		
+		
+		return testData;
+
+	}
+	
+	Operator operator;
+	String filterValue;
+	AbstractTextFilter.InternalAttribute attribute;
+	boolean caseSensitive;
+	boolean expectedResult;
+	
+	
+	
+	public StringFilterInternalTest(Operator operator, String filterValue, AbstractTextFilter.InternalAttribute attribute, Boolean caseSensitive, Boolean expectedResult) {
+		this.operator = operator;
+		this.filterValue = filterValue;
+		this.attribute = attribute;
+		this.expectedResult = expectedResult;
+		this.caseSensitive = caseSensitive;
+	}
+
+	
+	@Test
+	public void testFilter() throws Exception {
+		System.out.println("running " +  this.operator + " " + this.filterValue + " on " + attribute + "expecting " + expectedResult);
+		
+		StringFilter filter = new StringFilter(operator, filterValue, attribute, caseSensitive);
+		doMatch(filter, expectedResult);
+	}
+
+	
+	
+	@Before
+	public void setUp(){
+		createFixture("abcDEF");
+	}
+	
+	@Override
+	public void createFixture(Object value) {
+		String theValue = (String) value;
+		
+		AttributeDefinitionString attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionString();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionString definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionString();
+		definition.setIdentifier("DD_ID0");
+		attributeDefinition.setType(definition);
+		AttributeValueString attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueString();
+		attributeValue.setDefinition(attributeDefinition);
+		attributeValue.setTheValue(theValue);
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		specObject.getValues().add(attributeValue);
+		specObject.setLastChange(new GregorianCalendar(2014, 12, 03));
+		specObject.setIdentifier("THE_SPECOBJECT_ID");
+		specObject.setDesc("THE_SPECOBJECT_DESC");
+		specObject.setLongName("THE_SPECOBJECT_LONG_NAME");
+		
+		createSpecObjectType(specObject, attributeDefinition);
+		
+		setFixture(specObject);
+	}
+	
+	
+	
+
+	@Override
+	public Set<Operator> getSupportedOperators() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+
+	@Override
+	public IFilter createFilterInstance(Operator operator) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+
+	@Override
+	public void doEmptyTest() throws Exception {
+		// TODO Auto-generated method stub
+	}
+
+	@Override
+	public void testExceptionsUnsupportedOperation() throws Exception {
+		
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/StringFilterTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/StringFilterTest.java
new file mode 100644
index 0000000..d5d3dba
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/StringFilterTest.java
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ *     Michael Jastram - adding SUPPORTED_OPERATIONS
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.GregorianCalendar;
+import java.util.Set;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.rmf.reqif10.AttributeDefinition;
+import org.eclipse.rmf.reqif10.AttributeDefinitionString;
+import org.eclipse.rmf.reqif10.AttributeValue;
+import org.eclipse.rmf.reqif10.AttributeValueString;
+import org.eclipse.rmf.reqif10.DatatypeDefinitionString;
+import org.eclipse.rmf.reqif10.ReqIF;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
+import org.eclipse.rmf.reqif10.search.filter.AbstractTextFilter;
+import org.eclipse.rmf.reqif10.search.filter.AbstractTextFilter.InternalAttribute;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.rmf.reqif10.search.filter.StringFilter;
+import org.eclipse.rmf.reqif10.search.testdata.TestData;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class StringFilterTest extends AbstractFilterTest{
+
+	AttributeDefinitionString attributeDefinition; 
+
+	@Rule public ExpectedException thrown= ExpectedException.none();
+	
+	@Before
+	public void setUp(){
+		createFixture("abcDEF");
+	}
+	
+	
+	@Test
+	public void testEquals() throws Exception {
+		StringFilter filter;
+		
+		filter = new StringFilter(IFilter.Operator.EQUALS, "abcDEF",  attributeDefinition, true);
+		doMatch(filter, true);
+		
+		filter = new StringFilter(IFilter.Operator.EQUALS, "abcDEF",  attributeDefinition, false);
+		doMatch(filter, true);
+		
+		filter = new StringFilter(IFilter.Operator.EQUALS, "abcdef",  attributeDefinition, true);
+		doMatch(filter, false);
+		
+		filter = new StringFilter(IFilter.Operator.EQUALS, "abcdef",  attributeDefinition, false);
+		doMatch(filter, true);
+		
+		filter = new StringFilter(IFilter.Operator.EQUALS, "abc",  attributeDefinition, false);
+		doMatch(filter, false);
+		
+		filter = new StringFilter(IFilter.Operator.EQUALS, "abc",  attributeDefinition, true);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testNotEquals() throws Exception {
+		StringFilter filter;
+		
+		filter = new StringFilter(IFilter.Operator.NOT_EQUALS, "X",  attributeDefinition, true);
+		doMatch(filter, true);
+		
+		filter = new StringFilter(IFilter.Operator.NOT_EQUALS, "abcdef",  attributeDefinition, true);
+		doMatch(filter, true);
+		
+		filter = new StringFilter(IFilter.Operator.NOT_EQUALS, "abcdef",  attributeDefinition, false);
+		doMatch(filter, false);
+		
+		filter = new StringFilter(IFilter.Operator.NOT_EQUALS, "abcDEF",  attributeDefinition, true);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testContains() throws Exception {
+		StringFilter filter;
+		
+		filter = new StringFilter(IFilter.Operator.CONTAINS, "A",  attributeDefinition, false);
+		doMatch(filter, true);
+		filter = new StringFilter(IFilter.Operator.CONTAINS, "A",  attributeDefinition, true);
+		doMatch(filter, false);
+		filter = new StringFilter(IFilter.Operator.CONTAINS, "nonexisting substring",  attributeDefinition, true);
+		doMatch(filter, false);
+		filter = new StringFilter(IFilter.Operator.CONTAINS, "nonexisting substring",  attributeDefinition, false);
+		doMatch(filter, false);
+		filter = new StringFilter(IFilter.Operator.CONTAINS, "abcDEF",  attributeDefinition, true);
+		doMatch(filter, true);
+		filter = new StringFilter(IFilter.Operator.CONTAINS, "abcDEF",  attributeDefinition, false);
+		doMatch(filter, true);
+	}
+	
+	
+	@Test
+	public void testNotContains() throws Exception {
+		StringFilter filter;
+		
+		filter = new StringFilter(IFilter.Operator.NOT_CONTAINS, "A",  attributeDefinition, false);
+		doMatch(filter, false);
+		filter = new StringFilter(IFilter.Operator.NOT_CONTAINS, "A",  attributeDefinition, true);
+		doMatch(filter, true);
+		filter = new StringFilter(IFilter.Operator.NOT_CONTAINS, "nonexisting substring",  attributeDefinition, true);
+		doMatch(filter, true);
+		filter = new StringFilter(IFilter.Operator.NOT_CONTAINS, "nonexisting substring",  attributeDefinition, false);
+		doMatch(filter, true);
+		filter = new StringFilter(IFilter.Operator.NOT_CONTAINS, "abcDEF",  attributeDefinition, true);
+		doMatch(filter, false);
+		filter = new StringFilter(IFilter.Operator.NOT_CONTAINS, "abcDEF",  attributeDefinition, false);
+		doMatch(filter, false);
+	}
+	
+	@Test
+	public void testRegExp() throws Exception {
+		StringFilter filter;
+		
+		filter= new StringFilter(IFilter.Operator.REGEXP, ".*b.*",  attributeDefinition, true);
+		doMatch(filter, true);
+		
+		filter= new StringFilter(IFilter.Operator.REGEXP, ".*b.*",  attributeDefinition, false);
+		doMatch(filter, true);
+		
+		filter= new StringFilter(IFilter.Operator.REGEXP, ".*ABC.*",  attributeDefinition, true);
+		doMatch(filter, false);
+		
+		filter= new StringFilter(IFilter.Operator.REGEXP, ".*ABC.*",  attributeDefinition, false);
+		doMatch(filter, true);
+		
+	}
+		
+	
+	@Override
+	public void doEmptyTest(){
+		StringFilter filter;
+		
+		filter = new StringFilter(IFilter.Operator.EQUALS, "abcdef",  attributeDefinition, false);
+		doMatch(filter, false);
+		
+		// A missing AD should always yield false for equals
+		filter = new StringFilter(IFilter.Operator.EQUALS, "",  attributeDefinition, false);
+		doMatch(filter, false);
+		
+		// A missing AD should always yield true for not_equals
+		filter = new StringFilter(IFilter.Operator.NOT_EQUALS, "",  attributeDefinition, false);
+		doMatch(filter, true);
+		
+		// A missing AD should always yield false for contains
+		filter = new StringFilter(IFilter.Operator.CONTAINS, "",  attributeDefinition, false);
+		doMatch(filter, false);
+		
+		// A missing AD should always yield true for not_contains
+		filter = new StringFilter(IFilter.Operator.NOT_CONTAINS, "",  attributeDefinition, false);
+		doMatch(filter, true);
+		
+		// apply Regexp to empty string
+		filter = new StringFilter(IFilter.Operator.REGEXP, "",  attributeDefinition, false);
+		doMatch(filter, true);
+		
+		filter = new StringFilter(IFilter.Operator.REGEXP, ".*",  attributeDefinition, false);
+		doMatch(filter, true);
+		
+		filter = new StringFilter(IFilter.Operator.REGEXP, ".+",  attributeDefinition, false);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testExceptionsAttributeDefinition() throws Exception {
+		thrown.expect(IllegalArgumentException.class);
+		new StringFilter(IFilter.Operator.EQUALS, "abcdef",  (AttributeDefinitionString) null, false);
+	}
+	
+	@Test
+	public void testExceptionsInternalAttribute() throws Exception {
+		thrown.expect(IllegalArgumentException.class);
+		new StringFilter(IFilter.Operator.EQUALS, "abcdef",  (InternalAttribute) null, false);
+	}
+	
+	
+	@Test
+	public void testDefaultString() throws Exception {
+		
+		URI uri = TestData.getURI("defaultValues.reqif");
+		final Resource resource = editingDomain.getResourceSet().getResource(uri, true);
+		final ReqIF reqif = (ReqIF) resource.getContents().get(0);
+		SpecObject so0 = reqif.getCoreContent().getSpecObjects().get(0);
+		SpecObject so1 = reqif.getCoreContent().getSpecObjects().get(1);
+		
+		AttributeDefinitionString adString = null;
+		for (AttributeValue attributeValue : so0.getValues()) {
+			AttributeDefinition attributeDefinition = ReqIF10Util.getAttributeDefinition(attributeValue);
+			//System.out.println(attributeDefinition.getClass());
+			if (attributeDefinition instanceof AttributeDefinitionString) {
+				adString = (AttributeDefinitionString) attributeDefinition;
+			}
+		}
+		
+		StringFilter stringFilter = new StringFilter(Operator.EQUALS, "the default description value", adString, true);
+		assertFalse(stringFilter.match(so0));
+		assertTrue(stringFilter.match(so1));
+		
+	}
+	
+	
+	@Test
+	public void testIsSet() throws Exception {
+		StringFilter filter;
+		
+		filter = new StringFilter(IFilter.Operator.IS_SET, null,  attributeDefinition, false);
+		doMatch(filter, true);
+		
+		AttributeDefinitionString attributeDefinition2 = ReqIF10Factory.eINSTANCE.createAttributeDefinitionString();
+		attributeDefinition2.setIdentifier("AD_ID1");
+		
+		filter = new StringFilter(IFilter.Operator.IS_SET, null,  attributeDefinition2, false);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void testIsNotSet() throws Exception {
+		StringFilter filter;
+		
+		filter = new StringFilter(IFilter.Operator.IS_NOT_SET, null,  attributeDefinition, false);
+		doMatch(filter, false);
+		
+		AttributeDefinitionString attributeDefinition2 = ReqIF10Factory.eINSTANCE.createAttributeDefinitionString();
+		attributeDefinition2.setIdentifier("AD_ID1");
+		
+		filter = new StringFilter(IFilter.Operator.IS_NOT_SET, null,  attributeDefinition2, false);
+		doMatch(filter, false);
+	}
+	
+	
+	@Test
+	public void isSetInternal() throws Exception {
+		StringFilter filter; 
+		
+		filter = new StringFilter(IFilter.Operator.IS_SET, "", AbstractTextFilter.InternalAttribute.DESC, false);
+		doMatch(filter, true);
+		filter = new StringFilter(IFilter.Operator.IS_SET, "", AbstractTextFilter.InternalAttribute.IDENTIFIER, false);
+		doMatch(filter, true);
+		filter = new StringFilter(IFilter.Operator.IS_SET, "", AbstractTextFilter.InternalAttribute.LONG_NAME, false);
+		doMatch(filter, true);
+		
+		filter = new StringFilter(IFilter.Operator.IS_NOT_SET, "", AbstractTextFilter.InternalAttribute.DESC, false);
+		doMatch(filter, false);
+		filter = new StringFilter(IFilter.Operator.IS_NOT_SET, "", AbstractTextFilter.InternalAttribute.IDENTIFIER, false);
+		doMatch(filter, false);
+		filter = new StringFilter(IFilter.Operator.IS_NOT_SET, "", AbstractTextFilter.InternalAttribute.LONG_NAME, false);
+		doMatch(filter, false);
+		
+		SpecElementWithAttributes specObject = getFixture();
+		specObject.setDesc(null);
+		specObject.setLongName(null);
+		specObject.setIdentifier(null);
+		
+		filter = new StringFilter(IFilter.Operator.IS_SET, "", AbstractTextFilter.InternalAttribute.DESC, false);
+		doMatch(filter, false);
+		filter = new StringFilter(IFilter.Operator.IS_SET, "", AbstractTextFilter.InternalAttribute.IDENTIFIER, false);
+		doMatch(filter, false);
+		filter = new StringFilter(IFilter.Operator.IS_SET, "", AbstractTextFilter.InternalAttribute.LONG_NAME, false);
+		doMatch(filter, false);
+		
+		filter = new StringFilter(IFilter.Operator.IS_NOT_SET, "", AbstractTextFilter.InternalAttribute.DESC, false);
+		doMatch(filter, true);
+		filter = new StringFilter(IFilter.Operator.IS_NOT_SET, "", AbstractTextFilter.InternalAttribute.IDENTIFIER, false);
+		doMatch(filter, true);
+		filter = new StringFilter(IFilter.Operator.IS_NOT_SET, "", AbstractTextFilter.InternalAttribute.LONG_NAME, false);
+		doMatch(filter, true);
+	}
+	
+	
+	@Override
+	public Set<Operator> getSupportedOperators() {
+		return StringFilter.SUPPORTED_OPERATORS; 
+	}
+
+
+	@Override
+	public IFilter createFilterInstance(Operator operator) {
+		return new StringFilter(operator, "", attributeDefinition, true);
+	}
+
+
+	
+
+	@Override
+	public void createFixture(Object value) {
+		String theValue = (String) value;
+		
+		attributeDefinition = ReqIF10Factory.eINSTANCE.createAttributeDefinitionString();
+		attributeDefinition.setIdentifier("AD_ID0");
+		DatatypeDefinitionString definition = ReqIF10Factory.eINSTANCE.createDatatypeDefinitionString();
+		definition.setIdentifier("DD_ID0");
+		attributeDefinition.setType(definition);
+		AttributeValueString attributeValue = ReqIF10Factory.eINSTANCE.createAttributeValueString();
+		attributeValue.setDefinition(attributeDefinition);
+		attributeValue.setTheValue(theValue);
+		SpecObject specObject = ReqIF10Factory.eINSTANCE.createSpecObject();
+		specObject.getValues().add(attributeValue);
+		specObject.setLastChange(new GregorianCalendar(2014, 12, 03));
+		specObject.setIdentifier("THE_SPECOBJECT_ID");
+		specObject.setDesc("THE_SPECOBJECT_DESC");
+		specObject.setLongName("THE_SPECOBJECT_LONG_NAME");
+		
+		createSpecObjectType(specObject, attributeDefinition);
+		
+		setFixture(specObject);
+	}
+	
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/XhtmlFilterDefaultsTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/XhtmlFilterDefaultsTest.java
new file mode 100644
index 0000000..19c3d80
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/XhtmlFilterDefaultsTest.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.test;
+
+import static org.junit.Assert.fail;
+
+import java.net.URISyntaxException;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.rmf.reqif10.AttributeDefinitionXHTML;
+import org.eclipse.rmf.reqif10.ReqIF;
+import org.eclipse.rmf.reqif10.search.testdata.TestData;
+import org.junit.Test;
+
+public class XhtmlFilterDefaultsTest extends XhtmlFilterTest {
+
+	@Test
+	public void testOnEmptyAttribute() throws Exception {
+		// Do nothing, since this test will fall back on default values 
+	}
+	
+	
+	/*
+	 * The Value in this reqif is:
+	 * <xhtml:div><xhtml:p style="text-align: left">hello</xhtml:p><xhtml:p style=" text-align: left">world</xhtml:p></xhtml:div>
+	 * 
+	 * (non-Javadoc)
+	 * @see org.eclipse.rmf.reqif10.search.test.AbstractFilterTest#createFixture(java.lang.Object)
+	 */
+	@Override
+	public void createFixture(Object value) {
+		try {
+			URI uri = TestData.getURI("xhtml_with_defaultValues.reqif");
+			//URI uri = TestData.getURI("simplexhtml.reqif");
+			final Resource resource = editingDomain.getResourceSet().getResource(uri, true);
+			final ReqIF reqif = (ReqIF) resource.getContents().get(0);
+			specObject = reqif.getCoreContent().getSpecObjects().get(0);
+			
+			attributeDefinition = (AttributeDefinitionXHTML) reqif.getCoreContent().getSpecTypes().get(0).getSpecAttributes().get(1);
+			
+			if (value == null){
+				attributeDefinition.getDefaultValue().setTheValue(null);
+			}
+			
+			setFixture(specObject);
+		} catch (URISyntaxException e) {
+			e.printStackTrace();
+			fail("Could not load testdata");
+		}
+	}
+
+	
+	@Override
+	public void testIsSet() throws Exception {
+		// super would fail because of the changed fixture
+	}
+
+	@Override
+	public void testIsNotSet() throws Exception {
+		// super would fail because of the changed fixture
+	}
+	
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/XhtmlFilterTest.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/XhtmlFilterTest.java
new file mode 100644
index 0000000..5d430f4
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/test/XhtmlFilterTest.java
@@ -0,0 +1,225 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ *     Michael Jastram - adding SUPPORTED_OPERATIONS
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.test;
+
+import static org.junit.Assert.fail;
+
+import java.net.URISyntaxException;
+import java.util.Set;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.rmf.reqif10.AttributeDefinitionString;
+import org.eclipse.rmf.reqif10.AttributeDefinitionXHTML;
+import org.eclipse.rmf.reqif10.AttributeValueXHTML;
+import org.eclipse.rmf.reqif10.ReqIF;
+import org.eclipse.rmf.reqif10.ReqIF10Factory;
+import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.rmf.reqif10.search.filter.StringFilter;
+import org.eclipse.rmf.reqif10.search.filter.XhtmlFilter;
+import org.eclipse.rmf.reqif10.search.testdata.TestData;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class XhtmlFilterTest extends AbstractFilterTest{
+
+	SpecObject specObject;
+	AttributeDefinitionXHTML attributeDefinition; 
+
+	@Rule public ExpectedException thrown= ExpectedException.none();
+	
+	@Before
+	public void seUp(){
+		createFixture("");
+	}
+		
+	
+	@Test
+	public void testContains() throws Exception {
+		XhtmlFilter xhtmlFilter;
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.CONTAINS, "hello",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.CONTAINS, "HELLO",  attributeDefinition, false);
+		doMatch(xhtmlFilter, true);
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.CONTAINS, "HELLO",  attributeDefinition, true);
+		doMatch(xhtmlFilter, false);
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.CONTAINS, "<xhtml:p",  attributeDefinition, false);
+		doMatch(xhtmlFilter, true);
+	}
+	
+	
+	@Test
+	public void testNotContains() throws Exception {
+		XhtmlFilter xhtmlFilter;
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.NOT_CONTAINS, "hello",  attributeDefinition, true);
+		doMatch(xhtmlFilter, false);
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.NOT_CONTAINS, "HELLO",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.NOT_CONTAINS, "NOTHING",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+	}
+	
+
+	
+	@Test
+	public void testRegExp() throws Exception {
+		XhtmlFilter xhtmlFilter;
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.REGEXP, "<xhtml:p.*>hel+o",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.REGEXP, "NOTHING",  attributeDefinition, true);
+		doMatch(xhtmlFilter, false);
+	}
+
+	@Test
+	public void testRegExpPlain() throws Exception {
+		XhtmlFilter xhtmlFilter;
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.REGEXP_PLAIN, "hello",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.REGEXP_PLAIN, "hello\\s* world",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.REGEXP_PLAIN, "hello.*world",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+	}	
+	
+	@Test
+	public void testIsSet() throws Exception {
+		XhtmlFilter xhtmlFilter;
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.IS_SET, "hello",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+		
+		AttributeDefinitionXHTML attributeDefinition2 = ReqIF10Factory.eINSTANCE.createAttributeDefinitionXHTML();
+		attributeDefinition2.setIdentifier("AD_ID1");
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.IS_SET, "hello",  attributeDefinition2, true);
+		doMatch(xhtmlFilter, false);
+	}
+	
+	@Test
+	public void testIsNotSet() throws Exception {
+		XhtmlFilter xhtmlFilter;
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.IS_NOT_SET, "hello",  attributeDefinition, true);
+		doMatch(xhtmlFilter, false);
+		
+		AttributeDefinitionXHTML attributeDefinition2 = ReqIF10Factory.eINSTANCE.createAttributeDefinitionXHTML();
+		attributeDefinition2.setIdentifier("AD_ID1");
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.IS_NOT_SET, "hello",  attributeDefinition2, true);
+		doMatch(xhtmlFilter, false);
+	}
+
+
+	@Test
+	public void testExceptionsAttributeDefinition() throws Exception {
+		thrown.expect(IllegalArgumentException.class);
+		new StringFilter(IFilter.Operator.EQUALS, "abcdef",  (AttributeDefinitionString) null, false);
+	}
+	
+	
+	@Override
+	public Set<Operator> getSupportedOperators() {
+		return XhtmlFilter.SUPPORTED_OPERATORS;
+	}
+
+
+	@Override
+	public IFilter createFilterInstance(Operator operator) {
+		return new XhtmlFilter(operator, "", attributeDefinition, true);
+	}
+
+
+	@Override
+	public void doEmptyTest() throws Exception {
+		XhtmlFilter xhtmlFilter;
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.CONTAINS, "hello",  attributeDefinition, true);
+		doMatch(xhtmlFilter, false);
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.CONTAINS, "HELLO",  attributeDefinition, false);
+		doMatch(xhtmlFilter, false);
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.CONTAINS, "HELLO",  attributeDefinition, true);
+		doMatch(xhtmlFilter, false);
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.CONTAINS, "<xhtml:p",  attributeDefinition, false);
+		doMatch(xhtmlFilter, false);
+		
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.NOT_CONTAINS, "hello",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.NOT_CONTAINS, "HELLO",  attributeDefinition, false);
+		doMatch(xhtmlFilter, true);
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.NOT_CONTAINS, "NOTHING",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.REGEXP, "<xhtml:p.*>hel+o",  attributeDefinition, true);
+		doMatch(xhtmlFilter, false);
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.REGEXP, "x*",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.REGEXP, "",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+		
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.REGEXP_PLAIN, "h",  attributeDefinition, true);
+		doMatch(xhtmlFilter, false);
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.REGEXP_PLAIN, "x*",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+		xhtmlFilter = new XhtmlFilter(IFilter.Operator.REGEXP_PLAIN, "",  attributeDefinition, true);
+		doMatch(xhtmlFilter, true);
+	}
+
+	/*
+	 * The Value in this reqif is:
+	 * <xhtml:div><xhtml:p style="text-align: left">hello</xhtml:p><xhtml:p style=" text-align: left">world</xhtml:p></xhtml:div>
+	 * 
+	 * (non-Javadoc)
+	 * @see org.eclipse.rmf.reqif10.search.test.AbstractFilterTest#createFixture(java.lang.Object)
+	 */
+	@Override
+	public void createFixture(Object value) {
+		try {
+			URI uri = TestData.getURI("simplexhtml.reqif");
+			final Resource resource = editingDomain.getResourceSet().getResource(uri, true);
+			final ReqIF reqif = (ReqIF) resource.getContents().get(0);
+			specObject = reqif.getCoreContent().getSpecObjects().get(0);
+			AttributeValueXHTML attributeValue = (AttributeValueXHTML) specObject.getValues().get(1);
+			
+			if (value == null){
+				attributeValue.setTheValue(null);
+			}
+			
+			attributeDefinition = (AttributeDefinitionXHTML) ReqIF10Util.getAttributeDefinition(attributeValue);
+			
+			createSpecObjectType(specObject, attributeDefinition);
+			
+			setFixture(specObject);
+		} catch (URISyntaxException e) {
+			e.printStackTrace();
+			fail("Could not load testdata");
+		}
+	}
+
+		
+}
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/TestData.java b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/TestData.java
new file mode 100644
index 0000000..2427745
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/TestData.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2012 Formal Mind GmbH and University of Dusseldorf.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Michael Jastram - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.testdata;
+
+import java.net.URISyntaxException;
+
+import org.eclipse.emf.common.util.URI;
+
+/**
+ * 
+ * This class only exists to provide easy access to the RIF files in this folder.
+ * 
+ * @author jastram
+ *
+ */
+public class TestData {
+	
+	private TestData() {
+		throw new RuntimeException("Not intended for instantiation");
+	}
+	
+	/**
+	 * Retrieves the URI for the given test file.  The test file must not have any path elements and reside in the package, e.g.<p>
+	 * 
+	 * <pre>
+	 * URI resourceURI = TestData.getURI("simple.reqif");
+	 * </pre>
+	 * @param filename a path-less filename.
+	 * 
+	 * @return the URI for the file.
+	 * 
+	 * @throws URISyntaxException
+	 */
+	public static URI getURI(String filename) throws URISyntaxException {
+		return URI.createURI(TestData.class.getResource(filename).toURI().toString());
+	}
+	
+
+}
\ No newline at end of file
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/defaultValues.reqif b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/defaultValues.reqif
new file mode 100644
index 0000000..d0a8be3
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/defaultValues.reqif
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<REQ-IF xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd" xmlns:configuration="http://eclipse.org/rmf/pror/toolextensions/1.0">
+  <THE-HEADER>
+    <REQ-IF-HEADER IDENTIFIER="rmf-6b0eac91-be76-4966-8f99-b29816a73dd9">
+      <COMMENT>Created by: iw</COMMENT>
+      <CREATION-TIME>2014-12-08T15:16:35.198+01:00</CREATION-TIME>
+      <REQ-IF-TOOL-ID>ProR (http://pror.org)</REQ-IF-TOOL-ID>
+      <REQ-IF-VERSION>1.0.1</REQ-IF-VERSION>
+      <SOURCE-TOOL-ID>ProR (http://pror.org)</SOURCE-TOOL-ID>
+    </REQ-IF-HEADER>
+  </THE-HEADER>
+  <CORE-CONTENT>
+    <REQ-IF-CONTENT>
+      <DATATYPES>
+        <DATATYPE-DEFINITION-STRING IDENTIFIER="_0P8Z437kEeSfaZJzCJmPhw" LAST-CHANGE="2014-12-08T15:16:35.198+01:00" LONG-NAME="T_String32k" MAX-LENGTH="32000"/>
+      </DATATYPES>
+      <SPEC-TYPES>
+        <SPEC-OBJECT-TYPE IDENTIFIER="_0P8Z5H7kEeSfaZJzCJmPhw" LAST-CHANGE="2014-12-08T15:16:35.198+01:00" LONG-NAME="Requirement Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_0P8Z5X7kEeSfaZJzCJmPhw" LAST-CHANGE="2014-12-08T15:16:35.198+01:00" LONG-NAME="Description">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_0P8Z437kEeSfaZJzCJmPhw</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+              <DEFAULT-VALUE>
+                <ATTRIBUTE-VALUE-STRING THE-VALUE="the default description value">
+                  <DEFINITION>
+                    <ATTRIBUTE-DEFINITION-STRING-REF>_0P8Z5X7kEeSfaZJzCJmPhw</ATTRIBUTE-DEFINITION-STRING-REF>
+                  </DEFINITION>
+                </ATTRIBUTE-VALUE-STRING>
+              </DEFAULT-VALUE>
+            </ATTRIBUTE-DEFINITION-STRING>
+          </SPEC-ATTRIBUTES>
+        </SPEC-OBJECT-TYPE>
+        <SPECIFICATION-TYPE IDENTIFIER="_0P8Z5n7kEeSfaZJzCJmPhw" LAST-CHANGE="2014-12-08T15:16:35.198+01:00" LONG-NAME="Specification Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_0P9A8H7kEeSfaZJzCJmPhw" LAST-CHANGE="2014-12-08T15:16:35.198+01:00" LONG-NAME="Description">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_0P8Z437kEeSfaZJzCJmPhw</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+          </SPEC-ATTRIBUTES>
+        </SPECIFICATION-TYPE>
+      </SPEC-TYPES>
+      <SPEC-OBJECTS>
+        <SPEC-OBJECT IDENTIFIER="_0P9A8X7kEeSfaZJzCJmPhw" LAST-CHANGE="2014-12-08T15:16:35.198+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Start editing here.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_0P8Z5X7kEeSfaZJzCJmPhw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_0P8Z5H7kEeSfaZJzCJmPhw</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_3ptyEH7kEeSfaZJzCJmPhw" LAST-CHANGE="2014-12-08T15:16:53.778+01:00">
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_0P8Z5H7kEeSfaZJzCJmPhw</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+      </SPEC-OBJECTS>
+      <SPECIFICATIONS>
+        <SPECIFICATION IDENTIFIER="_0P9A837kEeSfaZJzCJmPhw" LAST-CHANGE="2014-12-08T15:16:35.198+01:00" LONG-NAME="Specification Document">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Requirements Document">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_0P9A8H7kEeSfaZJzCJmPhw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPECIFICATION-TYPE-REF>_0P8Z5n7kEeSfaZJzCJmPhw</SPECIFICATION-TYPE-REF>
+          </TYPE>
+          <CHILDREN>
+            <SPEC-HIERARCHY IDENTIFIER="_0P9A9X7kEeSfaZJzCJmPhw" LAST-CHANGE="2014-12-08T15:16:35.198+01:00">
+              <OBJECT>
+                <SPEC-OBJECT-REF>_0P9A8X7kEeSfaZJzCJmPhw</SPEC-OBJECT-REF>
+              </OBJECT>
+            </SPEC-HIERARCHY>
+            <SPEC-HIERARCHY IDENTIFIER="_3p3jEH7kEeSfaZJzCJmPhw" LAST-CHANGE="2014-12-08T15:16:53.778+01:00">
+              <OBJECT>
+                <SPEC-OBJECT-REF>_3ptyEH7kEeSfaZJzCJmPhw</SPEC-OBJECT-REF>
+              </OBJECT>
+            </SPEC-HIERARCHY>
+          </CHILDREN>
+        </SPECIFICATION>
+      </SPECIFICATIONS>
+    </REQ-IF-CONTENT>
+  </CORE-CONTENT>
+  <TOOL-EXTENSIONS>
+    <REQ-IF-TOOL-EXTENSION>
+      <configuration:ProrToolExtension>
+        <configuration:specViewConfigurations>
+          <configuration:ProrSpecViewConfiguration specification="_0P9A837kEeSfaZJzCJmPhw">
+            <configuration:columns>
+              <configuration:Column label="Description" width="400"/>
+            </configuration:columns>
+            <configuration:leftHeaderColumn>
+              <configuration:Column label="Lead Header Column" width="30"/>
+            </configuration:leftHeaderColumn>
+          </configuration:ProrSpecViewConfiguration>
+        </configuration:specViewConfigurations>
+        <configuration:generalConfiguration>
+          <configuration:ProrGeneralConfiguration>
+            <configuration:labelConfiguration>
+              <configuration:LabelConfiguration>
+                <defaultLabel>Description</defaultLabel>
+              </configuration:LabelConfiguration>
+            </configuration:labelConfiguration>
+          </configuration:ProrGeneralConfiguration>
+        </configuration:generalConfiguration>
+      </configuration:ProrToolExtension>
+    </REQ-IF-TOOL-EXTENSION>
+  </TOOL-EXTENSIONS>
+</REQ-IF>
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/simplexhtml.reqif b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/simplexhtml.reqif
new file mode 100644
index 0000000..d5e5c38
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/simplexhtml.reqif
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<REQ-IF xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd" xmlns:configuration="http://eclipse.org/rmf/pror/toolextensions/1.0" xmlns:xhtml="http://www.w3.org/1999/xhtml">
+  <THE-HEADER>
+    <REQ-IF-HEADER IDENTIFIER="769accad-0e26-41d2-b336-ce59fba43b1b">
+      <COMMENT>Created by: iw</COMMENT>
+      <CREATION-TIME>2014-12-04T17:09:36.070+01:00</CREATION-TIME>
+      <REQ-IF-TOOL-ID>ProR (http://pror.org)</REQ-IF-TOOL-ID>
+      <REQ-IF-VERSION>1.0.1</REQ-IF-VERSION>
+      <SOURCE-TOOL-ID>ProR (http://pror.org)</SOURCE-TOOL-ID>
+    </REQ-IF-HEADER>
+  </THE-HEADER>
+  <CORE-CONTENT>
+    <REQ-IF-CONTENT>
+      <DATATYPES>
+        <DATATYPE-DEFINITION-STRING IDENTIFIER="_8Q8OY3vPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00" LONG-NAME="T_String32k" MAX-LENGTH="32000"/>
+        <DATATYPE-DEFINITION-XHTML IDENTIFIER="_9FAIkHvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:39.734+01:00" LONG-NAME="T_Xhtml"/>
+      </DATATYPES>
+      <SPEC-TYPES>
+        <SPEC-OBJECT-TYPE IDENTIFIER="_8Q8OZHvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00" LONG-NAME="Requirement Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_8Q8OZXvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00" LONG-NAME="Description">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_8Q8OY3vPEeSShJpFBALhDQ</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+            <ATTRIBUTE-DEFINITION-XHTML IDENTIFIER="_-wMfEHvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:51.233+01:00" LONG-NAME="xhtml_content">
+              <TYPE>
+                <DATATYPE-DEFINITION-XHTML-REF>_9FAIkHvPEeSShJpFBALhDQ</DATATYPE-DEFINITION-XHTML-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-XHTML>
+          </SPEC-ATTRIBUTES>
+        </SPEC-OBJECT-TYPE>
+        <SPECIFICATION-TYPE IDENTIFIER="_8Q8OZnvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00" LONG-NAME="Specification Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_8Q8OZ3vPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00" LONG-NAME="Description">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_8Q8OY3vPEeSShJpFBALhDQ</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+          </SPEC-ATTRIBUTES>
+        </SPECIFICATION-TYPE>
+      </SPEC-TYPES>
+      <SPEC-OBJECTS>
+        <SPEC-OBJECT IDENTIFIER="_8Q8OaHvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:10:53.129+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Start editing here.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_8Q8OZXvPEeSShJpFBALhDQ</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-XHTML>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-XHTML-REF>_-wMfEHvPEeSShJpFBALhDQ</ATTRIBUTE-DEFINITION-XHTML-REF>
+              </DEFINITION>
+              <THE-VALUE>
+                <xhtml:div><xhtml:p style="text-align: left">hello</xhtml:p><xhtml:p style=" text-align: left">world</xhtml:p></xhtml:div>
+              </THE-VALUE>
+            </ATTRIBUTE-VALUE-XHTML>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_8Q8OZHvPEeSShJpFBALhDQ</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+      </SPEC-OBJECTS>
+      <SPECIFICATIONS>
+        <SPECIFICATION IDENTIFIER="_8Q8OanvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00" LONG-NAME="Specification Document">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Requirements Document">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_8Q8OZ3vPEeSShJpFBALhDQ</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPECIFICATION-TYPE-REF>_8Q8OZnvPEeSShJpFBALhDQ</SPECIFICATION-TYPE-REF>
+          </TYPE>
+          <CHILDREN>
+            <SPEC-HIERARCHY IDENTIFIER="_8Q81cXvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00">
+              <OBJECT>
+                <SPEC-OBJECT-REF>_8Q8OaHvPEeSShJpFBALhDQ</SPEC-OBJECT-REF>
+              </OBJECT>
+            </SPEC-HIERARCHY>
+          </CHILDREN>
+        </SPECIFICATION>
+      </SPECIFICATIONS>
+    </REQ-IF-CONTENT>
+  </CORE-CONTENT>
+  <TOOL-EXTENSIONS>
+    <REQ-IF-TOOL-EXTENSION>
+      <configuration:ProrToolExtension>
+        <configuration:specViewConfigurations>
+          <configuration:ProrSpecViewConfiguration specification="_8Q8OanvPEeSShJpFBALhDQ">
+            <configuration:columns>
+              <configuration:Column label="Description" width="300"/>
+              <configuration:Column label="xhtml_content"/>
+            </configuration:columns>
+            <configuration:leftHeaderColumn>
+              <configuration:Column label="Lead Header Column" width="30"/>
+            </configuration:leftHeaderColumn>
+          </configuration:ProrSpecViewConfiguration>
+        </configuration:specViewConfigurations>
+        <configuration:generalConfiguration>
+          <configuration:ProrGeneralConfiguration>
+            <configuration:labelConfiguration>
+              <configuration:LabelConfiguration>
+                <defaultLabel>Description</defaultLabel>
+              </configuration:LabelConfiguration>
+            </configuration:labelConfiguration>
+          </configuration:ProrGeneralConfiguration>
+        </configuration:generalConfiguration>
+        <configuration:presentationConfigurations>
+          <configuration:ProrPresentationConfigurations/>
+        </configuration:presentationConfigurations>
+      </configuration:ProrToolExtension>
+    </REQ-IF-TOOL-EXTENSION>
+  </TOOL-EXTENSIONS>
+</REQ-IF>
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/test.reqif b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/test.reqif
new file mode 100644
index 0000000..ec10d4d
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/test.reqif
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<REQ-IF xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd" xmlns:configuration="http://eclipse.org/rmf/pror/toolextensions/1.0">
+  <THE-HEADER>
+    <REQ-IF-HEADER IDENTIFIER="rmf-f3745dea-d527-4b6c-93cf-392f69bc01ef">
+      <COMMENT>Created by: iw</COMMENT>
+      <CREATION-TIME>2014-12-02T15:03:58.977+01:00</CREATION-TIME>
+      <REQ-IF-TOOL-ID>ProR (http://pror.org)</REQ-IF-TOOL-ID>
+      <REQ-IF-VERSION>1.0.1</REQ-IF-VERSION>
+      <SOURCE-TOOL-ID>ProR (http://pror.org)</SOURCE-TOOL-ID>
+    </REQ-IF-HEADER>
+  </THE-HEADER>
+  <CORE-CONTENT>
+    <REQ-IF-CONTENT>
+      <DATATYPES>
+        <DATATYPE-DEFINITION-STRING IDENTIFIER="_D8iR83osEeSxZbz_wS3a6A" LAST-CHANGE="2014-12-02T15:03:58.977+01:00" LONG-NAME="T_String32k" MAX-LENGTH="32000"/>
+      </DATATYPES>
+      <SPEC-TYPES>
+        <SPEC-OBJECT-TYPE IDENTIFIER="_D8iR9HosEeSxZbz_wS3a6A" LAST-CHANGE="2014-12-02T15:03:58.977+01:00" LONG-NAME="Requirement Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_D8iR9XosEeSxZbz_wS3a6A" LAST-CHANGE="2014-12-02T15:03:58.977+01:00" LONG-NAME="Description">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_D8iR83osEeSxZbz_wS3a6A</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+          </SPEC-ATTRIBUTES>
+        </SPEC-OBJECT-TYPE>
+        <SPECIFICATION-TYPE IDENTIFIER="_D8iR9nosEeSxZbz_wS3a6A" LAST-CHANGE="2014-12-02T15:03:58.977+01:00" LONG-NAME="Specification Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_D8iR93osEeSxZbz_wS3a6A" LAST-CHANGE="2014-12-02T15:03:58.977+01:00" LONG-NAME="Description">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_D8iR83osEeSxZbz_wS3a6A</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+          </SPEC-ATTRIBUTES>
+        </SPECIFICATION-TYPE>
+      </SPEC-TYPES>
+      <SPEC-OBJECTS>
+        <SPEC-OBJECT DESC="ABC desc" IDENTIFIER="_D8iR-HosEeSxZbz_wS3a6A" LAST-CHANGE="2014-12-02T16:48:13.455+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="ABC">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_D8iR9XosEeSxZbz_wS3a6A</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_D8iR9HosEeSxZbz_wS3a6A</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_jqZK0HosEeS4esDce-Cxdg" LAST-CHANGE="2014-12-02T16:48:17.457+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="DEF">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_D8iR9XosEeSxZbz_wS3a6A</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_D8iR9HosEeSxZbz_wS3a6A</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+      </SPEC-OBJECTS>
+      <SPECIFICATIONS>
+        <SPECIFICATION IDENTIFIER="_D8iR-nosEeSxZbz_wS3a6A" LAST-CHANGE="2014-12-02T15:03:58.977+01:00" LONG-NAME="Specification Document">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Requirements Document">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_D8iR93osEeSxZbz_wS3a6A</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPECIFICATION-TYPE-REF>_D8iR9nosEeSxZbz_wS3a6A</SPECIFICATION-TYPE-REF>
+          </TYPE>
+          <CHILDREN>
+            <SPEC-HIERARCHY IDENTIFIER="_D8iR_HosEeSxZbz_wS3a6A" LAST-CHANGE="2014-12-02T15:03:58.977+01:00">
+              <OBJECT>
+                <SPEC-OBJECT-REF>_D8iR-HosEeSxZbz_wS3a6A</SPEC-OBJECT-REF>
+              </OBJECT>
+            </SPEC-HIERARCHY>
+            <SPEC-HIERARCHY IDENTIFIER="_jqkxAHosEeS4esDce-Cxdg" LAST-CHANGE="2014-12-02T15:07:06.160+01:00">
+              <OBJECT>
+                <SPEC-OBJECT-REF>_jqZK0HosEeS4esDce-Cxdg</SPEC-OBJECT-REF>
+              </OBJECT>
+            </SPEC-HIERARCHY>
+          </CHILDREN>
+        </SPECIFICATION>
+      </SPECIFICATIONS>
+    </REQ-IF-CONTENT>
+  </CORE-CONTENT>
+  <TOOL-EXTENSIONS>
+    <REQ-IF-TOOL-EXTENSION>
+      <configuration:ProrToolExtension>
+        <configuration:specViewConfigurations>
+          <configuration:ProrSpecViewConfiguration specification="_D8iR-nosEeSxZbz_wS3a6A">
+            <configuration:columns>
+              <configuration:Column label="Description" width="400"/>
+            </configuration:columns>
+            <configuration:leftHeaderColumn>
+              <configuration:Column label="Lead Header Column" width="30"/>
+            </configuration:leftHeaderColumn>
+          </configuration:ProrSpecViewConfiguration>
+        </configuration:specViewConfigurations>
+        <configuration:generalConfiguration>
+          <configuration:ProrGeneralConfiguration>
+            <configuration:labelConfiguration>
+              <configuration:LabelConfiguration>
+                <defaultLabel>Description</defaultLabel>
+              </configuration:LabelConfiguration>
+            </configuration:labelConfiguration>
+          </configuration:ProrGeneralConfiguration>
+        </configuration:generalConfiguration>
+      </configuration:ProrToolExtension>
+    </REQ-IF-TOOL-EXTENSION>
+  </TOOL-EXTENSIONS>
+</REQ-IF>
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/testMultipleAttributes.reqif b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/testMultipleAttributes.reqif
new file mode 100644
index 0000000..72767b0
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/testMultipleAttributes.reqif
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<REQ-IF xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd" xmlns:configuration="http://eclipse.org/rmf/pror/toolextensions/1.0">
+  <THE-HEADER>
+    <REQ-IF-HEADER IDENTIFIER="rmf-c9a54daa-05ef-480b-8e04-1eae676ef1c9">
+      <COMMENT>Created by: iw</COMMENT>
+      <CREATION-TIME>2014-12-08T13:51:37.208+01:00</CREATION-TIME>
+      <REQ-IF-TOOL-ID>ProR (http://pror.org)</REQ-IF-TOOL-ID>
+      <REQ-IF-VERSION>1.0.1</REQ-IF-VERSION>
+      <SOURCE-TOOL-ID>ProR (http://pror.org)</SOURCE-TOOL-ID>
+    </REQ-IF-HEADER>
+  </THE-HEADER>
+  <CORE-CONTENT>
+    <REQ-IF-CONTENT>
+      <DATATYPES>
+        <DATATYPE-DEFINITION-STRING IDENTIFIER="_8lu2k37YEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T13:51:37.208+01:00" LONG-NAME="T_String32k" MAX-LENGTH="32000"/>
+        <DATATYPE-DEFINITION-INTEGER IDENTIFIER="_9ejU8H7YEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T13:51:41.590+01:00" LONG-NAME="T_int" MAX="100" MIN="0"/>
+        <DATATYPE-DEFINITION-DATE IDENTIFIER="_IDQCwH7ZEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T13:52:51.088+01:00" LONG-NAME="T_Date"/>
+      </DATATYPES>
+      <SPEC-TYPES>
+        <SPEC-OBJECT-TYPE IDENTIFIER="_8lu2lH7YEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T13:51:37.208+01:00" LONG-NAME="Requirement Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_8lu2lX7YEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T13:51:37.208+01:00" LONG-NAME="Description">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_8lu2k37YEeSOL5kCsWyMsg</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+            <ATTRIBUTE-DEFINITION-DATE IDENTIFIER="_J4qFMH7ZEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T13:53:04.461+01:00" LONG-NAME="theDate">
+              <TYPE>
+                <DATATYPE-DEFINITION-DATE-REF>_IDQCwH7ZEeSOL5kCsWyMsg</DATATYPE-DEFINITION-DATE-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-DATE>
+            <ATTRIBUTE-DEFINITION-INTEGER IDENTIFIER="_MdFw0H7ZEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T13:53:21.134+01:00" LONG-NAME="theInt">
+              <TYPE>
+                <DATATYPE-DEFINITION-INTEGER-REF>_9ejU8H7YEeSOL5kCsWyMsg</DATATYPE-DEFINITION-INTEGER-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-INTEGER>
+          </SPEC-ATTRIBUTES>
+        </SPEC-OBJECT-TYPE>
+        <SPECIFICATION-TYPE IDENTIFIER="_8lu2ln7YEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T13:51:37.208+01:00" LONG-NAME="Specification Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_8lu2l37YEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T13:51:37.208+01:00" LONG-NAME="Description">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_8lu2k37YEeSOL5kCsWyMsg</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+          </SPEC-ATTRIBUTES>
+        </SPECIFICATION-TYPE>
+      </SPEC-TYPES>
+      <SPEC-OBJECTS>
+        <SPEC-OBJECT IDENTIFIER="_8lu2mH7YEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T14:07:48.529+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="abc">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_8lu2lX7YEeSOL5kCsWyMsg</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-DATE THE-VALUE="2014-12-08T00:00:00.000+01:00">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-DATE-REF>_J4qFMH7ZEeSOL5kCsWyMsg</ATTRIBUTE-DEFINITION-DATE-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-DATE>
+            <ATTRIBUTE-VALUE-INTEGER THE-VALUE="3">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-INTEGER-REF>_MdFw0H7ZEeSOL5kCsWyMsg</ATTRIBUTE-DEFINITION-INTEGER-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-INTEGER>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_8lu2lH7YEeSOL5kCsWyMsg</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_N2uLUH7bEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T14:07:48.920+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="cde">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_8lu2lX7YEeSOL5kCsWyMsg</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-DATE THE-VALUE="2014-12-09T00:00:00.000+01:00">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-DATE-REF>_J4qFMH7ZEeSOL5kCsWyMsg</ATTRIBUTE-DEFINITION-DATE-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-DATE>
+            <ATTRIBUTE-VALUE-INTEGER THE-VALUE="4">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-INTEGER-REF>_MdFw0H7ZEeSOL5kCsWyMsg</ATTRIBUTE-DEFINITION-INTEGER-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-INTEGER>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_8lu2lH7YEeSOL5kCsWyMsg</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+      </SPEC-OBJECTS>
+      <SPECIFICATIONS>
+        <SPECIFICATION IDENTIFIER="_8lvdoH7YEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T13:51:37.208+01:00" LONG-NAME="Specification Document">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Requirements Document">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_8lu2l37YEeSOL5kCsWyMsg</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPECIFICATION-TYPE-REF>_8lu2ln7YEeSOL5kCsWyMsg</SPECIFICATION-TYPE-REF>
+          </TYPE>
+          <CHILDREN>
+            <SPEC-HIERARCHY IDENTIFIER="_8lvdon7YEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T13:51:37.208+01:00">
+              <OBJECT>
+                <SPEC-OBJECT-REF>_8lu2mH7YEeSOL5kCsWyMsg</SPEC-OBJECT-REF>
+              </OBJECT>
+            </SPEC-HIERARCHY>
+            <SPEC-HIERARCHY IDENTIFIER="_N24jYH7bEeSOL5kCsWyMsg" LAST-CHANGE="2014-12-08T14:07:48.921+01:00">
+              <OBJECT>
+                <SPEC-OBJECT-REF>_N2uLUH7bEeSOL5kCsWyMsg</SPEC-OBJECT-REF>
+              </OBJECT>
+            </SPEC-HIERARCHY>
+          </CHILDREN>
+        </SPECIFICATION>
+      </SPECIFICATIONS>
+    </REQ-IF-CONTENT>
+  </CORE-CONTENT>
+  <TOOL-EXTENSIONS>
+    <REQ-IF-TOOL-EXTENSION>
+      <configuration:ProrToolExtension>
+        <configuration:specViewConfigurations>
+          <configuration:ProrSpecViewConfiguration specification="_8lvdoH7YEeSOL5kCsWyMsg">
+            <configuration:columns>
+              <configuration:Column label="Description" width="250"/>
+              <configuration:Column label="theDate" width="50"/>
+              <configuration:Column label="theInt"/>
+            </configuration:columns>
+            <configuration:leftHeaderColumn>
+              <configuration:Column label="Lead Header Column" width="30"/>
+            </configuration:leftHeaderColumn>
+          </configuration:ProrSpecViewConfiguration>
+        </configuration:specViewConfigurations>
+        <configuration:generalConfiguration>
+          <configuration:ProrGeneralConfiguration>
+            <configuration:labelConfiguration>
+              <configuration:LabelConfiguration>
+                <defaultLabel>Description</defaultLabel>
+              </configuration:LabelConfiguration>
+            </configuration:labelConfiguration>
+          </configuration:ProrGeneralConfiguration>
+        </configuration:generalConfiguration>
+      </configuration:ProrToolExtension>
+    </REQ-IF-TOOL-EXTENSION>
+  </TOOL-EXTENSIONS>
+</REQ-IF>
diff --git a/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/xhtml_with_defaultValues.reqif b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/xhtml_with_defaultValues.reqif
new file mode 100644
index 0000000..cb2f647
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.test/src/org/eclipse/rmf/reqif10/search/testdata/xhtml_with_defaultValues.reqif
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<REQ-IF xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd" xmlns:configuration="http://eclipse.org/rmf/pror/toolextensions/1.0" xmlns:xhtml="http://www.w3.org/1999/xhtml">
+  <THE-HEADER>
+    <REQ-IF-HEADER IDENTIFIER="769accad-0e26-41d2-b336-ce59fba43b1b">
+      <COMMENT>Created by: iw</COMMENT>
+      <CREATION-TIME>2014-12-04T17:09:36.070+01:00</CREATION-TIME>
+      <REQ-IF-TOOL-ID>ProR (http://pror.org)</REQ-IF-TOOL-ID>
+      <REQ-IF-VERSION>1.0.1</REQ-IF-VERSION>
+      <SOURCE-TOOL-ID>ProR (http://pror.org)</SOURCE-TOOL-ID>
+    </REQ-IF-HEADER>
+  </THE-HEADER>
+  <CORE-CONTENT>
+    <REQ-IF-CONTENT>
+      <DATATYPES>
+        <DATATYPE-DEFINITION-STRING IDENTIFIER="_8Q8OY3vPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00" LONG-NAME="T_String32k" MAX-LENGTH="32000"/>
+        <DATATYPE-DEFINITION-XHTML IDENTIFIER="_9FAIkHvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:39.734+01:00" LONG-NAME="T_Xhtml"/>
+      </DATATYPES>
+      <SPEC-TYPES>
+        <SPEC-OBJECT-TYPE IDENTIFIER="_8Q8OZHvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00" LONG-NAME="Requirement Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_8Q8OZXvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00" LONG-NAME="Description">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_8Q8OY3vPEeSShJpFBALhDQ</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+            
+            
+            <ATTRIBUTE-DEFINITION-XHTML IDENTIFIER="_-wMfEHvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:51.233+01:00" LONG-NAME="xhtml_content">
+              <TYPE>
+                <DATATYPE-DEFINITION-XHTML-REF>_9FAIkHvPEeSShJpFBALhDQ</DATATYPE-DEFINITION-XHTML-REF>
+              </TYPE>
+
+			  
+			  
+              <DEFAULT-VALUE>
+                <ATTRIBUTE-VALUE-XHTML>
+                  <DEFINITION>
+                    <ATTRIBUTE-DEFINITION-XHTML-REF>_-wMfEHvPEeSShJpFBALhDQ</ATTRIBUTE-DEFINITION-XHTML-REF>
+                  </DEFINITION>
+                  <THE-VALUE>
+                    <xhtml:div><xhtml:p style="text-align: left">hello</xhtml:p><xhtml:p style=" text-align: left">world</xhtml:p></xhtml:div>
+                  </THE-VALUE>
+                </ATTRIBUTE-VALUE-XHTML>
+              </DEFAULT-VALUE>			  
+			  
+			  
+			  
+            </ATTRIBUTE-DEFINITION-XHTML>
+                        
+            
+          </SPEC-ATTRIBUTES>
+        </SPEC-OBJECT-TYPE>
+        <SPECIFICATION-TYPE IDENTIFIER="_8Q8OZnvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00" LONG-NAME="Specification Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_8Q8OZ3vPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00" LONG-NAME="Description">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_8Q8OY3vPEeSShJpFBALhDQ</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+          </SPEC-ATTRIBUTES>
+        </SPECIFICATION-TYPE>
+      </SPEC-TYPES>
+      <SPEC-OBJECTS>
+        <SPEC-OBJECT IDENTIFIER="_8Q8OaHvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:10:53.129+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Start editing here.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_8Q8OZXvPEeSShJpFBALhDQ</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-XHTML>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-XHTML-REF>_-wMfEHvPEeSShJpFBALhDQ</ATTRIBUTE-DEFINITION-XHTML-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-XHTML>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_8Q8OZHvPEeSShJpFBALhDQ</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+      </SPEC-OBJECTS>
+      <SPECIFICATIONS>
+        <SPECIFICATION IDENTIFIER="_8Q8OanvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00" LONG-NAME="Specification Document">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Requirements Document">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_8Q8OZ3vPEeSShJpFBALhDQ</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPECIFICATION-TYPE-REF>_8Q8OZnvPEeSShJpFBALhDQ</SPECIFICATION-TYPE-REF>
+          </TYPE>
+          <CHILDREN>
+            <SPEC-HIERARCHY IDENTIFIER="_8Q81cXvPEeSShJpFBALhDQ" LAST-CHANGE="2014-12-04T17:09:36.070+01:00">
+              <OBJECT>
+                <SPEC-OBJECT-REF>_8Q8OaHvPEeSShJpFBALhDQ</SPEC-OBJECT-REF>
+              </OBJECT>
+            </SPEC-HIERARCHY>
+          </CHILDREN>
+        </SPECIFICATION>
+      </SPECIFICATIONS>
+    </REQ-IF-CONTENT>
+  </CORE-CONTENT>
+  <TOOL-EXTENSIONS>
+    <REQ-IF-TOOL-EXTENSION>
+      <configuration:ProrToolExtension>
+        <configuration:specViewConfigurations>
+          <configuration:ProrSpecViewConfiguration specification="_8Q8OanvPEeSShJpFBALhDQ">
+            <configuration:columns>
+              <configuration:Column label="Description" width="300"/>
+              <configuration:Column label="xhtml_content"/>
+            </configuration:columns>
+            <configuration:leftHeaderColumn>
+              <configuration:Column label="Lead Header Column" width="30"/>
+            </configuration:leftHeaderColumn>
+          </configuration:ProrSpecViewConfiguration>
+        </configuration:specViewConfigurations>
+        <configuration:generalConfiguration>
+          <configuration:ProrGeneralConfiguration>
+            <configuration:labelConfiguration>
+              <configuration:LabelConfiguration>
+                <defaultLabel>Description</defaultLabel>
+              </configuration:LabelConfiguration>
+            </configuration:labelConfiguration>
+          </configuration:ProrGeneralConfiguration>
+        </configuration:generalConfiguration>
+        <configuration:presentationConfigurations>
+          <configuration:ProrPresentationConfigurations/>
+        </configuration:presentationConfigurations>
+      </configuration:ProrToolExtension>
+    </REQ-IF-TOOL-EXTENSION>
+  </TOOL-EXTENSIONS>
+</REQ-IF>
diff --git a/org.eclipse.rmf.reqif10.search.ui/META-INF/MANIFEST.MF b/org.eclipse.rmf.reqif10.search.ui/META-INF/MANIFEST.MF
index 9eba1ac..8fcbaad 100644
--- a/org.eclipse.rmf.reqif10.search.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.rmf.reqif10.search.ui/META-INF/MANIFEST.MF
@@ -21,5 +21,8 @@
  org.eclipse.rmf.reqif10.edit,
  org.eclipse.jface.databinding,
  org.eclipse.core.databinding.property,
- org.eclipse.rmf.reqif10.xhtml.edit
+ org.eclipse.rmf.reqif10.xhtml.edit,
+ com.google.guava,
+ org.eclipse.help,
+ org.eclipse.core.resources
 Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.rmf.reqif10.search.ui/build.properties b/org.eclipse.rmf.reqif10.search.ui/build.properties
index 15f69b6..b30ee3a 100644
--- a/org.eclipse.rmf.reqif10.search.ui/build.properties
+++ b/org.eclipse.rmf.reqif10.search.ui/build.properties
@@ -7,7 +7,8 @@
                about.html,\
                epl-v10.html,\
                notice.html,\
-               icons/
+               icons/,\
+               help-contexts.xml
 jars.compile.order = .
 source.. = src/
 output.. = bin/
diff --git a/org.eclipse.rmf.reqif10.search.ui/help-contexts.xml b/org.eclipse.rmf.reqif10.search.ui/help-contexts.xml
new file mode 100644
index 0000000..a80496b
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/help-contexts.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<contexts>
+   <context id="reqifSearchHelp" title="ReqIF Search">
+      <description>Allows you to search the active ReqIF file.  Add as many criteria as you like.  Upon search, the result will be shown in the Search View.  See the Handbook for more details.
+
+Please consult the Handbook for more information.</description>
+      <topic href="../com.formalmind.handbook/sec-search.html" label="Details on Search (right-click to open in new window)"/>
+   </context>
+</contexts>
diff --git a/org.eclipse.rmf.reqif10.search.ui/icons/full/obj16/Next_Result.png b/org.eclipse.rmf.reqif10.search.ui/icons/full/obj16/Next_Result.png
new file mode 100644
index 0000000..33a59dc
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/icons/full/obj16/Next_Result.png
Binary files differ
diff --git a/org.eclipse.rmf.reqif10.search.ui/icons/full/obj16/Prev_Result.png b/org.eclipse.rmf.reqif10.search.ui/icons/full/obj16/Prev_Result.png
new file mode 100644
index 0000000..66278e7
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/icons/full/obj16/Prev_Result.png
Binary files differ
diff --git a/org.eclipse.rmf.reqif10.search.ui/icons/full/obj16/Result.xcf b/org.eclipse.rmf.reqif10.search.ui/icons/full/obj16/Result.xcf
new file mode 100644
index 0000000..0397cb6
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/icons/full/obj16/Result.xcf
Binary files differ
diff --git a/org.eclipse.rmf.reqif10.search.ui/plugin.properties b/org.eclipse.rmf.reqif10.search.ui/plugin.properties
index 399ee84..5f64683 100644
--- a/org.eclipse.rmf.reqif10.search.ui/plugin.properties
+++ b/org.eclipse.rmf.reqif10.search.ui/plugin.properties
@@ -4,4 +4,4 @@
 providerName = Eclipse Modeling Project
 
 _UI_HorizontalOrientation_label = Horizontal orientation
-_UI_VerticalOrientation_label = Vertical orientation
\ No newline at end of file
+_UI_VerticalOrientation_label = Vertical orientation
diff --git a/org.eclipse.rmf.reqif10.search.ui/plugin.xml b/org.eclipse.rmf.reqif10.search.ui/plugin.xml
index ab01e37..af7e37c 100644
--- a/org.eclipse.rmf.reqif10.search.ui/plugin.xml
+++ b/org.eclipse.rmf.reqif10.search.ui/plugin.xml
@@ -7,6 +7,40 @@
 <plugin>
 
    <extension
+         point="org.eclipse.ui.editorActions">
+      <editorContribution
+            id="org.eclipse.rmf.reqif10.search.ui.SpecificationEditorSearchNavigation"
+            targetID="org.eclipse.rmf.reqif10.pror.SpecificationEditor">
+         <action
+               class="org.eclipse.rmf.reqif10.search.ui.ResultNavigator"
+               enablesFor="999999"
+               icon="icons/full/obj16/Next_Result.png"
+               id="org.eclipse.rmf.reqif10.search.next"
+               label="Next Search Result"
+               menubarPath="org.eclipse.rmf.reqif10MenuID/additions"
+               style="push"
+               toolbarPath="additions">
+            <class
+                  class="org.eclipse.rmf.reqif10.search.ui.ResultNavigator">
+            </class>
+         </action>
+         <action
+               class="org.eclipse.rmf.reqif10.search.ui.ResultNavigator"
+               enablesFor="999999"
+               icon="icons/full/obj16/Prev_Result.png"
+               id="org.eclipse.rmf.reqif10.search.prev"
+               label="Previous Search Result"
+               menubarPath="org.eclipse.rmf.reqif10MenuID/additions"
+               style="push"
+               toolbarPath="additions">
+            <class
+                  class="org.eclipse.rmf.reqif10.search.ui.ResultNavigator">
+            </class>
+         </action>
+      </editorContribution>
+   </extension>
+
+   <extension
          point="org.eclipse.search.searchResultViewPages">
       <viewPage
             class="org.eclipse.rmf.reqif10.search.ui.ReqIFSearchResultPage"
@@ -20,9 +54,25 @@
             class="org.eclipse.rmf.reqif10.search.ui.ReqIFSearchPage"
             icon="icons/full/obj16/ReqIf.png"
             id="org.eclipse.rmf.reqif10.search.ui.page.reqif"
-            label="ReqIF"
-            showScopeSection="true">
+            label="ReqIF Search (Raw)"
+            showScopeSection="true"
+            tabPosition="0">
+      </page>
+      <page
+            class="org.eclipse.rmf.reqif10.search.filter.ui.ReqIFSearchPage"
+            icon="icons/full/obj16/ReqIf.png"
+            id="org.eclipse.rmf.reqif10.search.filter.ui.page"
+            label="ReqIF Search"
+            searchViewHelpContextId="reqifSearchHelp"
+            showScopeSection="false"
+            tabPosition="0">
       </page>
    </extension>
-
+   <extension
+         point="org.eclipse.help.contexts">
+      <contexts
+            file="help-contexts.xml"
+            plugin="org.eclipse.rmf.reqif10.search.ui">
+      </contexts>
+   </extension>
 </plugin>
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControl.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControl.java
new file mode 100644
index 0000000..7c66509
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControl.java
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Michael Jastram - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter.ui;
+
+import java.util.List;
+import java.util.ResourceBundle;
+
+import org.eclipse.rmf.reqif10.AttributeDefinition;
+import org.eclipse.rmf.reqif10.AttributeDefinitionBoolean;
+import org.eclipse.rmf.reqif10.AttributeDefinitionDate;
+import org.eclipse.rmf.reqif10.AttributeDefinitionEnumeration;
+import org.eclipse.rmf.reqif10.AttributeDefinitionInteger;
+import org.eclipse.rmf.reqif10.AttributeDefinitionReal;
+import org.eclipse.rmf.reqif10.AttributeDefinitionString;
+import org.eclipse.rmf.reqif10.AttributeDefinitionXHTML;
+import org.eclipse.rmf.reqif10.search.filter.AbstractTextFilter;
+import org.eclipse.rmf.reqif10.search.filter.BoolFilter;
+import org.eclipse.rmf.reqif10.search.filter.DateFilter;
+import org.eclipse.rmf.reqif10.search.filter.DateFilter.InternalAttribute;
+import org.eclipse.rmf.reqif10.search.filter.EnumFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.NumberFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.swt.SWT;
+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.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * Represents the actual {@link Control} that holds the settings for the
+ * contained filter. The infrastructure manages the operator.
+ * 
+ * Also provides factory methods for building {@link FilterControl} instances.
+ * 
+ * @author jastram
+ */
+public abstract class FilterControl extends Composite {
+
+	protected IFilter templateFilter;
+	protected Object attribute;
+
+	private Combo operatorControl;
+
+	/**
+	 * New {@link FilterControl} for the given {@link #attribute}, which can be
+	 * an internal attribute or an {@link AttributeDefinition}.
+	 */
+	public FilterControl(FilterPanel parent, AttributeDefinition attribute) {
+		super(parent, SWT.FLAT);
+		this.attribute = attribute;
+		init();
+	}
+
+	public FilterControl(FilterPanel parent, InternalAttribute attribute) {
+		super(parent, SWT.FLAT);
+		this.attribute = attribute;
+		init();
+	}
+
+	public FilterControl(
+			FilterPanel parent,
+			org.eclipse.rmf.reqif10.search.filter.AbstractTextFilter.InternalAttribute attribute) {
+		super(parent, SWT.FLAT);
+		this.attribute = attribute;
+		init();
+	}
+
+	/**
+	 * New {@link FilterControl} for the given template {@link IFilter}.
+	 */
+	public FilterControl(FilterPanel parent, IFilter template) {
+		super(parent, SWT.FLAT);
+		this.templateFilter = template;
+		this.attribute = template.getAttribute();
+		init();
+	}
+
+
+
+	/**
+	 * Returns the operator selected in the GUI, never null.
+	 * 
+	 * @return
+	 */
+	protected final Operator getOperator() {
+		return getOperators().get(operatorControl.getSelectionIndex());
+	}
+
+	/**
+	 * Typical implementation:
+	 * 
+	 * <pre>
+	 * return ABCFilter.SUPPORTED_OPERATORS.asList();
+	 * </pre>
+	 */
+	protected abstract List<Operator> getOperators();
+
+	/**
+	 * Called when the operator changes. As different operators require
+	 * different numbers of values, the GUI may need to be adapted accordingly.
+	 * 
+	 * If initialize is true, the controls should be initialized from the
+	 * template.
+	 */
+	protected abstract void updateValueControls(boolean initialize);
+
+	/**
+	 * Constructs a Filter object from the current configuration of the Control.
+	 * 
+	 * @return the {@link IFilter} object.
+	 */
+	abstract public IFilter getFilter();
+
+	private void init() {
+		if (attribute == null) throw new NullPointerException();
+		setLayout(new GridLayout(3, false));
+		createOperators();
+		updateValueControls(templateFilter != null);
+	}
+
+	private void createOperators() {
+		operatorControl = new Combo(this, SWT.DROP_DOWN | SWT.BORDER
+				| SWT.READ_ONLY);
+		GridData layoutData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
+		operatorControl.setLayoutData(layoutData);
+		for (Operator operator : getOperators()) {
+			operatorControl.add(operator.toLocaleString());
+		}
+		operatorControl.select(0);
+		if (templateFilter != null) {
+			operatorControl.select(getOperators().indexOf(
+					templateFilter.getOperator()));
+		}
+
+		operatorControl.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				updateValueControls(false);
+				layout(true);
+			}
+		});
+	}
+
+	// //////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * This factory instantiates the correct FilterControl for a given filter.
+	 */
+	public static FilterControl createFilterControl(FilterPanel parent,
+			IFilter filter) {
+		if (filter instanceof AbstractTextFilter)
+			return new FilterControlString(parent, (AbstractTextFilter) filter);
+		if (filter instanceof DateFilter)
+			return new FilterControlDate(parent, (DateFilter) filter);
+		if (filter instanceof NumberFilter)
+			return new FilterControlNumber(parent, (NumberFilter) filter);
+		if (filter instanceof BoolFilter)
+			return new FilterControlBoolean(parent, (BoolFilter) filter);
+		if (filter instanceof EnumFilter)
+			return new FilterControlEnum(parent, (EnumFilter) filter);
+
+		throw new IllegalArgumentException("Don't know how to create: "
+				+ filter);
+	}
+
+	/**
+	 * This factory instantiates the correct FilterControl for a given filter.
+	 */
+	public static FilterControl createFilterControl(FilterPanel parent,
+			AbstractTextFilter.InternalAttribute internalTextAttribute) {
+		return new FilterControlString(parent, internalTextAttribute);
+	}
+
+	/**
+	 * This factory instantiates the correct FilterControl for a given filter.
+	 */
+	public static FilterControl createFilterControl(FilterPanel parent,
+			DateFilter.InternalAttribute internalDateAttribute) {
+		return new FilterControlDate(parent, internalDateAttribute);
+	}
+
+	/**
+	 * This factory instantiates the correct FilterControl for a given filter.
+	 */
+	public static FilterControl createFilterControl(FilterPanel parent,
+			AttributeDefinition attribute) {
+		if (attribute instanceof AttributeDefinitionString
+				|| attribute instanceof AttributeDefinitionXHTML) {
+			return new FilterControlString(parent, attribute);
+		} else if (attribute instanceof AttributeDefinitionInteger
+				|| attribute instanceof AttributeDefinitionReal) {
+			return new FilterControlNumber(parent, attribute);
+		} else if (attribute instanceof AttributeDefinitionDate) {
+			return new FilterControlDate(parent,
+					(AttributeDefinitionDate) attribute);
+		} else if (attribute instanceof AttributeDefinitionBoolean) {
+			return new FilterControlBoolean(parent,
+					(AttributeDefinitionBoolean) attribute);
+		} else if (attribute instanceof AttributeDefinitionEnumeration) {
+			return new FilterControlEnum(parent,
+					(AttributeDefinitionEnumeration) attribute);
+		}
+		throw new IllegalArgumentException("Don't know how to create (yet): "
+				+ attribute);
+	}
+
+	/**
+	 * This method retrieves a value from the Plugin.
+	 */
+	public static String getString(String key) {
+		// Note that ResourceBundle has nothing to do with Eclipse. But it's a
+		// convenient
+		// means of accessing plugin.properties, which we need anyway.
+		return ResourceBundle.getBundle("plugin").getString(key);
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlBoolean.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlBoolean.java
new file mode 100644
index 0000000..654d579
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlBoolean.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Michael Jastram - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter.ui;
+
+import java.util.List;
+
+import org.eclipse.rmf.reqif10.AttributeDefinitionBoolean;
+import org.eclipse.rmf.reqif10.search.filter.BoolFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Combo;
+
+/**
+ * Used for Boolean
+ * 
+ * @author jastram
+ */
+public class FilterControlBoolean extends FilterControl {
+	
+	private Combo valueControl;
+
+	public FilterControlBoolean(FilterPanel parent,
+			AttributeDefinitionBoolean attribute) {
+		super(parent, attribute);
+	}
+
+	public FilterControlBoolean(FilterPanel parent, BoolFilter template) {
+		super(parent, template);
+	}
+
+	protected void updateValueControls(boolean initialize) {
+		if (getOperator() == Operator.IS_SET || getOperator() == Operator.IS_NOT_SET) {
+			showValueControl(false);			
+		} else {
+			showValueControl(true);
+			if (initialize) {
+				Boolean defaultValue = (Boolean) templateFilter.getFilterValue1();
+				valueControl.select(Boolean.TRUE.equals(defaultValue) ? 1 : 0);
+			}
+		}		
+		layout();
+	}
+
+	private void showValueControl(boolean show) {
+		if (show && valueControl == null) {
+			valueControl = new Combo(this, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
+			valueControl.add("FALSE"); // index: 0
+			valueControl.add("TRUE");  // index: 1
+			valueControl.select(0);
+			GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+			valueControl.setLayoutData(layoutData);			
+		} else if (!show && valueControl != null) {
+			valueControl.dispose();
+			valueControl = null;
+		}
+	}
+
+	public IFilter getFilter() {
+		Boolean value = valueControl == null ? null : new Boolean(valueControl.getSelectionIndex() == 1);
+		return new BoolFilter(getOperator(), value, (AttributeDefinitionBoolean) attribute);
+	}
+
+	@Override
+	protected List<Operator> getOperators() {
+		return BoolFilter.SUPPORTED_OPERATORS.asList();
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlDate.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlDate.java
new file mode 100644
index 0000000..d16e8a3
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlDate.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Michael Jastram - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter.ui;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+import org.eclipse.rmf.reqif10.AttributeDefinitionDate;
+import org.eclipse.rmf.reqif10.search.filter.DateFilter;
+import org.eclipse.rmf.reqif10.search.filter.DateFilter.InternalAttribute;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.DateTime;
+
+public class FilterControlDate extends FilterControl {
+
+	private DateTime control[];
+
+	public FilterControlDate(FilterPanel parent, DateFilter.InternalAttribute attribute) {
+		super(parent, attribute);
+	}
+
+	public FilterControlDate(FilterPanel parent,
+			AttributeDefinitionDate attribute) {
+		super(parent, attribute);
+	}
+
+	public FilterControlDate(FilterPanel parent, DateFilter template) {
+		super(parent, template);		
+	}
+
+	@Override
+	protected List<Operator> getOperators() {
+		return DateFilter.SUPPORTED_OPERATORS.asList();
+	}
+
+	@Override
+	protected void updateValueControls(boolean initialize) {
+		if (getOperator() == Operator.IS_SET
+				|| getOperator() == Operator.IS_NOT_SET) {
+			showControl(0, false);
+			showControl(1, false);
+		}
+		else if (getOperator() == Operator.BETWEEN) {
+			showControl(0, true);
+			showControl(1, true);
+		} else {
+			showControl(0, true);
+			showControl(1, false);
+		}
+		
+		if (initialize) {
+			if (control[0] != null) {
+				GregorianCalendar cal = (GregorianCalendar) templateFilter.getFilterValue1();
+				control[0].setDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));
+			}
+			if (control[1] != null) {
+				GregorianCalendar cal = (GregorianCalendar) templateFilter.getFilterValue2();
+				control[1].setDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));
+			}
+		}
+
+		layout();
+	}
+
+	private void showControl(int controlId, boolean show) {
+		 if (control == null) control = new DateTime[2];
+		 
+		if (show && control[controlId] == null) {
+			control[controlId] = new DateTime(this, SWT.DATE | SWT.DROP_DOWN | SWT.BORDER);
+			GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+			control[controlId].setLayoutData(layoutData);
+		} 
+		if (! show && control[controlId] != null) {
+			control[controlId].dispose();
+			control[controlId] = null;
+		}
+	}
+
+	@Override
+	public IFilter getFilter() {
+		GregorianCalendar value1 = control[0] == null ? null
+				: new GregorianCalendar(control[0].getYear(),
+						control[0].getMonth(), control[0].getDay());
+		GregorianCalendar value2 = control[1] == null ? null
+				: new GregorianCalendar(control[1].getYear(),
+						control[1].getMonth(), control[1].getDay());
+		if (attribute instanceof InternalAttribute) {
+			return new DateFilter(getOperator(), value1, value2,
+					(InternalAttribute) attribute);
+		} else {
+			return new DateFilter(getOperator(), value1, value2,
+					(AttributeDefinitionDate) attribute);
+		}
+	}
+}
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlEnum.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlEnum.java
new file mode 100644
index 0000000..d136e55
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlEnum.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Michael Jastram - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter.ui;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.rmf.reqif10.AttributeDefinitionEnumeration;
+import org.eclipse.rmf.reqif10.EnumValue;
+import org.eclipse.rmf.reqif10.pror.editor.presentation.EnumSelector;
+import org.eclipse.rmf.reqif10.search.filter.EnumFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Used for plain text and XHTML
+ * 
+ * @author jastram
+ */
+public class FilterControlEnum extends FilterControl {
+	
+	private Button valueControl;
+	private Collection<EnumValue> items;
+
+	public FilterControlEnum(FilterPanel parent,
+			AttributeDefinitionEnumeration attribute) {
+		super(parent, attribute);
+	}
+
+	public FilterControlEnum(FilterPanel parent, EnumFilter template) {
+		super(parent, template);
+	}
+
+	@Override
+	protected List<Operator> getOperators() {
+		return EnumFilter.SUPPORTED_OPERATORS.asList();
+	}
+
+	@Override
+	protected void updateValueControls(boolean initialize) {
+		if (getOperator() == Operator.IS_SET
+				|| getOperator() == Operator.IS_NOT_SET) {
+			showControl(false);
+		} else {
+			showControl(true);
+		}
+		if (initialize) {
+			if (valueControl != null) {
+				updateItems(((EnumFilter)templateFilter).getFilterValue1());
+			}
+		}
+	}
+
+	private void showControl(boolean show) {
+		if (show && valueControl == null) {
+			if (items == null) items = new ArrayList<EnumValue>();
+
+			valueControl = new Button(this, SWT.PUSH | SWT.FLAT | SWT.WRAP);
+			GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+			layoutData.widthHint = 200;
+			valueControl.setLayoutData(layoutData);
+			valueControl.addSelectionListener(new SelectionAdapter() {
+				@Override
+				public void widgetSelected(SelectionEvent e) {
+					popupSelector(valueControl);
+				}
+			});
+		}
+		if (!show && valueControl != null) {
+			valueControl.dispose();
+			valueControl = null;
+			items = null;
+		}
+	}
+
+	protected void popupSelector(Control control) {
+		EList<EnumValue> specifiedValues = ((AttributeDefinitionEnumeration) attribute)
+				.getType().getSpecifiedValues();
+		Shell shell = EnumSelector.createShell(control);
+		EnumSelector selector = new EnumSelector(specifiedValues, items, shell,
+				SWT.BORDER);
+		int status = selector.showEnumSelector(shell);
+		if (status == SWT.OK) {
+			updateItems(selector.getItems());
+		}
+	}
+
+	private void updateItems(Collection<EnumValue> items) {
+		EList<EnumValue> specifiedValues = ((AttributeDefinitionEnumeration) attribute)
+				.getType().getSpecifiedValues();
+		this.items = items;
+		StringBuilder sb = new StringBuilder();
+		for (Iterator<EnumValue> i = items.iterator(); i.hasNext();) {
+			EnumValue value = i.next();
+
+			// In case items have been removed
+			if (! specifiedValues.contains(value)) continue;
+
+			String label = value.getLongName() != null ? value.getLongName() : value.getIdentifier(); 
+			sb.append(label);
+			if (i.hasNext()) sb.append(", ");
+		}
+		valueControl.setText(sb.toString());
+		layout();
+		getParent().layout();
+		getParent().getParent().layout();
+	}
+
+	public IFilter getFilter() {
+		return new EnumFilter(getOperator(), items,
+				(AttributeDefinitionEnumeration) attribute);
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlNumber.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlNumber.java
new file mode 100644
index 0000000..332b6b9
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlNumber.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Michael Jastram - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter.ui;
+
+import java.math.BigInteger;
+import java.util.List;
+
+import org.eclipse.rmf.reqif10.AttributeDefinition;
+import org.eclipse.rmf.reqif10.AttributeDefinitionReal;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.rmf.reqif10.search.filter.NumberFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.events.VerifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Spinner;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * This control handles Integers and Reals.
+
+ * @author jastram
+ */
+public class FilterControlNumber extends FilterControl {
+
+	private NumberControl control[];
+
+	public FilterControlNumber(FilterPanel parent,
+			AttributeDefinition attribute) {
+		super(parent, attribute);
+	}
+
+	public FilterControlNumber(FilterPanel parent, NumberFilter template) {
+		super(parent, template);
+	}
+	
+		
+	@Override
+	protected List<Operator> getOperators() {
+		return NumberFilter.SUPPORTED_OPERATORS.asList();	}
+
+	@Override
+	protected void updateValueControls(boolean initialize) {
+		if (getOperator() == Operator.IS_SET
+				|| getOperator() == Operator.IS_NOT_SET) {
+			showControl(0, false);
+			showControl(1, false);
+		}
+		else if (getOperator() == Operator.BETWEEN) {
+			showControl(0, true);
+			showControl(1, true);
+		} else {
+			showControl(0, true);
+			showControl(1, false);
+		}
+		
+		if (initialize) {
+			if (templateFilter.getFilterValue1() != null) {
+				control[0].setValue((Number) templateFilter.getFilterValue1());
+			}
+			if (templateFilter.getFilterValue2() != null) {
+				control[1].setValue((Number) templateFilter.getFilterValue2());
+			}
+		}
+
+		layout();
+	}
+	
+	private void showControl(int controlId, boolean show) {
+		 if (control == null) control = new NumberControl[2];
+		 
+		if (show && control[controlId] == null) {
+			control[controlId] = new NumberControl(this, attribute instanceof AttributeDefinitionReal);
+			GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+			control[controlId].getControl().setLayoutData(layoutData);
+		} 
+		if (! show && control[controlId] != null) {
+			control[controlId].getControl().dispose();
+			control[controlId] = null;
+		}
+	}
+
+	@Override
+	public IFilter getFilter() {
+		Number value1 = control[0] == null ? null : control[0].getNumber();
+		Number value2 = control[1] == null ? null : control[1].getNumber();
+		return new NumberFilter(getOperator(), value1, value2, (AttributeDefinition)attribute);
+	}
+}
+
+/**
+ * We need to build our own control, rather than using {@link Spinner}, because
+ * Spinner is a total hack with far too many limitations :-(
+ * 
+ * @author jastram
+ */
+class NumberControl {
+
+	private boolean isReal;
+	private Text text;
+
+	public NumberControl(Composite parent, boolean isReal) {
+		text = new Text(parent, SWT.BORDER | SWT.FILL);
+		this.isReal = isReal;
+		text.setText("0");
+		addValidator();
+	}
+	
+	public Text getControl() {
+		return text;
+	}
+
+	private void addValidator() {
+		text.addVerifyListener(new VerifyListener() {
+			@Override
+			public void verifyText(VerifyEvent e) {
+				final String oldS = text.getText();
+				final String newS = oldS.substring(0, e.start) + e.text
+						+ oldS.substring(e.end);
+				
+				// We allow an empty String
+				if (newS.length() == 0) return;
+
+				try {
+					if (isReal) {
+						new Double(newS);
+					} else {
+						new BigInteger(newS);
+					}
+				} catch (final NumberFormatException numberFormatException) {
+					// value is not decimal
+					e.doit = false;
+				}
+			}
+		});
+	}
+
+	public Number getNumber() {
+		if (text.getText().length() == 0 ) text.setText("0");
+		return isReal ? new Double(text.getText()) : new BigInteger(text.getText());		
+	}
+
+	public void setValue(Number value) {
+		text.setText(value.toString());
+	}
+	
+}
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlString.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlString.java
new file mode 100644
index 0000000..ea0ff54
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterControlString.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Michael Jastram - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter.ui;
+
+import java.util.List;
+
+import org.eclipse.rmf.reqif10.AttributeDefinition;
+import org.eclipse.rmf.reqif10.AttributeDefinitionString;
+import org.eclipse.rmf.reqif10.AttributeDefinitionXHTML;
+import org.eclipse.rmf.reqif10.search.filter.AbstractTextFilter;
+import org.eclipse.rmf.reqif10.search.filter.AbstractTextFilter.InternalAttribute;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter.Operator;
+import org.eclipse.rmf.reqif10.search.filter.StringFilter;
+import org.eclipse.rmf.reqif10.search.filter.XhtmlFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Used for plain text and XHTML
+ * 
+ * @author jastram
+ */
+public class FilterControlString extends FilterControl {
+
+	private Text text;
+	private Button caseSensitive;
+
+	public FilterControlString(FilterPanel parent, StringFilter.InternalAttribute attribute) {
+		super(parent, attribute);
+	}
+
+	public FilterControlString(FilterPanel parent,
+			AttributeDefinition attribute) {
+		super(parent, attribute);
+	}
+
+	public FilterControlString(FilterPanel parent, AbstractTextFilter template) {
+		super(parent, template);
+	}
+
+	@Override
+	protected List<Operator> getOperators() {
+		if (attribute instanceof AttributeDefinitionXHTML) {
+			return XhtmlFilter.SUPPORTED_OPERATORS.asList();
+		} else {
+			return StringFilter.SUPPORTED_OPERATORS.asList();
+		}
+	}
+
+	@Override
+	protected void updateValueControls(boolean initialize) {
+		if (getOperator() == Operator.IS_SET
+				|| getOperator() == Operator.IS_NOT_SET) {
+			showControl(false);
+		} else {
+			showControl(true);
+		}
+		if (initialize) {
+			if (text != null) {
+				caseSensitive.setSelection(((AbstractTextFilter) templateFilter)
+						.isCaseSensitive());
+				text.setText((String) templateFilter.getFilterValue1());
+	
+			}
+		}
+	}
+
+	private void showControl(boolean show) {
+		if (show && text == null) {
+			caseSensitive = new Button(this, SWT.CHECK);
+			caseSensitive.setText("Aa");
+			caseSensitive.setToolTipText("Case Sensitive");
+			GridData layoutData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
+			caseSensitive.setLayoutData(layoutData);
+			
+			text = new Text(this, SWT.SINGLE | SWT.BORDER | SWT.FILL);
+			layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+			text.setLayoutData(layoutData);
+		}
+		if (!show && text != null) {
+			text.dispose();
+			text = null;
+			caseSensitive.dispose();
+			caseSensitive = null;
+		}
+	}
+
+	public IFilter getFilter() {
+		String value = text == null ? null : text.getText();
+		boolean cv = caseSensitive == null ? false : caseSensitive.getSelection();
+		
+		if (attribute instanceof InternalAttribute) {
+			return new StringFilter(getOperator(), value, (InternalAttribute) attribute, cv);
+		} else if (attribute instanceof AttributeDefinitionString) {
+			return new StringFilter(getOperator(), value, (AttributeDefinitionString) attribute, cv);
+		} else if (attribute instanceof AttributeDefinitionXHTML) {
+			return new XhtmlFilter(getOperator(), value, (AttributeDefinitionXHTML) attribute, cv);
+		} else {
+			throw new IllegalStateException("Can't handle: " + attribute);
+		}
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterPanel.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterPanel.java
new file mode 100644
index 0000000..9a5da1f
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterPanel.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Michael Jastram - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter.ui;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.rmf.reqif10.AttributeDefinition;
+import org.eclipse.rmf.reqif10.ReqIF;
+import org.eclipse.rmf.reqif10.SpecType;
+import org.eclipse.rmf.reqif10.search.filter.AbstractTextFilter;
+import org.eclipse.rmf.reqif10.search.filter.DateFilter;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.StringFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+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;
+
+/**
+ * The {@link FilterPanel} initially only offers the selection of Attributes.
+ * Upon selecting one, the fitting criteria are offered by instantiating the
+ * correct {@link FilterControl}.
+ * 
+ * @author jastram
+ */
+public class FilterPanel extends Composite {
+
+	private ReqIF reqif;
+	private ComboViewer attributeCombo;
+
+	/**
+	 * This constructor creates an empty {@link FilterPanel}.
+	 */
+	public FilterPanel(final Composite parent, ReqIF reqif) {
+		super(parent, SWT.BORDER);
+		this.reqif = reqif;
+		setLayout(new GridLayout(3, false));
+
+		createCloseButton(parent);
+		createAttributeCombo();
+	}
+
+	/**
+	 * This constructor uses an existing {@link IFilter} to populate the panel.
+	 */
+	public FilterPanel(Composite parent, ReqIF reqif, IFilter filter) {
+		this(parent, reqif);
+		
+		// see whether the attribute of the filter still exists
+		Object[] input = ((Object[])attributeCombo.getInput());
+		int attributeIndex = Arrays.asList(input).indexOf(filter.getAttribute());
+		if (attributeIndex == -1) return;
+
+		attributeCombo.getCombo().select(attributeIndex);
+		FilterControl filterControl = FilterControl.createFilterControl(this, filter);
+		filterControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+		layout();
+		getParent().pack();
+	}
+
+	/**
+	 * The close button disposes the {@link FilterPanel} and repacks the parent.
+	 * @param parent
+	 */
+	private void createCloseButton(final Composite parent) {
+		Label close = new Label(this, SWT.FLAT);
+		close.setText("\u2716");
+		close.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+		close.addMouseListener(new MouseAdapter() {
+			@Override
+			public void mouseUp(MouseEvent e) {
+				dispose();
+				parent.pack();
+			}
+		});
+	}
+
+	/**
+	 * Create the combo that contains both internal attributes and the model's
+	 * attributes. Upon selection change, the corresponding
+	 * {@link FilterControl} is built.
+	 */
+	private void createAttributeCombo() {
+		attributeCombo = new ComboViewer(this, SWT.DROP_DOWN | SWT.BORDER
+				| SWT.READ_ONLY);
+		GridData layoutData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
+		layoutData.widthHint = 180;
+		attributeCombo.getControl().setLayoutData(layoutData);
+		attributeCombo.setLabelProvider(new AttributeLabelProvider());
+		attributeCombo.setContentProvider(new ArrayContentProvider());
+		attributeCombo.setInput(createAttributeInput().toArray());
+
+		attributeCombo
+				.addSelectionChangedListener(new ISelectionChangedListener() {
+					@Override
+					public void selectionChanged(SelectionChangedEvent event) {
+						if (!event.getSelection().isEmpty()) {
+							Object selectedAttr = ((IStructuredSelection) event
+									.getSelection()).getFirstElement();
+							attributeChanged(selectedAttr);
+						}
+					}
+				});
+	}
+
+	/**
+	 * Create a {@link List} that acts as the input for {@link #attributeCombo}.
+	 * The list is first sorted by {@link SpecType} and then sorted by
+	 * {@link AttributeDefinition}.
+	 */
+	private List<?> createAttributeInput() {
+		List<? super Object> list = new ArrayList<Object>();
+
+		// Internal Attributes
+		list.addAll(Arrays.asList(StringFilter.InternalAttribute.values()));
+		list.addAll(Arrays.asList(DateFilter.InternalAttribute.values()));
+		
+		// All Attributes in the model
+		Map<String, AttributeDefinition> attributes = new HashMap<String, AttributeDefinition>();
+		for (SpecType specType : reqif.getCoreContent().getSpecTypes()) {
+			for (AttributeDefinition ad : specType.getSpecAttributes()) {
+				attributes.put(specType.getLongName() + "." + ad.getLongName() + "." + ad.getIdentifier(), ad);
+			}
+		}
+
+		// Add them in alphabetical order.
+		List<String> sortedKeys = new ArrayList<String>(attributes.keySet());
+		Collections.sort(sortedKeys);
+		for (String key : sortedKeys) {
+			list.add(attributes.get(key));			
+		}
+
+		return list;
+	}
+
+	/**
+	 * Reacts to attribute changes by creating the correct {@link FilterControl}
+	 * . If there already is a {@link FilterControl}, it is discarded.
+	 */
+	protected void attributeChanged(Object attribute) {
+		if (getFilterControl() != null) getFilterControl().dispose();
+		
+		FilterControl filterControl;
+		if (attribute instanceof AbstractTextFilter.InternalAttribute) {
+			filterControl = FilterControl.createFilterControl(this,
+					(AbstractTextFilter.InternalAttribute) attribute);
+		} else if (attribute instanceof DateFilter.InternalAttribute) {
+			filterControl = FilterControl.createFilterControl(this,
+					(DateFilter.InternalAttribute) attribute);
+		} else if (attribute instanceof AttributeDefinition) {
+			filterControl = FilterControl.createFilterControl(this,
+					(AttributeDefinition) attribute);
+		} else {
+			MessageDialog.openError(getShell(), "Invalid Selection",
+					"Cannot handle (yet): " + attribute);
+			filterControl = null;
+		}
+
+		filterControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
+				false));
+		layout();
+		getParent().pack();
+	}
+
+	/**
+	 * @return the current FilterControl, or null of not set.
+	 */
+	private FilterControl getFilterControl() {
+		if (getChildren().length != 3) return null;
+		Control control = getChildren()[2];
+		if (! (control instanceof FilterControl)) return null;
+		return (FilterControl) control;
+	}
+
+	/**
+	 * @return the {@link IFilter} representing the state of the
+	 * {@link FilterPanel}, or null if not set or incorrectly configured.
+	 */
+	public IFilter getFilter() {
+		return getFilterControl() == null ? null : getFilterControl().getFilter();
+	}
+
+	/**
+	 * To handle objects in the Attribute dropdown, instead of just Strings..
+	 */
+	class AttributeLabelProvider extends LabelProvider {
+		@Override
+		public String getText(Object element) {
+			if (element instanceof AttributeDefinition) {
+				AttributeDefinition ad = (AttributeDefinition)element;
+				SpecType specType = (SpecType) ad.eContainer();
+				return ad.getLongName() + " (" + specType.getLongName() + ")";
+			}
+			return element.toString();
+		}
+	}
+}
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterSearchQuery.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterSearchQuery.java
new file mode 100644
index 0000000..95e20bf
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/FilterSearchQuery.java
@@ -0,0 +1,102 @@
+package org.eclipse.rmf.reqif10.search.filter.ui;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.rmf.reqif10.ReqIF;
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+import org.eclipse.rmf.reqif10.SpecHierarchy;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.ui.UsageSearchResult;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.ISearchResult;
+
+public class FilterSearchQuery implements ISearchQuery {
+	private IFilter filter;
+	private ReqIF reqif;
+	private UsageSearchResult usageSearchResult;
+
+	public FilterSearchQuery(ReqIF reqif, IFilter filter) {
+		this.filter = filter;
+		this.reqif = reqif;
+	}
+
+	@Override
+	public IStatus run(IProgressMonitor monitor)
+			throws OperationCanceledException {
+		doRun(monitor);
+		// TODO better status
+		monitor.done();
+		return Status.OK_STATUS;
+	}
+
+	@Override
+	public ISearchResult getSearchResult() {
+		return usageSearchResult;
+	}
+
+	@Override
+	public String getLabel() {
+		return filter != null ? filter.toString() : "ReqIF Search...";
+	}
+
+	@Override
+	public boolean canRunInBackground() {
+		return true;
+	}
+
+	@Override
+	public boolean canRerun() {
+		return true;
+	}
+	
+	private void doRun(IProgressMonitor monitor) {
+		monitor.beginTask("Searching...", IProgressMonitor.UNKNOWN);
+		usageSearchResult = new UsageSearchResult(this);
+		Map<Resource, Collection<EObject>> result = find(monitor);
+		usageSearchResult.getSearchEntries().clear();
+		usageSearchResult.getSearchEntries().putAll(result);
+		monitor.done();
+	}
+
+	private Map<Resource, Collection<EObject>> find(IProgressMonitor monitor) {
+		Map<Resource, Collection<EObject>> result = new HashMap<Resource, Collection<EObject>>();
+		TreeIterator<EObject> iterator = EcoreUtil.getAllContents(reqif, true);
+		while (iterator.hasNext()) {
+			EObject obj = iterator.next();
+			SpecElementWithAttributes specElement = null;
+			if (obj instanceof SpecElementWithAttributes) {
+				specElement = (SpecElementWithAttributes) obj;
+			} else if (obj instanceof SpecHierarchy) {
+				specElement = ((SpecHierarchy)obj).getObject();
+			}
+			
+			if (specElement == null) continue;
+
+			if (filter.match(specElement)) {
+				
+				// First, find the resource
+				Collection<EObject> collection = result.get(reqif.eResource());
+				if (collection == null) {
+					collection = new HashSet<EObject>();
+					result.put(reqif.eResource(), collection);
+				}
+				collection.add(obj);
+			}
+			
+		}
+		return result;
+	}
+
+
+}
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/ReqIFSearchPage.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/ReqIFSearchPage.java
new file mode 100644
index 0000000..56ab863
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/filter/ui/ReqIFSearchPage.java
@@ -0,0 +1,349 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Michael Jastram - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter.ui;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jface.dialogs.DialogPage;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.rmf.reqif10.ReqIF;
+import org.eclipse.rmf.reqif10.pror.editor.IReqifEditor;
+import org.eclipse.rmf.reqif10.search.filter.IFilter;
+import org.eclipse.rmf.reqif10.search.filter.SimpleCompoundFilter;
+import org.eclipse.rmf.reqif10.search.ui.ReqIFSearchUIPlugin;
+import org.eclipse.rmf.reqif10.search.ui.UsageSearchResult;
+import org.eclipse.search.ui.ISearchPage;
+import org.eclipse.search.ui.ISearchPageContainer;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.ISearchResult;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.search2.internal.ui.SearchView;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+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.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPartListener2;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * The actual search page, which allows the creation of filter criteria. These
+ * are realized as {@link FilterPanel}s.
+ * 
+ * Each {@link FilterPanel} consists of {@link FilterControl}s.
+ * 
+ * @author jastram
+ */
+@SuppressWarnings("restriction")
+public class ReqIFSearchPage extends DialogPage implements ISearchPage {
+
+	/**
+	 * Stores the last search during a session.
+	 */
+	private static Map<ReqIF, SimpleCompoundFilter> lastSearches = new HashMap<ReqIF, SimpleCompoundFilter>();
+
+	/** Must only contains {@link FilterPanel}s! */
+	private Composite pane;
+
+	private Button and;
+	private Button or;
+
+	/** A search always relates to a {@link ReqIF}. */
+	private ReqIF reqif;
+
+	private static IPartListener2 listener;
+
+	@Override
+	public void createControl(Composite parent) {
+		// Setup the Layout
+		parent.setLayout(new GridLayout());
+		setControl(parent);
+
+		// Forbit use without a ReqIF.
+		reqif = getReqifEditor() != null ? getReqifEditor().getReqif() : null;
+		if (reqif == null) {
+			createNoSearchMessage(parent);
+			return;
+		}
+
+		// Buildt the GUI
+		Composite toolbar = createToolbar(parent);
+		createAndButton(toolbar);
+		createOrButton(toolbar);
+		createAddButton(toolbar);
+		createClearButton(toolbar);
+		pane = createPane(parent);
+
+		// Restore previous filters.
+		restoreFilter();
+
+		// The plugin help-id is broken.
+		PlatformUI
+				.getWorkbench()
+				.getHelpSystem()
+				.setHelp(parent,
+						"org.eclipse.rmf.reqif10.search.ui.reqifSearchHelp");
+
+		attachPartListener();
+	}
+
+	@Override
+	public void setVisible(boolean visible) {
+		super.setVisible(visible);
+		// Required, so that the correct help is shown.
+		if (true)
+			pane.setFocus();
+	}
+
+	private void createNoSearchMessage(Composite parent) {
+		Label label = new Label(parent, SWT.NONE);
+		label.setText("Please activate a ReqIF Editor before starting search.");
+		label.setLayoutData(new GridData(GridData.CENTER, SWT.CENTER, true,
+				true));
+	}
+
+	private Composite createToolbar(Composite parent) {
+		Composite toolbar = new Composite(parent, SWT.NONE);
+		toolbar.setLayout(new GridLayout(4, false));
+		toolbar.setLayoutData(new GridData(GridData.FILL, SWT.CENTER, true,
+				false));
+		return toolbar;
+	}
+
+	private void createAndButton(Composite toolbar) {
+		and = new Button(toolbar, SWT.RADIO);
+		and.setText("Match all");
+		and.setSelection(true);
+	}
+
+	private void createOrButton(Composite toolbar) {
+		or = new Button(toolbar, SWT.RADIO);
+		or.setText("Match any");
+	}
+
+	private void createClearButton(Composite toolbar) {
+		Button clear = new Button(toolbar, SWT.PUSH);
+		clear.setText("Clear");
+		clear.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+		clear.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				for (Control control : pane.getChildren()) {
+					control.dispose();
+				}
+				pane.pack();
+			}
+		});
+	}
+
+	private void createAddButton(Composite toolbar) {
+		Button add = new Button(toolbar, SWT.PUSH);
+		add.setText("Add new");
+		add.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false));
+		add.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				FilterPanel filterPanel = new FilterPanel(pane, reqif);
+				filterPanel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
+						true, false));
+				pane.pack();
+			}
+		});
+	}
+
+	private Composite createPane(Composite parent) {
+		ScrolledComposite sc = new ScrolledComposite(parent, SWT.V_SCROLL
+				| SWT.NONE);
+		sc.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
+		sc.setBackground(parent.getBackground());
+		Composite pane = new Composite(sc, SWT.NONE);
+		pane.setLayout(new GridLayout());
+		sc.setContent(pane);
+		sc.setExpandHorizontal(true);
+		return pane;
+	}
+
+	private void restoreFilter() {
+		SimpleCompoundFilter wrapperFilter = lastSearches.get(reqif);
+		if (wrapperFilter == null)
+			return;
+
+		or.setSelection(wrapperFilter.isOrFilter());
+		and.setSelection(!wrapperFilter.isOrFilter());
+
+		for (IFilter filter : wrapperFilter.getFilters()) {
+			FilterPanel filterPanel = new FilterPanel(pane, reqif, filter);
+			filterPanel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
+					false));
+		}
+		pane.pack();
+	}
+
+	/**
+	 * Looks for an active ReqIF editor.
+	 * 
+	 * @return the active ReqIF or null if none found.
+	 */
+	private IReqifEditor getReqifEditor() {
+		IEditorPart editor = PlatformUI.getWorkbench()
+				.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+		if (editor instanceof IReqifEditor) {
+			return (IReqifEditor) editor;
+		}
+		return null;
+	}
+
+	@Override
+	public boolean performAction() {
+		SimpleCompoundFilter filter = getFilter();
+
+		// Only search if we have filters.
+		if (filter == null || filter.getFilters().size() == 0)
+			return false;
+
+		// Stores the current query as last query.
+		lastSearches.put(reqif, filter);
+		ISearchQuery query = new FilterSearchQuery(reqif, filter);
+
+		NewSearchUI.runQueryInForeground(new ProgressMonitorDialog(getShell()),
+				query);
+		getSearchView().showSearchResult(query.getSearchResult());
+		return true;
+	}
+
+	// Actual search, as taken from org.eclipse.rmf.reqif10.search.ui.page
+	private SearchView getSearchView() {
+		SearchView searchView = null;
+		try {
+			searchView = (org.eclipse.search2.internal.ui.SearchView) PlatformUI
+					.getWorkbench().getActiveWorkbenchWindow().getActivePage()
+					.showView(NewSearchUI.SEARCH_VIEW_ID);
+		} catch (final PartInitException e) {
+			ReqIFSearchUIPlugin.INSTANCE.log(e);
+		}
+		return searchView;
+	}
+
+	/**
+	 * Saving the last search upon closing.
+	 */
+	@Override
+	public void dispose() {
+		if (getFilter() != null) {
+			lastSearches.put(reqif, getFilter());
+		}
+		super.dispose();
+	}
+
+	/**
+	 * Retrieves the filters from the pane in a {@link SimpleCompoundFilter}.
+	 */
+	private SimpleCompoundFilter getFilter() {
+		if (pane == null)
+			return null;
+		ArrayList<IFilter> filters = new ArrayList<IFilter>();
+		for (Control control : pane.getChildren()) {
+			if (control instanceof FilterPanel) {
+				IFilter filter = ((FilterPanel) control).getFilter();
+				if (filter != null)
+					filters.add(filter);
+			}
+		}
+
+		return new SimpleCompoundFilter(filters, or.getSelection());
+	}
+
+	@Override
+	public void setContainer(ISearchPageContainer container) {
+	}
+
+	/**
+	 * We attach a part listener to close related searches in the Search view.
+	 * There is only one (static) PartListener, which is created lazily.
+	 */
+	private void attachPartListener() {
+		// Don't do anything if it already exists.
+		if (listener != null) return;
+
+		listener = new IPartListener2() {
+			@Override
+			public void partClosed(IWorkbenchPartReference partRef) {
+				IWorkbenchPart part = partRef.getPart(false);
+				if (!(part instanceof IReqifEditor)) {
+					return;
+				}
+
+				ReqIF closingReqif = ((IReqifEditor) part).getReqif();
+
+				ISearchResult searchResult = getSearchView()
+						.getCurrentSearchResult();
+				if (searchResult instanceof UsageSearchResult) {
+					Set<Resource> keys = ((UsageSearchResult) searchResult)
+							.getSearchEntries().keySet();
+					for (Resource resource : keys) {
+						if (resource.getURI().equals(
+								closingReqif.eResource().getURI())) {
+							getSearchView().showEmptySearchPage(partRef.getId());
+							return;
+						}
+					}
+				}
+			}
+
+			@Override
+			public void partVisible(IWorkbenchPartReference partRef) {
+			}
+
+			@Override
+			public void partOpened(IWorkbenchPartReference partRef) {
+			}
+
+			@Override
+			public void partInputChanged(IWorkbenchPartReference partRef) {
+			}
+
+			@Override
+			public void partHidden(IWorkbenchPartReference partRef) {
+			}
+
+			@Override
+			public void partDeactivated(IWorkbenchPartReference partRef) {
+			}
+
+			@Override
+			public void partBroughtToTop(IWorkbenchPartReference partRef) {
+			}
+
+			@Override
+			public void partActivated(IWorkbenchPartReference partRef) {
+			}
+		};
+
+		System.out.println("Attaching listener.");
+		PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
+				.addPartListener(listener);
+
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ReqIFSearchPage.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ReqIFSearchPage.java
index 0a8d700..89284fe 100644
--- a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ReqIFSearchPage.java
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ReqIFSearchPage.java
@@ -41,6 +41,7 @@
 import org.eclipse.jface.dialogs.ProgressMonitorDialog;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.rmf.reqif10.pror.editor.IReqifEditor;
 import org.eclipse.rmf.reqif10.pror.editor.presentation.Reqif10Editor;
 import org.eclipse.rmf.reqif10.search.criteria.Criteria;
 import org.eclipse.rmf.reqif10.search.edit.util.ReqIFEditSearcher;
@@ -175,7 +176,7 @@
 						.getEditorReferences();
 				for (IEditorReference editorReference : editorReferences) {
 					IEditorPart editorPart = editorReference.getEditor(false);
-					if (editorPart instanceof Reqif10Editor) {
+					if (editorPart instanceof IReqifEditor) {
 						try {
 							uriMap.put(EditUIUtil.getURI(editorReference
 									.getEditorInput()),
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ReqIFSearchQuery.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ReqIFSearchQuery.java
index c74678d..f9576b4 100644
--- a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ReqIFSearchQuery.java
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ReqIFSearchQuery.java
@@ -94,12 +94,12 @@
 
 	@Override
 	public boolean canRerun() {
-		return true;
+		return false;
 	}
 
 	@Override
 	public boolean canRunInBackground() {
-		return true;
+		return false;
 	}
 
 	@Override
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ReqIFSearchResultPage.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ReqIFSearchResultPage.java
index 7587be8..07c75de 100644
--- a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ReqIFSearchResultPage.java
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ReqIFSearchResultPage.java
@@ -19,6 +19,7 @@
 
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
@@ -26,12 +27,19 @@
 import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
 import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
 import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IColorProvider;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.rmf.reqif10.SpecHierarchy;
+import org.eclipse.rmf.reqif10.Specification;
 import org.eclipse.rmf.reqif10.pror.configuration.provider.ConfigurationItemProviderAdapterFactory;
 import org.eclipse.rmf.reqif10.pror.editor.propertiesview.ProrPropertySheetPage;
+import org.eclipse.rmf.reqif10.pror.editor.util.ProrEditorUtil;
 import org.eclipse.rmf.reqif10.pror.provider.ReqIF10ItemProviderAdapterFactory;
 import org.eclipse.rmf.reqif10.pror.provider.ReqIFContentItemProvider;
 import org.eclipse.rmf.reqif10.pror.util.ProrUtil;
@@ -39,8 +47,11 @@
 import org.eclipse.search.ui.ISearchResult;
 import org.eclipse.search.ui.ISearchResultPage;
 import org.eclipse.search.ui.ISearchResultViewPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.IMemento;
 import org.eclipse.ui.part.Page;
 import org.eclipse.ui.views.properties.IPropertySheetPage;
@@ -61,13 +72,15 @@
 	private TreeViewer treeViewer;
 	private AdapterFactoryLabelProvider labelProvider;
 	private AdapterFactoryContentProvider contentProvider;
-	private Set<Object> objectsFound = new HashSet<Object>();
+	private Set<Object> matchedObjectsWithParents = new HashSet<Object>();
 	private ComposedAdapterFactory adapterFactory;
 	/**
 	 * This is the property sheet page.
 	 */
 	protected ProrPropertySheetPage propertySheetPage;
 
+	private Set<Object> matchedObjects;
+
 	private ComposedAdapterFactory createAdapterFactory() {
 		ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory();
 		adapterFactory
@@ -91,16 +104,7 @@
 	public void createControl(final Composite parent) {
 		treeViewer = new TreeViewer(parent);
 		adapterFactory = createAdapterFactory();
-		labelProvider = new AdapterFactoryLabelProvider(adapterFactory) {
-			@Override
-			public String getText(Object object) {
-				if (object instanceof EObject) {
-					ProrUtil.getItemProvider(adapterFactory, object).getText(
-							object);
-				}
-				return super.getText(object);
-			}
-		};
+		labelProvider = new ResultLabelProvider(adapterFactory);
 		treeViewer.setLabelProvider(labelProvider);
 		contentProvider = new AdapterFactoryContentProvider(adapterFactory) {
 			@Override
@@ -117,7 +121,7 @@
 			@Override
 			public boolean select(Viewer viewer, Object parentElement,
 					Object element) {
-				if (objectsFound.contains(element)) {
+				if (matchedObjectsWithParents.contains(element)) {
 					return true;
 				}
 				return false;
@@ -125,6 +129,29 @@
 		};
 		treeViewer.addFilter(viewerFilter);
 		getSite().setSelectionProvider(treeViewer);
+		
+		treeViewer.addDoubleClickListener(new IDoubleClickListener() {
+			
+			@Override
+			public void doubleClick(DoubleClickEvent event) {
+				// Only reacts on SpecHierarchies and Specifications
+				if (event.getSelection() instanceof IStructuredSelection) {
+					IStructuredSelection selection = (IStructuredSelection)event.getSelection();
+						showIfPossible(selection.getFirstElement());
+				}
+			}
+		});
+	}
+
+	/**
+	 * If the provided object is a {@link SpecHierarchy} or
+	 * {@link Specification}, then the corresponding {@link Specification} will
+	 * be opened or activated, and the object will be selected.
+	 */
+	protected void showIfPossible(Object object) {
+		if (object instanceof EObject) {
+			ProrEditorUtil.getEditor((EObject) object);
+		}
 	}
 
 	@Override
@@ -137,26 +164,26 @@
 		if (searchResult instanceof UsageSearchResult) {
 			this.searchResult = (UsageSearchResult) searchResult;
 
-			Set<Object> objects = new HashSet<Object>();
+			matchedObjects = new HashSet<Object>();
 			Map<Resource, Collection<EObject>> resultMap = this.searchResult
 					.getSearchEntries();
 			for (Entry<Resource, Collection<EObject>> entry : resultMap
 					.entrySet()) {
 				if (false == entry.getValue().isEmpty()) {
-					objects.addAll(entry.getValue());
+					matchedObjects.addAll(entry.getValue());
 				}
 			}
 
-			objectsFound.clear();
-			objectsFound.addAll(objects);
+			matchedObjectsWithParents.clear();
+			matchedObjectsWithParents.addAll(matchedObjects);
 			Set<Resource> inputSet = new HashSet<Resource>();
-			for (Object object : objects) {
+			for (Object object : matchedObjects) {
 				Object temp = contentProvider.getParent(object);
 				while (temp != null) {
 					if (temp instanceof Resource) {
 						inputSet.add((Resource) temp);
 					}
-					objectsFound.add(temp);
+					matchedObjectsWithParents.add(temp);
 					temp = contentProvider.getParent(temp);
 				}
 
@@ -168,6 +195,13 @@
 		}
 	}
 
+	/** 
+	 * Returns the current search result.
+	 */
+	UsageSearchResult getSearchResult() {
+		return searchResult;
+	}
+	
 	@Override
 	public void setViewPart(final ISearchResultViewPart part) {
 		// do nothing
@@ -280,8 +314,31 @@
 		if (labelProvider != null) {
 			labelProvider.dispose();
 		}
-		objectsFound.clear();
+		matchedObjectsWithParents.clear();
 		super.dispose();
 	}
 
+	private final class ResultLabelProvider extends AdapterFactoryLabelProvider implements IColorProvider {
+		private ResultLabelProvider(AdapterFactory adapterFactory) {
+			super(adapterFactory);
+		}
+
+		@Override
+		public String getText(Object object) {
+			if (object instanceof EObject) {
+				ProrUtil.getItemProvider(adapterFactory, object)
+						.getText(object);
+			}
+			return super.getText(object);
+		}
+
+		@Override
+		public Color getForeground(Object object) {
+			if (!matchedObjects.contains(object)) {
+				return Display.getCurrent().getSystemColor(SWT.COLOR_GRAY);
+			}
+			return super.getForeground(object);
+		}
+	}
+
 }
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ResultNavigator.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ResultNavigator.java
new file mode 100644
index 0000000..c724f00
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/ResultNavigator.java
@@ -0,0 +1,202 @@
+package org.eclipse.rmf.reqif10.search.ui;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+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.jface.viewers.StructuredSelection;
+import org.eclipse.rmf.reqif10.SpecHierarchy;
+import org.eclipse.rmf.reqif10.Specification;
+import org.eclipse.rmf.reqif10.pror.editor.ISpecificationEditor;
+import org.eclipse.search.ui.ISearchResultViewPart;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+
+public class ResultNavigator implements IEditorActionDelegate, IExecutableExtension {
+	
+	final static String NEXT_ID = "org.eclipse.rmf.reqif10.search.next";
+	final static String PREV_ID = "org.eclipse.rmf.reqif10.search.prev";
+
+	private Specification spec;
+	private SpecHierarchy selectedSpecHierarchy;
+	private ISpecificationEditor editor;
+
+	@Override
+	public void run(IAction action) {
+		editor.setFocus();
+		SpecHierarchy match = null;
+		if (action.getId().equals(NEXT_ID)) {
+			match = next();
+		} else if (action.getId().equals(PREV_ID)) {
+			match = prev();
+		} else {
+			throw new IllegalStateException(action + "");
+		}
+
+		if (match != null) {
+			ISelection selection = new StructuredSelection(match);
+			editor.getSite().getSelectionProvider().setSelection(selection);
+		} else {
+			MessageDialog.openInformation(editor.getSite().getShell(),
+					"No more elements", "No more elements in this direction.");
+		}
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		if (! (selection instanceof IStructuredSelection)) {
+			action.setEnabled(false);
+			return;
+		}
+		Object element = ((IStructuredSelection)selection).getFirstElement();
+		if (! (element instanceof SpecHierarchy)) {
+			action.setEnabled(false);
+			return;
+		}
+		action.setEnabled(specInSearchResult());
+		this.selectedSpecHierarchy = (SpecHierarchy) element;
+	}
+
+	@Override
+	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+		if (targetEditor instanceof ISpecificationEditor) {
+			this.editor = (ISpecificationEditor)targetEditor;
+			this.spec = ((ISpecificationEditor)targetEditor).getSpecification();
+		} else {
+			this.spec = null;
+			this.editor = null;
+		}
+	}
+	
+	private boolean specInSearchResult() {
+		for (SpecHierarchy sh : getMatchingSpecsHierarchies()) {
+			Specification s = getSpecForSpecHierarchy(sh);
+			if (s == spec) return true;			
+		}
+		return false;
+	}
+
+	private Set<SpecHierarchy> getMatchingSpecsHierarchies() {
+		HashSet<SpecHierarchy> set = new HashSet<SpecHierarchy>();
+
+		ISearchResultViewPart view = NewSearchUI.getSearchResultView();
+		if (view != null && view.getActivePage() instanceof ReqIFSearchResultPage) {
+			ReqIFSearchResultPage page = (ReqIFSearchResultPage)view.getActivePage();
+			UsageSearchResult result = page.getSearchResult();
+			Collection<EObject> entries = result.getSearchEntries().get(spec.eResource());
+			if (entries == null) {
+				return set;
+			}
+			for (EObject entry: entries) {
+				if (entry instanceof SpecHierarchy) {
+					set.add((SpecHierarchy) entry);
+				}				
+			}
+		}
+		return set;
+	}
+	
+	private Specification getSpecForSpecHierarchy(SpecHierarchy entry) {
+		while (true) {
+			if (entry.eContainer() instanceof Specification) {
+				return (Specification) entry.eContainer();
+			} else if (entry.eContainer() instanceof SpecHierarchy) {
+				entry = (SpecHierarchy) entry.eContainer();
+			} else {
+				return null;
+			}
+		}
+	}
+
+	@Override
+	public void setInitializationData(IConfigurationElement config,
+			String propertyName, Object data) throws CoreException {
+		// Not used, but interface implemented to ensure proper class loading.		
+	}
+	
+	private SpecHierarchy next() {
+		Set<SpecHierarchy> bag = getMatchingSpecsHierarchies();
+		SpecHierarchy next = oneDown(selectedSpecHierarchy);
+		while (next != null) {
+			if (bag.contains(next)) return next;
+			next = oneDown(next);
+		}
+		return null;
+	}
+
+	private SpecHierarchy oneDown(SpecHierarchy sh) {
+		// If there are children, go down the hierarchy.
+		if (sh.getChildren().size() > 0) {
+			return sh.getChildren().get(0);
+		}
+		
+		EObject element = sh;
+		while (element instanceof SpecHierarchy) {
+			EObject container = element.eContainer();
+			int pos = getSpecHierarchies(container).indexOf(element);		
+			if (pos < getSpecHierarchies(container).size() - 1) {
+				return (SpecHierarchy) getSpecHierarchies(container).get(pos +1);
+			} else {
+				element = container;
+			}
+		}
+		return null;
+	}
+
+	private SpecHierarchy prev() {
+		Set<SpecHierarchy> bag = getMatchingSpecsHierarchies();
+		SpecHierarchy next = oneUp(selectedSpecHierarchy);
+		while (next != null) {
+			if (bag.contains(next)) return next;
+			next = oneUp(next);
+		}
+		return null;
+	}
+
+	private SpecHierarchy oneUp(SpecHierarchy sh) {
+		EObject element = sh;
+		while (element instanceof SpecHierarchy) {
+			EObject container = element.eContainer();
+			if (! (container instanceof SpecHierarchy || container instanceof Specification)) {
+				return null;
+			}
+			int pos = getSpecHierarchies(container).indexOf(element);		
+			if (pos > 0) {
+				sh = (SpecHierarchy) getSpecHierarchies(container).get(pos - 1);
+				while (sh.getChildren().size() > 0) {
+					sh = sh.getChildren().get(sh.getChildren().size() - 1);
+				}
+				return sh;
+			} else {
+				// Go one up, then as deep as possible
+				if (container instanceof SpecHierarchy) {
+					return (SpecHierarchy) container;
+				} else {
+					return null;
+				}
+			}
+		}
+		return null;
+	}
+	
+	private EList<SpecHierarchy> getSpecHierarchies(EObject eObject) {
+		if (eObject instanceof SpecHierarchy) {
+			return ((SpecHierarchy)eObject).getChildren();
+		}
+		if (eObject instanceof Specification) {
+			return ((Specification)eObject).getChildren();
+		}
+		return null;
+	}
+	
+}
diff --git a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/UsageSearchResult.java b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/UsageSearchResult.java
index 042ee15..ce8b3d9 100644
--- a/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/UsageSearchResult.java
+++ b/org.eclipse.rmf.reqif10.search.ui/src/org/eclipse/rmf/reqif10/search/ui/UsageSearchResult.java
@@ -14,9 +14,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
-import java.util.Map.Entry;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
@@ -27,17 +25,16 @@
 
 /**
  * @author Hussein MHANNA
- * 
  */
 public class UsageSearchResult implements ISearchResult {
 
-	private final ReqIFSearchQuery query;
+	private final ISearchQuery query;
 
 	private final Map<Resource, Collection<EObject>> searchEntries;
 
 	private final Collection<ISearchResultListener> searchResultListeners = new ArrayList<ISearchResultListener>();
 
-	public UsageSearchResult(final ReqIFSearchQuery query) {
+	public UsageSearchResult(final ISearchQuery query) {
 		this.query = query;
 		this.searchEntries = new HashMap<Resource, Collection<EObject>>();
 	}
@@ -66,29 +63,28 @@
 	 */
 	@Override
 	public String getLabel() {
-		StringBuilder builder = new StringBuilder("Search in files '");
-		int resultFoundSize = 0;
-		for (Entry<Resource, Collection<EObject>> entry : searchEntries
-				.entrySet()) {
-			if (false == entry.getValue().isEmpty()) {
-				resultFoundSize++;
+		StringBuilder builder = new StringBuilder();
+
+		// add a maximum of 3 filenames
+		int count = 0;
+		for (Resource resource : searchEntries.keySet()) {
+			builder.append(resource.getURI().lastSegment());
+			if (++count > 2) {
+				builder.append("..., ");
+				break;
+			} else {
+				builder.append(", ");
 			}
 		}
-		// to limit the label, we take only max three resources
-		int max = resultFoundSize > 0 ? Math.min(3, resultFoundSize) : 3;
-		int count = 0;
-		Collection<Resource> resources = searchEntries.keySet();
-		for (Iterator<Resource> iterator = resources.iterator(); iterator
-				.hasNext() && count < max;) {
-			Resource resource = iterator.next();
-			builder.append(resource.getURI().lastSegment()).append(" - ");
-			count++;
+
+		Collection<Collection<EObject>> entries = searchEntries.values();
+		int total = 0;
+		for (Collection<EObject> entry : entries) {
+			total += entry.size();
 		}
-		if (count < resultFoundSize) {
-			builder.append("... - ");
-		}
-		builder.append("' result : ").append(resultFoundSize)
-				.append(" occurences");
+
+		builder.append("count: ").append(total).append(". Query: \"")
+				.append(query.getLabel()).append("\"");
 		return builder.toString();
 	}
 
diff --git a/org.eclipse.rmf.reqif10.search/META-INF/MANIFEST.MF b/org.eclipse.rmf.reqif10.search/META-INF/MANIFEST.MF
index a6581dc..d1cf78e 100644
--- a/org.eclipse.rmf.reqif10.search/META-INF/MANIFEST.MF
+++ b/org.eclipse.rmf.reqif10.search/META-INF/MANIFEST.MF
@@ -10,8 +10,12 @@
 Export-Package: org.eclipse.rmf.reqif10.search.criteria,
  org.eclipse.rmf.reqif10.search.criteria.impl,
  org.eclipse.rmf.reqif10.search.criteria.util,
+ org.eclipse.rmf.reqif10.search.filter,
  org.eclipse.rmf.reqif10.search.util
 Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.emf.ecore;visibility:=reexport,
- org.eclipse.rmf.reqif10
+ org.eclipse.rmf.reqif10,
+ com.google.guava,
+ org.eclipse.rmf.reqif10.pror;bundle-version="0.11.0"
 Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.rmf.reqif10.common.util
diff --git a/org.eclipse.rmf.reqif10.search/plugin.properties b/org.eclipse.rmf.reqif10.search/plugin.properties
index 3fdc055..b89d6e6 100644
--- a/org.eclipse.rmf.reqif10.search/plugin.properties
+++ b/org.eclipse.rmf.reqif10.search/plugin.properties
@@ -2,3 +2,21 @@
 
 pluginName = ReqIF Search Model Support
 providerName = Eclipse Modeling Project
+
+operator_equals = =
+operator_is = =
+operator_is_not = \u2260 
+operator_not_equals = \u2260
+operator_contains = contains
+operator_not_contains = contains not
+operator_regexp = regexp
+operator_regexp_plain = regexp (plain)
+operator_between = between
+operator_greater = >
+operator_smaller = <
+operator_before = before
+operator_after = after
+operator_contains_all = all 
+operator_contains_any = any
+operator_is_set = set
+operator_is_not_set = not set
\ No newline at end of file
diff --git a/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/AbstractAttributeFilter.java b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/AbstractAttributeFilter.java
new file mode 100644
index 0000000..9eb68f7
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/AbstractAttributeFilter.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.rmf.reqif10.search.filter;
+
+import org.eclipse.rmf.reqif10.AttributeDefinition;
+import org.eclipse.rmf.reqif10.AttributeValue;
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+import org.eclipse.rmf.reqif10.SpecType;
+import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+
+/**
+ * implementation of operators that can be run on any {@link AttributeDefinition}
+ * 
+ * @author Ingo Weigelt
+ */
+public abstract class AbstractAttributeFilter implements IFilter {
+	
+	public static final ImmutableSet<Operator> SUPPORTED_OPERATORS = Sets
+			.immutableEnumSet(Operator.IS_SET, Operator.IS_NOT_SET);
+		
+	public AbstractAttributeFilter(){
+	}
+	
+	
+	@Override
+	public boolean match(SpecElementWithAttributes element) {
+		
+		if (getAttribute() instanceof AttributeDefinition){
+			switch (getOperator()) {
+			case IS_SET:
+				return isSetAttribute(element, (AttributeDefinition) getAttribute()) && hasNonNullValue(element) ;
+			case IS_NOT_SET:		
+				return isSetAttribute(element, (AttributeDefinition) getAttribute()) && !hasNonNullValue(element); 
+			default:
+				throw new IllegalArgumentException(
+						"This filter does not support the " + getOperator()
+								+ " operation");
+			}	
+		}else{
+			Object attributeValue = getInternalAttributeValue(element);
+			switch (getOperator()) {
+			case IS_SET:
+				return attributeValue != null;
+			case IS_NOT_SET:
+				return attributeValue == null;
+			default:
+				throw new IllegalArgumentException(
+						"This filter does not support the " + getOperator()
+								+ " operation");
+			}
+		}
+	}
+	
+	
+	
+	public static boolean isSetAttribute(SpecElementWithAttributes element, AttributeDefinition attributeDefinition){
+		SpecType specType = ReqIF10Util.getSpecType(element);
+		if (specType == null) return false;
+		return specType.getSpecAttributes().contains(attributeDefinition);
+	}
+	
+	
+	private boolean hasNonNullValue(SpecElementWithAttributes element){
+		AttributeValue attributeValue = ReqIF10Util.getAttributeValue(element, (AttributeDefinition) getAttribute());
+		if (attributeValue == null){
+			return false;
+		}
+		Object theValue = ReqIF10Util.getTheValue(attributeValue);
+		if (theValue == null){
+			return false;
+		}
+		return true;
+	}
+	
+	
+
+	/**
+	 * Filters that can be applied to internalAttributes have to implement this
+	 * class and return a non-null value if the internalAttribute should be
+	 * considered as SET.
+	 * Otherwise they have to return null
+	 * 
+	 * @param element
+	 * @param attribute
+	 * @return the value of the internal attribute or null if the attribute is
+	 *         not set
+	 */
+	protected Object getInternalAttributeValue(
+			SpecElementWithAttributes element){
+		return null;
+	}
+	
+	
+	@Override
+	public ImmutableSet<Operator> getSupportedOperators() {
+		return SUPPORTED_OPERATORS;
+	}
+	
+	
+	public String toString(){
+		StringBuilder sb = new StringBuilder();
+		
+		String attribute = null;
+		if (getAttribute() instanceof AttributeDefinition) {
+			AttributeDefinition ad = (AttributeDefinition) getAttribute();
+			attribute = ad.getLongName();
+			if (attribute == null){
+				attribute = ad.getDesc();
+			}
+			if (attribute == null){
+				attribute = "Attribute with ID="+ad.getIdentifier();
+			}
+		}else{
+			attribute = getAttribute().toString();
+		}
+		
+		sb.append(attribute);
+		sb.append(" ");
+		
+		sb.append(getOperator().toLocaleString());
+		
+		if (getOperator() == Operator.IS_SET || getOperator() == Operator.IS_NOT_SET){
+			// we dont want any values for these operations and return;
+			return sb.toString();
+		}
+		
+		sb.append(" ");
+		sb.append(getFilterValue1AsString());
+		if (getOperator().equals(Operator.BETWEEN)){
+			sb.append(" and ").append(getFilterValue2AsString());
+		}
+		
+		return sb.toString();
+	}
+	
+	public String getFilterValue1AsString() {
+		return getFilterValue1().toString();
+	}
+	
+	public String getFilterValue2AsString() {
+		return getFilterValue2().toString();
+	}	
+	
+
+}
diff --git a/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/AbstractTextFilter.java b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/AbstractTextFilter.java
new file mode 100644
index 0000000..e92ddec
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/AbstractTextFilter.java
@@ -0,0 +1,250 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ *     Michael Jastram - adding SUPPORTED_OPERATIONS
+ *     Michael Jastram - adding getters, so that we can reconstruct the GUI
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.rmf.reqif10.AttributeDefinition;
+import org.eclipse.rmf.reqif10.AttributeDefinitionString;
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+
+/**
+ * Filter for String-based values.
+ */
+public abstract class AbstractTextFilter extends AbstractAttributeFilter {
+
+	public enum InternalAttribute {
+		IDENTIFIER, DESC, LONG_NAME
+	}
+
+	// TODO cross-check this with supported operators.
+	public static final ImmutableSet<Operator> SUPPORTED_OPERATORS = Sets
+			.immutableEnumSet(Operator.EQUALS, Operator.NOT_EQUALS,
+					Operator.CONTAINS, Operator.NOT_CONTAINS, Operator.REGEXP, Operator.IS_SET, Operator.IS_NOT_SET);
+
+	protected Operator operator;
+	protected String filterValue;
+	protected AttributeDefinition attributeDefinition;
+	protected InternalAttribute internalAttribute;
+	protected boolean caseSensitive;
+	protected boolean isInternal;
+
+	
+	/**
+	 * Constructor used to create a filter for an {@link AttributeDefinitionString}
+	 * 
+	 * @param operator the filter operator to use
+	 * @param value the value to match
+	 * @param attributeDefinition the attributeDefinition that defines the value of a SpecObject that should be matched
+	 * @param caseSensitive 
+	 */
+	public AbstractTextFilter(Operator operator, String value,
+			AttributeDefinition attributeDefinition, boolean caseSensitive) {
+		this(operator, value, null, attributeDefinition, caseSensitive);
+		this.isInternal = false;
+		if (null == attributeDefinition){
+			throw new IllegalArgumentException("AttributeDefinition can not be null");
+		}
+	}
+
+	/**
+	 * Constructor used to create a filter for an {@link InternalAttribute}
+	 * 
+	 * @param operator the filter operator to use
+	 * @param value the value to match
+	 * @param attributeDefinition the attributeDefinition that defines the value of a SpecObject that should be matched
+	 * @param caseSensitive 
+	 */
+	public AbstractTextFilter(Operator operator, String value,
+			InternalAttribute internalFeature, boolean caseSensitive) {
+		this(operator, value, internalFeature, null, caseSensitive);
+		this.isInternal = true;
+		if (null == internalFeature){
+			throw new IllegalArgumentException("AttributeDefinition can not be null");
+		}
+	}
+	
+	
+	protected AbstractTextFilter(Operator operator, String value, 
+			InternalAttribute internalFeature, AttributeDefinition attributeDefinition, boolean caseSensitive){
+
+		if (!getSupportedOperators().contains(operator)){
+			throw new IllegalArgumentException(
+					"This filter does not support the " + operator.toString()
+							+ " operation");
+		}
+		if (null == value && operator != Operator.IS_SET && operator != Operator.IS_NOT_SET  ){
+			throw new IllegalArgumentException(
+					"Value can not be null");
+		}
+		
+		if (internalFeature != null && attributeDefinition == null){
+			isInternal = true;
+		}else if(attributeDefinition != null && internalFeature == null){
+			isInternal = false;
+		}else{
+			throw new IllegalArgumentException(
+					"internalFeature and attribute definition can not be null or set at the same time");
+		}
+		
+		this.operator = operator;
+		this.filterValue = (null == value ? "" : value);
+		this.internalAttribute = internalFeature;
+		this.attributeDefinition = attributeDefinition;
+		this.caseSensitive = caseSensitive;
+	}
+
+	
+	@Override
+	public boolean match(SpecElementWithAttributes element) {
+		if (operator == Operator.IS_SET || operator == Operator.IS_NOT_SET){
+			return super.match(element);
+		}
+		
+		
+		String theValue;
+
+		// retrieve the value to check depending on this is a filter on an
+		// internal Attribute or a value
+		if (isInternal) {
+			theValue = getInternalAttributeValue(element);
+		} else {
+			theValue = getAttributeValue(element);
+		}
+		
+		if (theValue == null){
+			/* Check if there is any default value for this attribute */
+			theValue = getDefaultValue(element);
+		}
+		
+		/* 1. handle empty attribute case */ 
+		if (theValue == null){
+			switch (operator) {
+			case EQUALS:
+			case CONTAINS:
+				return false;
+			case NOT_EQUALS:
+			case NOT_CONTAINS:
+				return true;
+			case REGEXP:
+				// apply regexp to the empty string
+				return matchRegexp("");
+			default:
+				break;
+			}
+		}
+
+		/* 2. handle non-empty attribute case */
+		switch (operator) {
+		case EQUALS:
+			return (caseSensitive ? theValue.equals(filterValue)  
+								  : theValue.equalsIgnoreCase(filterValue));
+		case NOT_EQUALS:
+			return (caseSensitive ? !theValue.equals(filterValue) 
+					              :	!theValue.equalsIgnoreCase(filterValue));
+		case CONTAINS:
+			return (caseSensitive ? theValue.contains(filterValue) 
+					              : theValue.toLowerCase().contains(filterValue.toLowerCase()));
+		case NOT_CONTAINS:
+			return (caseSensitive ? !theValue.contains(filterValue) 
+					              : !theValue.toLowerCase().contains(filterValue.toLowerCase()));
+		case REGEXP:
+//			return (caseSensitive ? theValue.matches(filterValue) 
+//					              : theValue.toLowerCase().matches(filterValue.toLowerCase()));
+			return matchRegexp(theValue);
+		default:
+			return super.match(element);
+		}
+	}
+
+
+	/**
+	 * return the default Value of the AttributeDefinition if the attribute is defined in elements specType
+	 * Otherwise return null 
+	 * 
+	 * @param element
+	 * @return the default Value of the AttributeDefinition if the attribute is defined in elements specType
+	 * Otherwise null
+	 */
+	protected abstract String getDefaultValue(SpecElementWithAttributes element);
+
+	/**
+	 * returns the value of the Internal Attribute that is defined by this.internalAttribute
+	 * 
+	 * @return
+	 */
+	protected abstract String getInternalAttributeValue(SpecElementWithAttributes element);
+
+	/**
+	 * returns the value of the element that is defined by this.attributeDefinition
+	 * 
+	 * @param element
+	 * @return
+	 */
+	protected abstract String getAttributeValue(SpecElementWithAttributes element);
+	
+	
+	/**
+	 * Has to return the instance of this.SUPPORTED_OPERATORS
+	 * @return
+	 */
+	public abstract ImmutableSet<Operator> getSupportedOperators();
+	
+	
+	
+	/**
+	 * matches this.filterValue to the String value
+	 * takes this.caseSensitive into account
+	 * 
+	 * @return
+	 */
+	protected boolean matchRegexp(String value){
+		Pattern p;
+		if (caseSensitive){
+			p = Pattern.compile(filterValue, Pattern.DOTALL);
+		}else{
+			p = Pattern.compile(filterValue, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
+		}
+		Matcher matcher = p.matcher(value);
+		return matcher.find();
+	}
+	
+	public boolean isCaseSensitive() {
+		return caseSensitive;
+	}
+	
+	@Override
+	public String getFilterValue1() {
+		return filterValue;
+	}
+	
+	@Override
+	public String getFilterValue2() {
+		return null;
+	}
+
+	@Override
+	public Operator getOperator() {
+		return operator;
+	}
+	
+	@Override
+	public Object getAttribute() {
+		return isInternal ? internalAttribute : attributeDefinition;
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/BoolFilter.java b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/BoolFilter.java
new file mode 100644
index 0000000..4c12911
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/BoolFilter.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ *     Michael Jastram - adding SUPPORTED_OPERATIONS
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter;
+
+import org.eclipse.rmf.reqif10.AttributeDefinitionBoolean;
+import org.eclipse.rmf.reqif10.AttributeValueBoolean;
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+
+/**
+ * Filter for String-based values.
+ */
+public class BoolFilter extends AbstractAttributeFilter {
+
+	public static final ImmutableSet<Operator> SUPPORTED_OPERATORS = Sets
+			.immutableEnumSet(Operator.IS, Operator.IS_SET, Operator.IS_NOT_SET);
+
+	private Operator operator;
+	private Boolean filterValue;
+	private AttributeDefinitionBoolean attributeDefinition;
+
+	public BoolFilter(Operator operator, Boolean filterValue,
+			AttributeDefinitionBoolean attributeDefinition) {
+
+		if (!SUPPORTED_OPERATORS.contains(operator)) {
+			throw new IllegalArgumentException(
+					"This filter does not support the " + operator.toString()
+							+ " operation");
+		}
+		if (null == attributeDefinition) {
+			throw new IllegalArgumentException(
+					"AttributeDefinition can not be null");
+		}
+
+		this.operator = operator;
+		this.filterValue = filterValue;
+		this.attributeDefinition = attributeDefinition;
+
+	}
+
+	@Override
+	public boolean match(SpecElementWithAttributes element) {
+		if (operator == Operator.IS_SET || operator == Operator.IS_NOT_SET){
+			return super.match(element);
+		}
+		
+		Boolean theValue;
+
+		AttributeValueBoolean attributeValue = (AttributeValueBoolean) ReqIF10Util.getAttributeValue(element, attributeDefinition);
+		
+		if (attributeValue == null && attributeDefinition.isSetDefaultValue()){
+			if (AbstractAttributeFilter.isSetAttribute(element, attributeDefinition)){
+				attributeValue = attributeDefinition.getDefaultValue();
+			}
+		}
+		
+		if (attributeValue == null || !attributeValue.isSetTheValue()){
+			return false;
+		}
+		
+		theValue =  attributeValue.isTheValue();
+	
+		switch (operator) {
+		case IS:
+			return filterValue.equals(theValue);
+		default:
+			throw new IllegalArgumentException(
+					"This filter does not support the " + this.operator
+							+ " operation");
+		}
+	}
+
+	@Override
+	public Object getAttribute() {
+		return attributeDefinition;
+	}
+
+	@Override
+	public Operator getOperator() {
+		return operator;
+	}
+
+	@Override
+	public Object getFilterValue1() {
+		return filterValue;
+	}
+
+	@Override
+	public Object getFilterValue2() {
+		return null;
+	}
+
+	@Override
+	public ImmutableSet<Operator> getSupportedOperators() {
+		return SUPPORTED_OPERATORS;
+	}
+}
diff --git a/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/DateFilter.java b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/DateFilter.java
new file mode 100644
index 0000000..8132a5c
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/DateFilter.java
@@ -0,0 +1,298 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ *     Michael Jastram - adding SUPPORTED_OPERATIONS
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter;
+
+import java.text.SimpleDateFormat;
+import java.util.GregorianCalendar;
+
+import org.eclipse.rmf.reqif10.AttributeDefinitionDate;
+import org.eclipse.rmf.reqif10.AttributeValue;
+import org.eclipse.rmf.reqif10.AttributeValueDate;
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+
+/**
+ * Filter for String-based values.
+ */
+public class DateFilter extends AbstractAttributeFilter {
+
+	public static enum InternalAttribute {
+		LAST_CHANGE
+	}
+
+	// TODO cross-check this with supported operators.
+	public static final ImmutableSet<Operator> SUPPORTED_OPERATORS = Sets
+			.immutableEnumSet(Operator.IS, Operator.IS_NOT,
+					Operator.BETWEEN, Operator.BEFORE, Operator.AFTER, Operator.IS_SET, Operator.IS_NOT_SET);
+
+	private Operator operator;
+	private GregorianCalendar filterValue1;
+	private GregorianCalendar filterValue2;
+	private AttributeDefinitionDate attributeDefinition;
+	private InternalAttribute internalAttribute;
+	private boolean isInternal;
+
+	
+	/**
+	 * Constructor used to create a filter for an {@link AttributeDefinitionDate}
+	 * 
+	 * @param operator the filter operator to use
+	 * @param value the value to match
+	 * @param attributeDefinition the attributeDefinition that defines the value of a SpecObject that should be matched
+	 * @param caseSensitive 
+	 */
+	public DateFilter(Operator operator, GregorianCalendar value1, GregorianCalendar value2,
+			AttributeDefinitionDate attributeDefinition) {
+		this(operator, value1, value2, null, attributeDefinition);
+		this.isInternal = false;
+		if (null == attributeDefinition){
+			throw new IllegalArgumentException("AttributeDefinition can not be null");
+		}
+		System.out.println("Instatiated new Filter: " + toString());
+	}
+
+	/**
+	 * Constructor used to create a filter for an {@link InternalAttribute}
+	 * 
+	 * @param operator the filter operator to use
+	 * @param value the value to match
+	 * @param attributeDefinition the attributeDefinition that defines the value of a SpecObject that should be matched
+	 * @param caseSensitive 
+	 */
+	public DateFilter(Operator operator, GregorianCalendar value1, GregorianCalendar value2,
+			InternalAttribute internalFeature) {
+		this(operator, value1, value2, internalFeature, null);
+		this.isInternal = true;
+		if (null == internalFeature){
+			throw new IllegalArgumentException("AttributeDefinition can not be null");
+		}
+		System.out.println("Instatiated new Filter: " + toString());
+	}
+	
+	
+	private DateFilter(Operator operator, GregorianCalendar value1, GregorianCalendar value2, 
+			InternalAttribute internalFeature, AttributeDefinitionDate attributeDefinition){
+
+		if (!SUPPORTED_OPERATORS.contains(operator)){
+			throw new IllegalArgumentException(
+					"This filter does not support the " + operator.toString()
+							+ " operation");
+		}
+		if (null == value1 && operator != Operator.IS_SET && operator != Operator.IS_NOT_SET  ){
+			throw new IllegalArgumentException(
+					"Value can not be null");
+		}
+		
+		if (operator.equals(Operator.BETWEEN) ){
+			if (value2 == null){
+				throw new IllegalArgumentException("Value2 can not be null when using the operator " + operator.toString());
+			}
+		}		
+		
+		
+		if (value2 != null){
+			filterValue2 = copyCalendar(value2, true);
+			filterValue2.set(GregorianCalendar.HOUR_OF_DAY, 23);
+			filterValue2.set(GregorianCalendar.MINUTE, 59);
+			filterValue2.set(GregorianCalendar.SECOND, 59);
+			filterValue2.set(GregorianCalendar.MILLISECOND, 999);
+			
+			// Calling getTimeInMillis() forces the GregorianCalendar to compute the time.
+			// If the time is not computed a compareTo might fail
+			filterValue2.getTimeInMillis();
+		}
+		
+		
+		if (value1 != null){
+			if (operator == Operator.IS || operator == Operator.IS_NOT){
+				filterValue1 = copyCalendar(value1, false);
+				filterValue2 = copyCalendar(value1, false);
+				filterValue2.add(GregorianCalendar.HOUR, 24);		
+				filterValue2.getTimeInMillis();
+			}else{
+				filterValue1 = copyCalendar(value1, true);
+			}
+			// Calling getTimeInMillis() forces the GregorianCalendar to compute the time.
+			// If the time is not computed a compareTo might fail
+			filterValue1.getTimeInMillis();
+		}
+		
+		
+		this.operator = operator;
+		if (operator.equals(Operator.BETWEEN) && filterValue1.after(filterValue2)){
+			GregorianCalendar fv1 = filterValue1;
+			this.filterValue1 = this.filterValue2;
+			this.filterValue2 = fv1;
+		}		
+		
+		this.internalAttribute = internalFeature;
+		this.attributeDefinition = attributeDefinition;
+		
+	}
+
+	
+	/* 
+	 * 
+	 */
+	private GregorianCalendar copyCalendar(GregorianCalendar source, boolean copyTimeOfDay ){
+		source.getTimeInMillis();
+		
+		GregorianCalendar calendar = new GregorianCalendar(source.getTimeZone());
+		
+		calendar.set(GregorianCalendar.YEAR, source.get(GregorianCalendar.YEAR));
+		calendar.set(GregorianCalendar.MONTH, source.get(GregorianCalendar.MONTH));
+		calendar.set(GregorianCalendar.DAY_OF_MONTH, source.get(GregorianCalendar.DAY_OF_MONTH));
+		
+		if (copyTimeOfDay){
+			calendar.set(GregorianCalendar.HOUR_OF_DAY, source.get(GregorianCalendar.HOUR_OF_DAY));
+			calendar.set(GregorianCalendar.MINUTE, source.get(GregorianCalendar.MINUTE));
+			calendar.set(GregorianCalendar.SECOND, source.get(GregorianCalendar.SECOND));
+			calendar.set(GregorianCalendar.MILLISECOND, source.get(GregorianCalendar.MILLISECOND));
+		}else{
+			calendar.set(GregorianCalendar.HOUR_OF_DAY, 0);
+			calendar.set(GregorianCalendar.MINUTE, 0);
+			calendar.set(GregorianCalendar.SECOND, 0);
+			calendar.set(GregorianCalendar.MILLISECOND, 0);
+		}
+		
+		return calendar;
+	}
+	
+	
+	@Override
+	public boolean match(SpecElementWithAttributes element) {
+
+		GregorianCalendar theValue;
+
+		// retrieve the value to check depending on this is a filter on an
+		// internal Attribute or a value
+		if (isInternal) {
+			theValue = getInternalAttributeValue(element);
+		} else {
+			AttributeValue attributeValue = ReqIF10Util.getAttributeValue(
+					element, attributeDefinition);
+			if (attributeValue == null || !((AttributeValueDate) attributeValue).isSetTheValue()){
+				theValue = null;
+			}else{
+				theValue = ((AttributeValueDate) attributeValue).getTheValue();
+			}
+		}
+		
+		if (theValue == null){
+			theValue = getDefaultValue(element);
+		}
+		
+		if (theValue == null){
+			switch (operator) {
+			case IS_NOT:
+				return true;
+			case IS:
+			case BEFORE:
+			case AFTER:
+			case BETWEEN:
+				return false;
+			default:
+				return super.match(element);
+			}
+		}
+		
+		
+		// Calling getTimeInMillis() forces the GregorianCalendar to compute the time.
+		// If the time is not computed a compareTo might fail
+		theValue.getTimeInMillis();
+		
+		
+		switch (operator) {
+		case IS:
+			return theValue.compareTo(filterValue1) >= 0 && theValue.before(filterValue2);
+		case IS_NOT:
+			return !(theValue.compareTo(filterValue1) >= 0 && theValue.before(filterValue2));
+		case BEFORE:
+			return theValue.compareTo(filterValue1) < 0;
+		case AFTER:
+			return theValue.compareTo(filterValue1) > 0;
+		case BETWEEN:	
+			return theValue.compareTo(filterValue1) >= 0 && theValue.compareTo(filterValue2) <= 0;
+		default:
+			return super.match(element);
+		}
+	}
+
+	private GregorianCalendar getDefaultValue(SpecElementWithAttributes element) {
+		if (!AbstractAttributeFilter.isSetAttribute(element, attributeDefinition)){
+			return null;
+		}
+		
+		if (!isInternal && attributeDefinition instanceof AttributeDefinitionDate) {
+			AttributeDefinitionDate ad = (AttributeDefinitionDate) attributeDefinition;
+			return ad.isSetDefaultValue() ? ad.getDefaultValue().getTheValue() : null;
+		}
+		if (isInternal){
+			// What is the default Value for LAST_CHANGE
+			// I am not even sure if a non set LAST_CHANGE is valid
+			return null;
+		}
+		
+		throw new IllegalStateException("Expected an AttributeDefinitionString as attribute but found " + attributeDefinition.getClass());
+	}
+
+	@Override
+	public Object getAttribute() {
+		return isInternal ? internalAttribute : attributeDefinition;
+	}
+
+	public Operator getOperator() {
+		return operator;
+	}
+	
+	public GregorianCalendar getFilterValue1() {
+		return filterValue1;
+	}
+
+	public GregorianCalendar getFilterValue2() {
+		return filterValue2;
+	}
+
+	@Override
+	public ImmutableSet<Operator> getSupportedOperators() {
+		return SUPPORTED_OPERATORS;
+	}
+
+	@Override
+	protected GregorianCalendar getInternalAttributeValue(SpecElementWithAttributes element) {
+		if (internalAttribute.equals(InternalAttribute.LAST_CHANGE)){
+			if (!element.isSetLastChange()){
+				return null;
+			}
+			return element.getLastChange();
+		}else{
+			throw new IllegalArgumentException(internalAttribute + " is not supported by this feature");
+		}
+	}
+
+	@Override
+	public String getFilterValue1AsString() {
+	    SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MMM-dd");
+	    return fmt.format(getFilterValue1().getTime());
+	}
+	
+	@Override
+	public String getFilterValue2AsString() {
+	    SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MMM-dd");
+	    return fmt.format(getFilterValue2().getTime());
+	}
+	
+
+}
diff --git a/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/EnumFilter.java b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/EnumFilter.java
new file mode 100644
index 0000000..4487a4d
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/EnumFilter.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.eclipse.rmf.reqif10.AttributeDefinitionEnumeration;
+import org.eclipse.rmf.reqif10.AttributeValueEnumeration;
+import org.eclipse.rmf.reqif10.EnumValue;
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+
+public class EnumFilter extends AbstractAttributeFilter{
+
+	public static final ImmutableSet<Operator> SUPPORTED_OPERATORS = Sets
+			.immutableEnumSet(Operator.EQUALS, Operator.NOT_EQUALS,
+					Operator.CONTAINS_ALL, Operator.CONTAINS_ANY, Operator.IS_SET, Operator.IS_NOT_SET);
+	
+	
+	private AttributeDefinitionEnumeration attributeDefinition;
+	
+	private Operator operator;
+	private HashSet<EnumValue> filterValues;
+
+
+	private HashSet<EnumValue> defaultValues;
+	
+
+	public EnumFilter(Operator operator, Collection<EnumValue> value, AttributeDefinitionEnumeration attributeDefinition) {
+		// ensure that operator is supported
+		if (!SUPPORTED_OPERATORS.contains(operator)){
+				throw new IllegalArgumentException(
+						"This filter does not support the " + operator.toString()
+								+ " operation");
+		};
+		
+		// ensure that value1 is not null
+		if (null == value && operator != Operator.IS_SET && operator != Operator.IS_NOT_SET  ){
+			throw new IllegalArgumentException(
+					"value1 can not be null");
+		}
+		
+		this.attributeDefinition = attributeDefinition;
+		this.operator = operator;
+		this.filterValues = value == null ? new HashSet<EnumValue>() : new HashSet<EnumValue>(value);
+		if (attributeDefinition.getDefaultValue() != null){
+			this.defaultValues = new HashSet<EnumValue>(attributeDefinition.getDefaultValue().getValues());
+		}else{
+			this.defaultValues = new HashSet<EnumValue>();
+		}
+	}
+
+
+
+	@Override
+	public boolean match(SpecElementWithAttributes element) {	
+		if (operator == Operator.IS_SET || operator == Operator.IS_NOT_SET){
+			return super.match(element);
+		}
+		
+		AttributeValueEnumeration attributeValue = (AttributeValueEnumeration) ReqIF10Util.getAttributeValue(element, attributeDefinition);
+		HashSet<EnumValue> elementValues = null;
+		
+		if (attributeValue == null || !attributeValue.isSetValues()){
+			if (AbstractAttributeFilter.isSetAttribute(element, attributeDefinition)){
+				elementValues = defaultValues;
+			}else{
+				elementValues = null;
+			}
+		}else{
+			elementValues = new HashSet<EnumValue>(attributeValue.getValues());
+		}
+		
+		if (elementValues == null || elementValues.size() == 0){
+			switch (operator) {
+			case NOT_EQUALS:
+				return filterValues.isEmpty() ? false : true;
+			case EQUALS:
+			case CONTAINS_ALL:
+			case CONTAINS_ANY:
+				return filterValues.isEmpty() ? true : false;
+			default:
+				throw new IllegalArgumentException(
+						"This filter does not support the " + this.operator
+								+ " operation");
+			}
+		}
+		
+		
+		switch (operator) {
+		case EQUALS:
+			return elementValues.equals(filterValues);
+		case NOT_EQUALS:
+			return !elementValues.equals(filterValues);
+		case CONTAINS_ALL:
+			return elementValues.containsAll(filterValues);
+		case CONTAINS_ANY:
+			for (EnumValue enumValue : filterValues) {
+				if (elementValues.contains(enumValue)){
+					return true;
+				}
+			}
+			return false;
+		default:
+			throw new IllegalArgumentException(
+					"This filter does not support the " + this.operator
+							+ " operation");
+		}
+		
+	}
+
+
+
+	@Override
+	public AttributeDefinitionEnumeration getAttribute() {
+		return attributeDefinition;
+	}
+
+	@Override
+	public Operator getOperator() {
+		return operator;
+	}
+
+	@Override
+	public Collection<EnumValue> getFilterValue1() {
+		return filterValues;
+	}
+
+	@Override
+	public Object getFilterValue2() {
+		return null;
+	}
+
+
+
+	@Override
+	public ImmutableSet<Operator> getSupportedOperators() {
+		return SUPPORTED_OPERATORS;
+	}
+	
+		
+	@Override
+	public String getFilterValue1AsString() {
+		return enumValuesAsString(getFilterValue1());
+	}
+	
+	@Override
+	public String getFilterValue2AsString() {
+		return null;
+	}
+	
+	
+	private String enumValuesAsString(Collection<EnumValue> values){
+		StringBuilder sb = new StringBuilder("[");
+		for (Iterator<EnumValue> iterator = values.iterator(); iterator
+				.hasNext();) {
+			EnumValue enumValue = (EnumValue) iterator.next();
+			String label = enumValue.getLongName();
+			if (label == null){
+				label = enumValue.getDesc();
+			}
+			if (label == null){
+				label = "ID="+enumValue.getIdentifier();
+			}
+			sb.append(label);
+			
+			if (iterator.hasNext()){
+				sb.append(", ");
+			}
+		}
+		sb.append("]");
+		
+		return sb.toString();
+	}
+	
+}
diff --git a/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/IFilter.java b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/IFilter.java
new file mode 100644
index 0000000..6dbd4c5
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/IFilter.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ *     Michael Jastram - Label Support, ReqifFilter inheritance
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+import org.eclipse.rmf.reqif10.pror.filter.ReqifFilter;
+
+import com.google.common.collect.ImmutableSet;
+
+public interface IFilter extends ReqifFilter {
+
+	/**
+	 * Subclasses should implement a static immutable field that allows clients
+	 * to retrieve the list of supported operations.
+	 * 
+	 * public static final ImmutableSet<Operator> SUPPORTED_OPERATORS = ...;
+	 */
+	
+	public enum Operator{
+		EQUALS("operator_equals"),
+		IS("operator_is"),
+		IS_NOT("operator_is_not"),
+		NOT_EQUALS("operator_not_equals"),
+		CONTAINS("operator_contains"),
+		NOT_CONTAINS("operator_not_contains"),
+		REGEXP("operator_regexp"),
+		REGEXP_PLAIN("operator_regexp_plain"),
+		BETWEEN("operator_between"),
+		GREATER("operator_greater"),
+		SMALLER("operator_smaller"),
+		BEFORE("operator_before"),
+		AFTER("operator_after"),
+		CONTAINS_ALL("operator_contains_all"),
+		CONTAINS_ANY("operator_contains_any"),
+		IS_SET("operator_is_set"),
+		IS_NOT_SET("operator_is_not_set");
+		
+		private String label;
+		
+		private Operator(String label) {
+			this.label = label;
+		}
+		
+		@Override
+		public String toString() {
+			return label;
+		}
+		
+		public String toLocaleString(){
+			try{
+				return ResourceBundle.getBundle("plugin").getString(label);
+			}catch (MissingResourceException e){
+				return label;
+			}
+		}
+	}
+	
+	public boolean match(SpecElementWithAttributes element); 
+	
+	/**
+	 * Returns the Attribute for this filter.
+	 */
+	public Object getAttribute();
+	
+	public Operator getOperator();
+	
+	public Object getFilterValue1();
+	
+	public Object getFilterValue2();
+	
+	public ImmutableSet<Operator> getSupportedOperators();
+	
+}
diff --git a/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/NumberFilter.java b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/NumberFilter.java
new file mode 100644
index 0000000..437221d
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/NumberFilter.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter;
+
+import java.math.BigInteger;
+
+import org.eclipse.rmf.reqif10.AttributeDefinition;
+import org.eclipse.rmf.reqif10.AttributeDefinitionInteger;
+import org.eclipse.rmf.reqif10.AttributeDefinitionReal;
+import org.eclipse.rmf.reqif10.AttributeValueInteger;
+import org.eclipse.rmf.reqif10.AttributeValueReal;
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+
+public class NumberFilter extends AbstractAttributeFilter {
+
+	public static final ImmutableSet<Operator> SUPPORTED_OPERATORS = Sets
+			.immutableEnumSet(Operator.IS, Operator.IS_NOT,
+					Operator.BETWEEN, Operator.GREATER, Operator.SMALLER, Operator.IS_SET, Operator.IS_NOT_SET);
+	
+	private AttributeDefinition attributeDefinition;
+
+	private Operator operator;
+	private Comparable<Number> value1;
+	private Comparable<Number> value2;
+	
+	
+	
+	public NumberFilter(Operator operator, BigInteger value1, BigInteger value2, 
+			AttributeDefinitionInteger attributeDefinition) {
+		init(operator, value1, value2, attributeDefinition);
+	}
+	
+	public NumberFilter(Operator operator, Double value1, Double value2, 
+			AttributeDefinitionReal attributeDefinition) {
+		init(operator, value1, value2, attributeDefinition);
+	}
+
+	/**
+	 * TODO (mj) How about abandoning the above two constructors in favor of
+	 * this one? Maybe after adding some sanity checks.
+	 */
+	public NumberFilter(Operator operator, Number value1, Number value2,
+			AttributeDefinition attributeDefinition) {
+		
+		init(operator, (Comparable<? extends Number>) value1,
+				(Comparable<? extends Number>) value2, attributeDefinition);
+	}
+	
+	/**
+	 * 
+	 * @param operator 
+	 * @param value1 the value used for all operations. For the BETWEEN operation this is the lower value
+	 * @param value2 If operation is BETWEEN, this is the upper bound. Otherwise this parameter is ignored
+	 * @param attributeDefinition
+	 */
+	@SuppressWarnings("unchecked")
+	private void init(Operator operator, Comparable<? extends Number> value1, Comparable<? extends Number> value2, 
+			AttributeDefinition attributeDefinition) {
+		
+		// ensure that operator is supported
+		if (!SUPPORTED_OPERATORS.contains(operator)){
+				throw new IllegalArgumentException(
+						"This filter does not support the " + operator.toString()
+								+ " operation");
+		};
+		
+		// ensure that value1 is not null
+		if (null == value1 && operator != Operator.IS_SET && operator != Operator.IS_NOT_SET  ){
+			throw new IllegalArgumentException(
+					"value1 can not be null");
+		}
+		
+		// ensure that value2 is not null for operations that need two parameters
+		if (operator.equals(IFilter.Operator.BETWEEN)) {
+			if (null == value2) {
+				throw new IllegalArgumentException("value2 can not be null");
+			}
+		}
+		
+		
+		this.attributeDefinition = attributeDefinition;
+		this.operator = operator;
+		this.value1 =  (Comparable<Number>) value1;
+		this.value2 =  (Comparable<Number>) value2;
+	}
+	
+
+
+	@Override
+	public boolean match(SpecElementWithAttributes element) {
+		if (operator == Operator.IS_SET || operator == Operator.IS_NOT_SET){
+			return super.match(element);
+		}
+		
+		
+		Number theValue = getTheValue(element);
+		
+		
+		if (theValue == null){
+			/* Check if there is any default value for this attribute */
+			theValue = getDefaultValue(element);
+		}
+		
+		
+		if (theValue == null){
+			if (operator.equals(Operator.IS_NOT)){
+				return true;
+			}
+			return false;
+		}
+	
+		
+		switch (operator) {
+		case IS:
+			return value1.compareTo(theValue) == 0;
+		case IS_NOT:
+			return value1.compareTo(theValue) != 0;
+		case BETWEEN:
+			return value1.compareTo(theValue) <= 0 && value2.compareTo(theValue) >= 0;
+		case GREATER:
+			return value1.compareTo(theValue) <= 0;
+		case SMALLER:
+			return value1.compareTo(theValue) >= 0;
+			
+		default:
+			throw new IllegalArgumentException(
+					"This filter does not support the " + this.operator
+							+ " operation");
+		}
+		
+	}
+	
+	private Number getDefaultValue(SpecElementWithAttributes element) {
+		if (!AbstractAttributeFilter.isSetAttribute(element, attributeDefinition)){
+			return null;
+		}
+		
+		if (attributeDefinition instanceof AttributeDefinitionInteger) {
+			AttributeDefinitionInteger ad = (AttributeDefinitionInteger) attributeDefinition;
+			if (!ad.isSetDefaultValue()){
+				return null;
+			}
+			if (!ad.getDefaultValue().isSetTheValue()){
+				return null;
+			}
+			return ad.getDefaultValue().getTheValue(); 
+		}
+		if (attributeDefinition instanceof AttributeDefinitionReal) {
+			AttributeDefinitionReal ad = (AttributeDefinitionReal) attributeDefinition;
+			if (!ad.isSetDefaultValue()){
+				return null;
+			}
+			if (!ad.getDefaultValue().isSetTheValue()){
+				return null;
+			}
+			return ad.getDefaultValue().getTheValue();
+		}
+		throw new IllegalStateException("Expected an AttributeDefinitionInteger or AttributeDefinitionReal as attribute but found " + attributeDefinition.getClass());
+	}
+
+	private Number getTheValue(SpecElementWithAttributes element){
+		if (attributeDefinition instanceof AttributeDefinitionInteger){
+			AttributeValueInteger attributeValue = (AttributeValueInteger) ReqIF10Util.getAttributeValue(element, attributeDefinition);
+			if (attributeValue == null || !attributeValue.isSetTheValue()){
+				return null;
+			}
+			return attributeValue.getTheValue();
+		}
+		if (attributeDefinition instanceof AttributeDefinitionReal){
+			AttributeValueReal attributeValue = (AttributeValueReal) ReqIF10Util.getAttributeValue(element, attributeDefinition);
+			if (attributeValue == null || !attributeValue.isSetTheValue()){
+				return null;
+			}
+			return attributeValue.getTheValue();
+		}
+		else{
+			throw new IllegalArgumentException("SpecElementType is not supported");
+		}
+	}
+
+	@Override
+	public AttributeDefinition getAttribute() {
+		return attributeDefinition;
+	}
+
+	@Override
+	public Operator getOperator() {
+		return operator;
+	}
+
+	@Override
+	public Number getFilterValue1() {
+		return (Number) value1;
+	}
+
+	@Override
+	public Number getFilterValue2() {
+		return (Number) value2;
+	}
+
+	@Override
+	public ImmutableSet<Operator> getSupportedOperators() {
+		return SUPPORTED_OPERATORS;
+	}
+	
+	
+
+}
diff --git a/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/SimpleCompoundFilter.java b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/SimpleCompoundFilter.java
new file mode 100644
index 0000000..0a71ee0
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/SimpleCompoundFilter.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+
+import com.google.common.collect.ImmutableSet;
+
+
+/**
+ * A filter that is composed of other Filters. 
+ * 
+ * The match method is an AND or OR composition of other filters. 
+ *
+ */
+
+public class SimpleCompoundFilter implements IFilter {
+
+	
+	private boolean orFilter;
+	private final List<IFilter> filters;	
+	
+	/**
+	 * 
+	 * @param filters
+	 *            the list of filters to apply to the SpecObject
+	 * 
+	 * @param orFilter
+	 *            if true the match method will return true if any of the
+	 *            filters returns true.
+	 *            if false the match method will return true if ALL of the
+	 *            filters return true.
+	 * 
+	 */
+	public SimpleCompoundFilter(List<IFilter> filters, boolean orFilter) {
+		this.orFilter = orFilter ;
+		this.filters = new LinkedList<IFilter>(filters);
+	}
+	
+	public boolean isOrFilter() {
+		return orFilter;
+	}
+	
+	public List<IFilter> getFilters() {
+		return Collections.unmodifiableList(filters);
+	}
+	
+	
+	@Override
+	public boolean match(SpecElementWithAttributes element) {
+		for (IFilter filter : filters) {
+			boolean match = filter.match(element);
+			if (orFilter) {
+				if (match) return true;
+			} else {
+				if (! match) return false;
+			}
+		}
+
+		// If we don't know by now:
+		return ! orFilter;
+	}
+
+	@Override
+	public Object getAttribute() {
+		return null;
+	}
+
+	@Override
+	public Operator getOperator() {
+		return null;
+	}
+
+
+	@Override
+	public Object getFilterValue1() {
+		return null;
+	}
+
+	@Override
+	public Object getFilterValue2() {
+		return null;
+	}
+
+	@Override
+	public ImmutableSet<Operator> getSupportedOperators() {
+		return null;
+	}
+
+	
+	public String toString(){
+		StringBuilder sb = new StringBuilder();
+		String op = orFilter ? " OR " : " AND ";
+		for (Iterator<IFilter> iterator = filters.iterator(); iterator.hasNext();) {
+			IFilter filter = (IFilter) iterator.next();
+			
+			sb.append(filter.toString());
+			if (iterator.hasNext()){
+				sb.append(op + System.getProperty("line.separator"));
+			}
+		}
+		return sb.toString();
+	}
+}
diff --git a/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/StringFilter.java b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/StringFilter.java
new file mode 100644
index 0000000..842624f
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/StringFilter.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ *     Michael Jastram - adding SUPPORTED_OPERATIONS
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter;
+
+import org.eclipse.rmf.reqif10.AttributeDefinition;
+import org.eclipse.rmf.reqif10.AttributeDefinitionString;
+import org.eclipse.rmf.reqif10.AttributeValueString;
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+
+/**
+ * Filter for String-based values.
+ */
+public class StringFilter extends AbstractTextFilter {
+
+	// TODO cross-check this with supported operators.
+	public static final ImmutableSet<Operator> SUPPORTED_OPERATORS = Sets
+			.immutableEnumSet(Operator.EQUALS, Operator.NOT_EQUALS,
+					Operator.CONTAINS, Operator.NOT_CONTAINS, Operator.REGEXP, Operator.IS_SET, Operator.IS_NOT_SET);
+
+	/**
+	 * Constructor used to create a filter for an
+	 * {@link AttributeDefinitionString}
+	 * 
+	 * @param operator
+	 *            the filter operator to use
+	 * @param value
+	 *            the value to match
+	 * @param attributeDefinition
+	 *            the attributeDefinition that defines the value of a SpecObject
+	 *            that should be matched
+	 * @param caseSensitive
+	 */
+	public StringFilter(Operator operator, String value,
+			AttributeDefinitionString attributeDefinition, boolean caseSensitive) {
+		super(operator, value, null, (AttributeDefinition) attributeDefinition,
+				caseSensitive);
+	}
+
+	/**
+	 * Constructor used to create a filter for an {@link InternalAttribute}
+	 * 
+	 * @param operator
+	 *            the filter operator to use
+	 * @param value
+	 *            the value to match
+	 * @param attributeDefinition
+	 *            the attributeDefinition that defines the value of a SpecObject
+	 *            that should be matched
+	 * @param caseSensitive
+	 */
+	public StringFilter(Operator operator, String value,
+			InternalAttribute internalFeature, boolean caseSensitive) {
+		super(operator, value, internalFeature, null, caseSensitive);
+	}
+
+	/**
+	 * return the value of the Internal Attribute that is defined by
+	 * internalAttribute
+	 * 
+	 * @return
+	 */
+	protected String getInternalAttributeValue(SpecElementWithAttributes element) {
+		switch (internalAttribute) {
+		case IDENTIFIER:
+			return element.isSetIdentifier() ? element.getIdentifier() : null;
+		case DESC:
+			return element.isSetDesc() ? element.getDesc() : null;
+		case LONG_NAME:
+			return element.isSetLongName() ? element.getLongName() : null;
+		default:
+			throw new UnsupportedOperationException();
+		}
+	}
+
+	@Override
+	protected String getAttributeValue(SpecElementWithAttributes element) {
+		AttributeValueString attributeValue = (AttributeValueString) ReqIF10Util
+				.getAttributeValue(element, attributeDefinition);
+		if (attributeValue == null) {
+			return null;
+		}
+
+		return attributeValue.getTheValue();
+	}
+
+	@Override
+	public ImmutableSet<Operator> getSupportedOperators() {
+		return SUPPORTED_OPERATORS;
+	}
+
+	@Override
+	protected String getDefaultValue(SpecElementWithAttributes element) {
+		if (!AbstractAttributeFilter.isSetAttribute(element, attributeDefinition)){
+			return null;
+		}
+		
+		if (attributeDefinition instanceof AttributeDefinitionString) {
+			AttributeDefinitionString ad = (AttributeDefinitionString) attributeDefinition;
+			return ad.isSetDefaultValue() ? ad.getDefaultValue().getTheValue() : null;
+		}
+		throw new IllegalStateException("Expected an AttributeDefinitionString as attribute but found " + attributeDefinition.getClass());
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/XhtmlFilter.java b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/XhtmlFilter.java
new file mode 100644
index 0000000..a246049
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.search/src/org/eclipse/rmf/reqif10/search/filter/XhtmlFilter.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Formal Mind 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:
+ *     Ingo Weigelt - initial API and implementation
+ *     Michael Jastram - adding SUPPORTED_OPERATIONS
+ ******************************************************************************/
+package org.eclipse.rmf.reqif10.search.filter;
+
+import java.io.IOException;
+
+import org.eclipse.rmf.reqif10.AttributeDefinition;
+import org.eclipse.rmf.reqif10.AttributeDefinitionXHTML;
+import org.eclipse.rmf.reqif10.AttributeValueXHTML;
+import org.eclipse.rmf.reqif10.SpecElementWithAttributes;
+import org.eclipse.rmf.reqif10.XhtmlContent;
+import org.eclipse.rmf.reqif10.common.util.ProrXhtmlSimplifiedHelper;
+import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
+import org.eclipse.rmf.reqif10.common.util.ReqIF10XhtmlUtil;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+
+/**
+ * Filter for String-based values.
+ */
+public class XhtmlFilter extends AbstractTextFilter {
+
+	// TODO cross-check this with supported operators.
+	public static final ImmutableSet<Operator> SUPPORTED_OPERATORS = Sets
+			.immutableEnumSet(Operator.CONTAINS, Operator.NOT_CONTAINS,
+					Operator.REGEXP, Operator.REGEXP_PLAIN, Operator.IS_SET, Operator.IS_NOT_SET);
+
+
+	public XhtmlFilter(Operator operator, String value,
+			AttributeDefinitionXHTML attributeDefinition, boolean caseSensitive) {
+		super(operator, value, attributeDefinition, caseSensitive);
+	}
+	
+	
+	private XhtmlFilter(Operator operator, String value,
+			InternalAttribute internalFeature, boolean caseSensitive) {
+		super(operator, value, internalFeature, (AttributeDefinition) null, caseSensitive);
+		throw new InstantiationError("The XhtmlFilter does not support internalFeature."); //$NON-NLS-1$
+	}
+	
+
+	@Override
+	public boolean match(SpecElementWithAttributes element) {
+		if (operator.equals(Operator.REGEXP_PLAIN)){
+			AttributeValueXHTML attributeValue = (AttributeValueXHTML) ReqIF10Util.getAttributeValue(element, attributeDefinition);
+			
+			XhtmlContent theValue = null;
+					
+			if (attributeValue != null){
+				theValue = attributeValue.getTheValue();
+			}
+			
+			if (theValue == null){
+				theValue = getDefaultXhtmlContent(element);
+			}
+			
+			String simplifiedString;
+			if (theValue == null){
+				// according to the spec a regexp_plain match on on an empty
+				// value is equivalent to "regexp applied to empty string"
+				simplifiedString = "";
+			}else{
+				simplifiedString = ProrXhtmlSimplifiedHelper.xhtmlToSimplifiedString(theValue);
+			}
+			
+			//System.out.println(simplifiedString);
+			
+			return matchRegexp(simplifiedString);
+		}else{
+			return super.match(element);
+		}
+	}
+
+
+	@Override
+	protected String getInternalAttributeValue(SpecElementWithAttributes element) {
+		// There are no internal features of type Xhtml
+		return null;
+	}
+
+
+	@Override
+	protected String getAttributeValue(SpecElementWithAttributes element) {
+		AttributeValueXHTML attributeValue = (AttributeValueXHTML) ReqIF10Util.getAttributeValue(element, attributeDefinition);
+		if (attributeValue == null){
+			return null;
+		}
+		XhtmlContent xhtmlContent = attributeValue.getTheValue();
+		try {
+			return ReqIF10XhtmlUtil.getXhtmlString(xhtmlContent);
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+
+	@Override
+	public ImmutableSet<Operator> getSupportedOperators() {
+		return SUPPORTED_OPERATORS;
+	}
+
+	
+	/**
+	 * returns the NON-simplified default Value
+	 */
+	@Override
+	protected String getDefaultValue(SpecElementWithAttributes element) {
+		if (!AbstractAttributeFilter.isSetAttribute(element, attributeDefinition)){
+			return null;
+		}
+		
+		try {
+			XhtmlContent xhtmlContent = getDefaultXhtmlContent(element);
+			return xhtmlContent == null ? null : ReqIF10XhtmlUtil.getXhtmlString(xhtmlContent);
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}	 
+	}
+	
+	
+	private XhtmlContent getDefaultXhtmlContent(SpecElementWithAttributes element) {
+		if (!AbstractAttributeFilter.isSetAttribute(element, attributeDefinition)){
+			return null;
+		}
+		
+		if (attributeDefinition instanceof AttributeDefinitionXHTML) {
+			AttributeDefinitionXHTML ad = (AttributeDefinitionXHTML) attributeDefinition;
+			return (ad.isSetDefaultValue() ? ad.getDefaultValue().getTheValue() : null);
+		}
+		throw new IllegalStateException("Expected an AttributeDefinitionString as attribute but found " + attributeDefinition.getClass());
+	}
+	
+	
+
+}
diff --git a/org.eclipse.rmf.reqif10.serialization/META-INF/MANIFEST.MF b/org.eclipse.rmf.reqif10.serialization/META-INF/MANIFEST.MF
index e074096..b5ba76f 100644
--- a/org.eclipse.rmf.reqif10.serialization/META-INF/MANIFEST.MF
+++ b/org.eclipse.rmf.reqif10.serialization/META-INF/MANIFEST.MF
@@ -4,9 +4,9 @@
 Bundle-SymbolicName: org.eclipse.rmf.reqif10.serialization;singleton:=true
 Bundle-Version: 0.12.0.qualifier
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Require-Bundle: org.eclipse.rmf.serialization;bundle-version="0.9.0",
- org.eclipse.rmf.reqif10;bundle-version="0.9.0",
- org.eclipse.rmf.reqif10.xhtml;bundle-version="0.9.0"
+Require-Bundle: org.eclipse.rmf.reqif10;bundle-version="0.9.0",
+ org.eclipse.rmf.reqif10.xhtml;bundle-version="0.9.0",
+ org.eclipse.sphinx.emf.serialization;bundle-version="0.8.1"
 Export-Package: org.eclipse.rmf.reqif10.serialization
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/org.eclipse.rmf.reqif10.serialization/about.html b/org.eclipse.rmf.reqif10.serialization/about.html
index c258ef5..e3d3073 100644
--- a/org.eclipse.rmf.reqif10.serialization/about.html
+++ b/org.eclipse.rmf.reqif10.serialization/about.html
@@ -24,5 +24,27 @@
 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>Third Party Content</h3>
+
+The Content includes items that have been sourced from third parties as set out below. If you did not receive this Content directly from the Eclipse Foundation, the following is provided for informational purposes only, and you should look to the Redistributor's license for terms and conditions of use.
+
+<h4>Subset of W3C XHTML Modularization, version 1.1</h4>
+
+<p>The plug-in includes XSD Schema files developed by the <a href="http://www.w3.org">W3C</a></p>
+
+<p>Your use of these XSD Schema files is governed by the terms and conditions of the <a href="about_files/W3CLicense.html">W3C Software License</a>.</p>
+
+<p>The W3C XHTML Modularization Schema files can be downloaded from the <a href="http://www.w3.org/TR/xhtml-modularization/">W3C XHTML Modularization Website</a>.</p>
+<p>The W3C namespace Schema file can be downloaded from the <a href="http://www.w3.org/2004/10/xml.xsd">W3C Namespace Website</a>.</p>
+
+
+<h4>OMG ReqIF XML Schema Files, version 1.0.1</h4>
+
+<p>The plug-in includes ReqIF XSD Schema files developed by the <a href="http://www.omg.org">Object Management Group (OMG)</a></p>
+
+<p>Your use of these ReqIF XSD Schema files is governed by the terms and conditions of the Object Management Group License.</p>
+
+<p>The ReqIF XSD Schema files can be downloaded from the <a href="http://www.omg.org/spec/ReqIF/1.0.1/">OMG ReqIF Website</a>.</p>
+
 </body>
 </html>
\ No newline at end of file
diff --git a/org.eclipse.rmf.reqif10.serialization/about_files/W3CLicense.html b/org.eclipse.rmf.reqif10.serialization/about_files/W3CLicense.html
new file mode 100644
index 0000000..0c357a1
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.serialization/about_files/W3CLicense.html
@@ -0,0 +1,78 @@
+<!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" xml:lang="en" lang="en">
+
+<head>
+   <title>W3C Software Notice and License</title>
+</head>
+
+<body id="www-w3-org" class="w3c_public">
+
+
+<div id="w3c_container">
+    
+    
+
+
+               <h1 class="title">W3C Software Notice and License</h1>
+               <div id="w3c_content_body">
+                  <div class="line">
+                     <p class="intro tPadding">This work (and included software, documentation such as READMEs, or other
+related items) is being provided by the copyright holders under the following
+license.</p>
+<h2>License</h2>
+                     
+                     <p class="tPadding">
+By obtaining, using and/or copying this work, you (the licensee)
+agree that you have read, understood, and will comply with the following
+terms and conditions.</p>
+
+                     <p>Permission to copy, modify, and distribute this software and its
+documentation, with or without modification,&#xA0;for any purpose and without
+fee or royalty is hereby granted, provided that you include the following on
+ALL copies of the software and documentation or portions thereof, including
+modifications:</p>
+
+                     <ul class="show_items"><li>The full text of this NOTICE in a location viewable to users of the
+    redistributed or derivative work.</li><li>Any pre-existing intellectual property disclaimers, notices, or terms
+    and conditions. If none exist, the <a href="copyright-software-short-notice-20021231.html">W3C Software Short
+    Notice</a> should be included (hypertext is preferred, text is permitted)
+    within the body of any redistributed or derivative code.</li><li>Notice of any changes or modifications to the files, including the date
+    changes were made. (We recommend you provide URIs to the location from
+    which the code is derived.)</li></ul>
+
+<h2>Disclaimers</h2>
+
+                     <p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
+MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
+PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE
+ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
+
+                     <p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
+DOCUMENTATION.</p>
+
+                     <p>The name and trademarks of copyright holders may NOT be used in
+advertising or publicity pertaining to the software without specific, written
+prior permission. Title to copyright in this software and any associated
+documentation will at all times remain with copyright holders.</p>
+
+                     <h2>Notes</h2>
+
+	                    <p>This version: http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231</p>
+
+                     <p>This formulation of W3C's notice and license became active on December 31
+2002. This version removes the copyright ownership notice such that this
+license can be used with materials other than those owned by the W3C,
+reflects that ERCIM is now a host of the W3C, includes references to this
+specific dated version of the license, and removes the ambiguous grant of
+"use". Otherwise, this version is the same as the <a href="http://www.w3.org/Consortium/Legal/copyright-software-19980720">previous
+version</a> and is written so as to preserve the <a href="http://www.gnu.org/philosophy/license-list.html#GPLCompatibleLicenses">Free
+Software Foundation's assessment of GPL compatibility</a> and <a href="http://www.opensource.org/licenses/W3C.php">OSI's certification</a>
+under the <a href="http://www.opensource.org/docs/definition.php">Open Source
+Definition</a>.</p>
+                  </div>
+               </div>
+            </div>
+         </div>
+      </div></body></html>
diff --git a/org.eclipse.rmf.reqif10.serialization/build.properties b/org.eclipse.rmf.reqif10.serialization/build.properties
index 7900be1..5bfc571 100644
--- a/org.eclipse.rmf.reqif10.serialization/build.properties
+++ b/org.eclipse.rmf.reqif10.serialization/build.properties
@@ -25,7 +25,8 @@
                plugin.xml,\
                about.html,\
                epl-v10.html,\
-               notice.html
+               notice.html,\
+               about_files/
 jars.compile.order = .
 source.. = src/
 output.. = bin/
diff --git a/org.eclipse.rmf.reqif10.serialization/src/org/eclipse/rmf/reqif10/serialization/ReqIF10LoadImpl.java b/org.eclipse.rmf.reqif10.serialization/src/org/eclipse/rmf/reqif10/serialization/ReqIF10LoadImpl.java
new file mode 100644
index 0000000..ac0e327
--- /dev/null
+++ b/org.eclipse.rmf.reqif10.serialization/src/org/eclipse/rmf/reqif10/serialization/ReqIF10LoadImpl.java
@@ -0,0 +1,74 @@
+package org.eclipse.rmf.reqif10.serialization;
+
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.resource.ContentHandler;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.xmi.PackageNotFoundException;
+import org.eclipse.emf.ecore.xmi.XMLHelper;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+import org.eclipse.sphinx.emf.serialization.internal.XMLPersistenceMappingHandler;
+import org.eclipse.sphinx.emf.serialization.internal.XMLPersistenceMappingLoadImpl;
+import org.xml.sax.helpers.DefaultHandler;
+
+public class ReqIF10LoadImpl extends XMLPersistenceMappingLoadImpl {
+
+	public ReqIF10LoadImpl(XMLHelper helper) {
+		super(helper);
+	}
+	
+	/**
+	 * creates XML default handler that searches for EPackages in the registry, only.
+	 * It doesn't try to find a not registered EPackage by loading the content of the namespace URI.
+	 */
+	@Override
+	protected DefaultHandler makeDefaultHandler() {
+		XMLPersistenceMappingHandler handler = new XMLPersistenceMappingHandler(resource, helper, options) {
+			@Override
+			protected EPackage getPackageForURI(String uriString) {
+			    if (uriString == null)
+			    {
+			      return null;
+			    }
+
+			    EPackage ePackage = 
+			      extendedMetaData == null ?
+			        packageRegistry.getEPackage(uriString) :
+			        extendedMetaData.getPackage(uriString);
+
+			    if (ePackage != null && ePackage.eIsProxy())
+			    {
+			      ePackage = null;
+			    }
+
+
+			    if (ePackage == null)
+			    {
+			      ePackage = handleMissingPackage(uriString);
+			    }
+
+			    if (ePackage == null)
+			    {
+			      error
+			        (new PackageNotFoundException
+			           (uriString,
+			            getLocation(),
+			            getLineNumber(),
+			            getColumnNumber()));
+			    }
+
+			    return ePackage;
+
+			}
+		};
+
+		return handler;
+	}
+
+}
diff --git a/org.eclipse.rmf.reqif10.serialization/src/org/eclipse/rmf/reqif10/serialization/ReqIF10ResourceImpl.java b/org.eclipse.rmf.reqif10.serialization/src/org/eclipse/rmf/reqif10/serialization/ReqIF10ResourceImpl.java
index 06d1e0b..991c169 100644
--- a/org.eclipse.rmf.reqif10.serialization/src/org/eclipse/rmf/reqif10/serialization/ReqIF10ResourceImpl.java
+++ b/org.eclipse.rmf.reqif10.serialization/src/org/eclipse/rmf/reqif10/serialization/ReqIF10ResourceImpl.java
@@ -16,14 +16,19 @@
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EAttribute;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.xmi.XMLLoad;
 import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecore.xmi.XMLSave;
 import org.eclipse.emf.ecore.xmi.impl.XMLMapImpl;
-import org.eclipse.rmf.internal.serialization.XMLPersistenceMappingSaveImpl;
+import org.eclipse.sphinx.emf.serialization.internal.XMLPersistenceMappingLoadImpl;
+import org.eclipse.sphinx.emf.serialization.internal.XMLPersistenceMappingSaveImpl;
 import org.eclipse.rmf.reqif10.Identifiable;
 import org.eclipse.rmf.reqif10.ReqIF10Package;
 import org.eclipse.rmf.reqif10.xhtml.XhtmlPackage;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceImpl;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingExtendedMetaData;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingExtendedMetaDataImpl;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceImpl;
 
 public class ReqIF10ResourceImpl extends XMLPersistenceMappingResourceImpl {
 
@@ -35,15 +40,21 @@
 		super(uri);
 	}
 
+	
+	/**
+	 * the resource expects all relevant EPackages to be registered before loading the resource.
+	 * This avoids delays and errors by network lookups for EPackages by their namespace URI
+	 */
 	@Override
 	public void initDefaultOptions() {
 		super.initDefaultOptions();
+				
 		// ========= create options map===================
 		final XMLResource.XMLMap optionsMap = new XMLMapImpl();
 		optionsMap
 				.setIDAttributeName(ReqIF10Package.Literals.IDENTIFIABLE__IDENTIFIER
 						.getName().toUpperCase());
-
+				
 		// ========= default save options ===================
 		Map<Object, Object> saveOptions = getDefaultSaveOptions();
 		Map<String, String> namespaceToPrefixMap = new HashMap<String, String>();
@@ -128,4 +139,9 @@
 	public void setIsLoading(boolean isLoading) {
 		this.isLoading = isLoading;
 	}
+	
+	@Override
+	protected XMLLoad createXMLLoad() {
+		return new ReqIF10LoadImpl(createXMLHelper());
+	}
 }
diff --git a/org.eclipse.rmf.reqif10.xhtml/plugin.xml b/org.eclipse.rmf.reqif10.xhtml/plugin.xml
index 2386793..87fc135 100644
--- a/org.eclipse.rmf.reqif10.xhtml/plugin.xml
+++ b/org.eclipse.rmf.reqif10.xhtml/plugin.xml
@@ -23,12 +23,6 @@
             genModel="model/xhtml.genmodel"/>
    </extension>
 
-   <extension point="org.eclipse.emf.ecore.extension_parser">
-      <!-- @generated xhtml -->
-      <parser
-            type="xhtml"
-            class="org.eclipse.rmf.reqif10.xhtml.util.XhtmlResourceFactoryImpl"/>
-   </extension>
 
    <extension point="org.eclipse.emf.ecore.generated_package">
       <!-- @generated xhtml -->
diff --git a/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/datatypes/util/DatatypesResourceFactoryImpl.java b/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/datatypes/util/DatatypesResourceFactoryImpl.java
deleted file mode 100644
index 4ac7143..0000000
--- a/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/datatypes/util/DatatypesResourceFactoryImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *     Mark Broerkens - initial API and implementation
- * 
- */
-package org.eclipse.rmf.reqif10.datatypes.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-
-/**
- * <!-- begin-user-doc --> The <b>Resource Factory</b> associated with the package. <!-- end-user-doc -->
- * 
- * @see org.eclipse.rmf.reqif10.datatypes.util.DatatypesResourceImpl
- * @generated
- */
-public class DatatypesResourceFactoryImpl extends ResourceFactoryImpl {
-	/**
-	 * Creates an instance of the resource factory. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public DatatypesResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Resource createResource(URI uri) {
-		Resource result = new DatatypesResourceImpl(uri);
-		return result;
-	}
-
-} // DatatypesResourceFactoryImpl
diff --git a/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/datatypes/util/DatatypesResourceImpl.java b/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/datatypes/util/DatatypesResourceImpl.java
deleted file mode 100644
index e99b0f1..0000000
--- a/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/datatypes/util/DatatypesResourceImpl.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *     Mark Broerkens - initial API and implementation
- * 
- */
-package org.eclipse.rmf.reqif10.datatypes.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * <!-- begin-user-doc --> The <b>Resource </b> associated with the package. <!-- end-user-doc -->
- * 
- * @see org.eclipse.rmf.reqif10.datatypes.util.DatatypesResourceFactoryImpl
- * @generated
- */
-public class DatatypesResourceImpl extends XMLResourceImpl {
-	/**
-	 * Creates an instance of the resource. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param uri
-	 *            the URI of the new resource.
-	 * @generated
-	 */
-	public DatatypesResourceImpl(URI uri) {
-		super(uri);
-	}
-
-} // DatatypesResourceImpl
diff --git a/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/datatypes/util/DatatypesXMLProcessor.java b/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/datatypes/util/DatatypesXMLProcessor.java
deleted file mode 100644
index 09100be..0000000
--- a/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/datatypes/util/DatatypesXMLProcessor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *     Mark Broerkens - initial API and implementation
- * 
- */
-package org.eclipse.rmf.reqif10.datatypes.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-import org.eclipse.rmf.reqif10.datatypes.DatatypesPackage;
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents <!-- begin-user-doc --> <!--
- * end-user-doc -->
- * 
- * @generated
- */
-public class DatatypesXMLProcessor extends XMLProcessor {
-
-	/**
-	 * Public constructor to instantiate the helper. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public DatatypesXMLProcessor() {
-		super((EPackage.Registry.INSTANCE));
-		DatatypesPackage.eINSTANCE.eClass();
-	}
-
-	/**
-	 * Register for "*" and "xml" file extensions the DatatypesResourceFactoryImpl factory. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected Map<String, Resource.Factory> getRegistrations() {
-		if (registrations == null) {
-			super.getRegistrations();
-			registrations.put(XML_EXTENSION, new DatatypesResourceFactoryImpl());
-			registrations.put(STAR_EXTENSION, new DatatypesResourceFactoryImpl());
-		}
-		return registrations;
-	}
-
-} // DatatypesXMLProcessor
diff --git a/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/xhtml/util/XhtmlResourceFactoryImpl.java b/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/xhtml/util/XhtmlResourceFactoryImpl.java
deleted file mode 100644
index 343d4bf..0000000
--- a/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/xhtml/util/XhtmlResourceFactoryImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *     Mark Broerkens - initial API and implementation
- * 
- */
-package org.eclipse.rmf.reqif10.xhtml.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-/**
- * <!-- begin-user-doc --> The <b>Resource Factory</b> associated with the package. <!-- end-user-doc -->
- * 
- * @see org.eclipse.rmf.reqif10.xhtml.util.XhtmlResourceImpl
- * @generated
- */
-public class XhtmlResourceFactoryImpl extends ResourceFactoryImpl {
-	/**
-	 * Creates an instance of the resource factory. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public XhtmlResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Resource createResource(URI uri) {
-		XMLResource result = new XhtmlResourceImpl(uri);
-		result.getDefaultSaveOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-		result.getDefaultLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-
-		result.getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
-
-		result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-		result.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-
-		result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
-		return result;
-	}
-
-} // XhtmlResourceFactoryImpl
diff --git a/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/xhtml/util/XhtmlResourceImpl.java b/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/xhtml/util/XhtmlResourceImpl.java
deleted file mode 100644
index a5fd8f4..0000000
--- a/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/xhtml/util/XhtmlResourceImpl.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *     Mark Broerkens - initial API and implementation
- * 
- */
-package org.eclipse.rmf.reqif10.xhtml.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * <!-- begin-user-doc --> The <b>Resource </b> associated with the package. <!-- end-user-doc -->
- * 
- * @see org.eclipse.rmf.reqif10.xhtml.util.XhtmlResourceFactoryImpl
- * @generated
- */
-public class XhtmlResourceImpl extends XMLResourceImpl {
-	/**
-	 * Creates an instance of the resource. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param uri
-	 *            the URI of the new resource.
-	 * @generated
-	 */
-	public XhtmlResourceImpl(URI uri) {
-		super(uri);
-	}
-
-} // XhtmlResourceImpl
diff --git a/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/xhtml/util/XhtmlXMLProcessor.java b/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/xhtml/util/XhtmlXMLProcessor.java
deleted file mode 100644
index 9af32b0..0000000
--- a/org.eclipse.rmf.reqif10.xhtml/src/org/eclipse/rmf/reqif10/xhtml/util/XhtmlXMLProcessor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *     Mark Broerkens - initial API and implementation
- * 
- */
-package org.eclipse.rmf.reqif10.xhtml.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-import org.eclipse.rmf.reqif10.xhtml.XhtmlPackage;
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents <!-- begin-user-doc --> <!--
- * end-user-doc -->
- * 
- * @generated
- */
-public class XhtmlXMLProcessor extends XMLProcessor {
-
-	/**
-	 * Public constructor to instantiate the helper. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public XhtmlXMLProcessor() {
-		super((EPackage.Registry.INSTANCE));
-		XhtmlPackage.eINSTANCE.eClass();
-	}
-
-	/**
-	 * Register for "*" and "xml" file extensions the XhtmlResourceFactoryImpl factory. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected Map<String, Resource.Factory> getRegistrations() {
-		if (registrations == null) {
-			super.getRegistrations();
-			registrations.put(XML_EXTENSION, new XhtmlResourceFactoryImpl());
-			registrations.put(STAR_EXTENSION, new XhtmlResourceFactoryImpl());
-		}
-		return registrations;
-	}
-
-} // XhtmlXMLProcessor
diff --git a/org.eclipse.rmf.serialization/.gitignore b/org.eclipse.rmf.serialization/.gitignore
deleted file mode 100644
index 70db735..0000000
--- a/org.eclipse.rmf.serialization/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-bin
-target
-work
\ No newline at end of file
diff --git a/org.eclipse.rmf.serialization/.settings/org.eclipse.core.resources.prefs b/org.eclipse.rmf.serialization/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 845273e..0000000
--- a/org.eclipse.rmf.serialization/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-eclipse.preferences.version=1
-encoding//design/default.ecore=UTF-8
-encoding//design/resources.ecore_diagram=UTF-8
-encoding/<project>=UTF-8
diff --git a/org.eclipse.rmf.serialization/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.rmf.serialization/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 54de855..0000000
--- a/org.eclipse.rmf.serialization/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,372 +0,0 @@
-#Thu Apr 12 17:16:42 CEST 2012
-eclipse.preferences.version=1
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
-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.includeNullInfoFromAsserts=disabled
-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=warning
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
-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=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=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.unavoidableGenericTypeProblems=enabled
-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=warning
-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.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.compiler.source=1.5
-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_resources_in_try=80
-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.alignment_for_union_type_in_multicatch=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=true
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
-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=120
-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.comment.preserve_white_space_between_code_and_line_comments=false
-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_field=insert
-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_method=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=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_try=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_semicolon_in_try_resources=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_try=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_try=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_semicolon_in_try_resources=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=true
-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=150
-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_before_or_operator_multicatch=true
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/org.eclipse.rmf.serialization/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.rmf.serialization/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 94bcd86..0000000
--- a/org.eclipse.rmf.serialization/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,120 +0,0 @@
-#Wed Apr 04 18:47:36 CEST 2012
-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=false
-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=false
-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=false
-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=false
-cleanup.remove_unused_private_types=false
-cleanup.sort_members=false
-cleanup.sort_members_all=false
-cleanup.use_blocks=true
-cleanup.use_blocks_only_for_return_and_throw=false
-cleanup.use_parentheses_in_expressions=true
-cleanup.use_this_for_non_static_field_access=true
-cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-cleanup.use_this_for_non_static_method_access=true
-cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-cleanup_profile=_Unmanaged profile 'RMF'
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_RMF
-formatter_settings_version=12
-org.eclipse.jdt.ui.exception.name=ex
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=java;javax;org;com;
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.ondemandthreshold=99
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.staticondemandthreshold=99
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * &lt;copyright&gt;\n * \n * Copyright (c) {contributing company name} 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 *     {contributing company name} - Initial API and implementation\n * \n * &lt;/copyright&gt;\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/*\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=false
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=false
-sp_cleanup.remove_trailing_whitespaces=true
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=true
-sp_cleanup.remove_unused_imports=true
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=false
-sp_cleanup.remove_unused_private_types=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=true
-sp_cleanup.use_this_for_non_static_field_access=true
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=true
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.rmf.serialization/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.rmf.serialization/.settings/org.eclipse.ltk.core.refactoring.prefs
deleted file mode 100644
index ac5f8a2..0000000
--- a/org.eclipse.rmf.serialization/.settings/org.eclipse.ltk.core.refactoring.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Wed Apr 04 18:47:53 CEST 2012
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.rmf.serialization/.settings/org.eclipse.pde.prefs b/org.eclipse.rmf.serialization/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 546490c..0000000
--- a/org.eclipse.rmf.serialization/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,33 +0,0 @@
-#Wed Apr 04 18:47:36 CEST 2012
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.build.bin.includes=1
-compilers.p.build.encodings=2
-compilers.p.build.java.compiler=2
-compilers.p.build.java.compliance=1
-compilers.p.build.missing.output=2
-compilers.p.build.output.library=1
-compilers.p.build.source.library=1
-compilers.p.build.src.includes=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=2
-compilers.p.missing-version-export-package=2
-compilers.p.missing-version-import-package=2
-compilers.p.missing-version-require-bundle=2
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/org.eclipse.rmf.serialization/.settings/org.eclipse.wst.xml.core.prefs b/org.eclipse.rmf.serialization/.settings/org.eclipse.wst.xml.core.prefs
deleted file mode 100644
index 2f885f5..0000000
--- a/org.eclipse.rmf.serialization/.settings/org.eclipse.wst.xml.core.prefs
+++ /dev/null
@@ -1,18 +0,0 @@
-#Wed Apr 04 18:48:00 CEST 2012
-attributeHasNoValue=2
-eclipse.preferences.version=1
-endTagWithAttributes=2
-honourAllSchemaLocations=true
-indicateNoGrammar=1
-indiciateNoDocumentElement=-1
-markupValidation=true
-missingClosingBracket=2
-missingClosingQuote=2
-missingEndTag=2
-missingQuotes=2
-missingStartTag=2
-missingTagName=2
-namespaceInPITarget=2
-whitespaceAtStart=2
-whitespaceBeforeTagName=2
-xinclude=true
diff --git a/org.eclipse.rmf.serialization/META-INF/MANIFEST.MF b/org.eclipse.rmf.serialization/META-INF/MANIFEST.MF
deleted file mode 100644
index b2da13f..0000000
--- a/org.eclipse.rmf.serialization/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,15 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-SymbolicName: org.eclipse.rmf.serialization;singleton:=true
-Bundle-Version: 0.12.0.qualifier
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.apache.xerces,
- org.eclipse.emf.ecore;bundle-version="2.7.0",
- org.eclipse.emf.ecore.xmi;bundle-version="2.7.0"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.rmf.internal.serialization,
- org.eclipse.rmf.serialization
-Bundle-Name: %pluginName
-Bundle-Vendor: %providerName
diff --git a/org.eclipse.rmf.serialization/about.html b/org.eclipse.rmf.serialization/about.html
deleted file mode 100644
index c258ef5..0000000
--- a/org.eclipse.rmf.serialization/about.html
+++ /dev/null
@@ -1,28 +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=ISO-8859-1"/>
-<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>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/org.eclipse.rmf.serialization/build.properties b/org.eclipse.rmf.serialization/build.properties
deleted file mode 100644
index fe0783d..0000000
--- a/org.eclipse.rmf.serialization/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2014 itemis AG 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:
-#     Mark Broerkens (itemis AG) - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.properties,\
-               epl-v10.html,\
-               notice.html,\
-               about.html
diff --git a/org.eclipse.rmf.serialization/epl-v10.html b/org.eclipse.rmf.serialization/epl-v10.html
deleted file mode 100644
index 3998fce..0000000
--- a/org.eclipse.rmf.serialization/epl-v10.html
+++ /dev/null
@@ -1,261 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Public License - Version 1.0</title>
-<style type="text/css">
-  body {
-    size: 8.5in 11.0in;
-    margin: 0.25in 0.5in 0.25in 0.5in;
-    tab-interval: 0.5in;
-    }
-  p {  	
-    margin-left: auto;
-    margin-top:  0.5em;
-    margin-bottom: 0.5em;
-    }
-  p.list {
-  	margin-left: 0.5in;
-    margin-top:  0.05em;
-    margin-bottom: 0.05em;
-    }
-  </style>
-
-</head>
-
-<body lang="EN-US">
-
-<h2>Eclipse Public License - v 1.0</h2>
-
-<p>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.</p>
-
-<p><b>1. DEFINITIONS</b></p>
-
-<p>&quot;Contribution&quot; means:</p>
-
-<p class="list">a) in the case of the initial Contributor, the initial
-code and documentation distributed under this Agreement, and</p>
-<p class="list">b) in the case of each subsequent Contributor:</p>
-<p class="list">i) changes to the Program, and</p>
-<p class="list">ii) additions to the Program;</p>
-<p class="list">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.</p>
-
-<p>&quot;Contributor&quot; means any person or entity that distributes
-the Program.</p>
-
-<p>&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.</p>
-
-<p>&quot;Program&quot; means the Contributions distributed in accordance
-with this Agreement.</p>
-
-<p>&quot;Recipient&quot; means anyone who receives the Program under
-this Agreement, including all Contributors.</p>
-
-<p><b>2. GRANT OF RIGHTS</b></p>
-
-<p class="list">a) Subject to the terms of this Agreement, each
-Contributor hereby grants Recipient a non-exclusive, worldwide,
-royalty-free copyright license to 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.</p>
-
-<p class="list">b) Subject to the terms of this Agreement, each
-Contributor hereby grants Recipient a non-exclusive, worldwide,
-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.</p>
-
-<p class="list">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.</p>
-
-<p class="list">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.</p>
-
-<p><b>3. REQUIREMENTS</b></p>
-
-<p>A Contributor may choose to distribute the Program in object code
-form under its own license agreement, provided that:</p>
-
-<p class="list">a) it complies with the terms and conditions of this
-Agreement; and</p>
-
-<p class="list">b) its license agreement:</p>
-
-<p class="list">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;</p>
-
-<p class="list">ii) effectively excludes on behalf of all Contributors
-all liability for damages, including direct, indirect, special,
-incidental and consequential damages, such as lost profits;</p>
-
-<p class="list">iii) states that any provisions which differ from this
-Agreement are offered by that Contributor alone and not by any other
-party; and</p>
-
-<p class="list">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.</p>
-
-<p>When the Program is made available in source code form:</p>
-
-<p class="list">a) it must be made available under this Agreement; and</p>
-
-<p class="list">b) a copy of this Agreement must be included with each
-copy of the Program.</p>
-
-<p>Contributors may not remove or alter any copyright notices contained
-within the Program.</p>
-
-<p>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.</p>
-
-<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p><b>5. NO WARRANTY</b></p>
-
-<p>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.</p>
-
-<p><b>6. DISCLAIMER OF LIABILITY</b></p>
-
-<p>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.</p>
-
-<p><b>7. GENERAL</b></p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/org.eclipse.rmf.serialization/notice.html b/org.eclipse.rmf.serialization/notice.html
deleted file mode 100644
index c3d34c3..0000000
--- a/org.eclipse.rmf.serialization/notice.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 9, 2014</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>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
-       <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>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/org.eclipse.rmf.serialization/plugin.properties b/org.eclipse.rmf.serialization/plugin.properties
deleted file mode 100644
index 08b1475..0000000
--- a/org.eclipse.rmf.serialization/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2014 itemis AG 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:
-#     Mark Broerkens (itemis AG) - initial API and implementation
-###############################################################################
-
-pluginName = RMF Core Serialization (Incubation)
-providerName = Eclipse Modeling Project
diff --git a/org.eclipse.rmf.serialization/pom.xml b/org.eclipse.rmf.serialization/pom.xml
deleted file mode 100644
index a556289..0000000
--- a/org.eclipse.rmf.serialization/pom.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- <copyright>
-Copyright (c) 2012 itemis AG.
-All rights reserved. This program and the accompanying materials
-are made available under the terms of the Eclipse Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/epl-v10.html
-
-Contributors:
-    Mark Broerkens - initial API and implementation
- </copyright>
-
--->
-<project
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.eclipse.rmf</groupId>
-		<artifactId>org.eclipse.rmf.releng</artifactId>
-		<version>0.12.0-SNAPSHOT</version>
-		<relativePath>../org.eclipse.rmf.releng/pom.xml</relativePath>
-	</parent>
-	<artifactId>org.eclipse.rmf.serialization</artifactId>
-	<packaging>eclipse-plugin</packaging>
-	<groupId>org.eclipse.rmf.plugins</groupId>
-	<properties>
-    	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-  	</properties>
-</project>
\ No newline at end of file
diff --git a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/XMLPersistenceMappingHandler.java b/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/XMLPersistenceMappingHandler.java
deleted file mode 100644
index 3058ea0..0000000
--- a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/XMLPersistenceMappingHandler.java
+++ /dev/null
@@ -1,1656 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *   itemis AG - initial API and implementation
- */
-
-package org.eclipse.rmf.internal.serialization;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-import org.apache.xerces.impl.Constants;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.URIConverter;
-import org.eclipse.emf.ecore.util.ExtendedMetaData;
-import org.eclipse.emf.ecore.xmi.ClassNotFoundException;
-import org.eclipse.emf.ecore.xmi.FeatureNotFoundException;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.SAXXMLHandler;
-import org.eclipse.emf.ecore.xml.type.AnyType;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingExtendedMetaData;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingExtendedMetaDataImpl;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResource;
-
-// TODO: add javadoc for each state chart
-// TODO: add pool that reuses loadpatterns (reduces GC overhead)
-// TODO: assert that extended metadata is available. 
-// TODO: assert that xmlMap is never used
-// TODO: check for correct handling of types, object stacks.
-// TODO: consider using symboltyble and replace .equals by ==
-// TODO: create assertions in case the Handler is not used corretly. e.g. extennded metadata has incorrect format
-// TODO: log info if options are used that are not supported
-public class XMLPersistenceMappingHandler extends SAXXMLHandler {
-	String xsiType;
-
-	XMLPersistenceMappingExtendedMetaData xmlPersistenceMappingExtendedMetaData = null;
-	MyStack<LoadPattern> loadPatternStack = null;
-
-	IProgressMonitor progressMonitor = null;
-	int progressMonitorChunksRead = 0;
-	int progressMonitorChunkSize = 2048;
-	int progressMonitorLastStartInChunk = 0;
-	int progressMonitorNumberOfChunksPerUpdate = 500;
-	private Set<String> progressReportedNamespaces = new HashSet<String>();
-
-	interface LoadPattern {
-		public static int STATE_READY = 0;
-		public static int STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT = 1;
-		public static int STATE_HAS_SEEN_START_FEATURE_ELEMENT = 2;
-		public static int STATE_HAS_SEEN_START_CLASSIFIER_WRAPPER_ELEMENT = 3;
-		public static int STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT = 4;
-		public static int STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT = 5;
-		public static int STATE_HAS_SEEN_END_FEATURE_ELEMENT = 6;
-		public static int STATE_HAS_SEEN_END_CLASSIFIER_WRAPPER_ELEMENT = 7;
-		public static int STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT = 8;
-		public static int STATE_DELEGATE_CHILD_NEEDED = -1;
-		public static int STATE_DELEGATE_PARENT_NEEDED = -2;
-		public static int STATE_DELEGATE_SIBLING_NEEDED = -3;
-
-		public static int STATE_UNEXPECTED_ELEMENT = -100;
-
-		void startElement(String namespace, String xmlName);
-
-		void endElement(String namespace, String xmlName);
-
-		boolean needsDelegateChild();
-
-		boolean needsDelegateSibling();
-
-		boolean needsDelegateParent();
-
-	}
-
-	abstract class AbstractLoadPatternImpl implements LoadPattern {
-		final EObject anchorEObject;
-		final EStructuralFeature feature;
-		int currentState;
-
-		public AbstractLoadPatternImpl(EObject anchorEObject, EStructuralFeature feature) {
-			this.anchorEObject = anchorEObject;
-			this.feature = feature;
-			currentState = STATE_READY;
-		}
-
-		public boolean needsDelegateChild() {
-			return STATE_DELEGATE_CHILD_NEEDED == currentState;
-		}
-
-		public boolean needsDelegateParent() {
-			return STATE_DELEGATE_PARENT_NEEDED == currentState;
-		}
-
-		public boolean needsDelegateSibling() {
-			return STATE_DELEGATE_SIBLING_NEEDED == currentState;
-		}
-
-	}
-
-	class LoadPatternEReferenceContained0001Impl extends AbstractLoadPatternImpl {
-		String classifierName = null;
-
-		public LoadPatternEReferenceContained0001Impl(EObject anchorEObject, EStructuralFeature feature) {
-			super(anchorEObject, feature);
-		}
-
-		public void startElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT;
-				classifierName = xmlName;
-				createObjectFromNamespaceAndType(anchorEObject, feature, namespace, xmlName);
-				break;
-			case STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT:
-				currentState = STATE_DELEGATE_CHILD_NEEDED;
-				break;
-			case STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT:
-				if (xmlName.equals(classifierName)) {
-					currentState = STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT;
-					createObjectFromNamespaceAndType(anchorEObject, feature, namespace, xmlName);
-				} else {
-					currentState = STATE_DELEGATE_SIBLING_NEEDED;
-				}
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		public void endElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT:
-				// this happens if there are no nested structures
-				handleEndCreateObjectElement();
-				currentState = STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_DELEGATE_CHILD_NEEDED:
-				// this happens if there are nested structures
-				handleEndCreateObjectElement();
-				currentState = STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT;
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	class LoadPatternEReferenceContained0100Impl extends AbstractLoadPatternImpl {
-		String featureName;
-
-		public LoadPatternEReferenceContained0100Impl(EObject anchorEObject, EStructuralFeature feature) {
-			super(anchorEObject, feature);
-		}
-
-		public void startElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-				featureName = xmlName;
-				// This puts the newly created eObject onto the objects stack
-				createObject(anchorEObject, feature);
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				currentState = STATE_DELEGATE_CHILD_NEEDED;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				if (featureName.equals(xmlName)) {
-					currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-					createObject(anchorEObject, feature);
-				} else {
-					currentState = STATE_DELEGATE_SIBLING_NEEDED;
-				}
-
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		public void endElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				handleEndCreateObjectElement();
-				currentState = STATE_HAS_SEEN_END_FEATURE_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_DELEGATE_CHILD_NEEDED:
-				handleEndCreateObjectElement();
-				currentState = STATE_HAS_SEEN_END_FEATURE_ELEMENT;
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	class LoadPatternEReferenceContained0101Impl extends AbstractLoadPatternImpl {
-		String featureName = null;
-
-		public LoadPatternEReferenceContained0101Impl(EObject anchorEObject, EStructuralFeature feature) {
-			super(anchorEObject, feature);
-		}
-
-		public void startElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				featureName = xmlName;
-				currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				currentState = STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT;
-
-				createObjectFromNamespaceAndType(anchorEObject, feature, namespace, xmlName);
-				break;
-			case STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT:
-				currentState = STATE_DELEGATE_CHILD_NEEDED;
-				break;
-			case STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT:
-				// for robustness: we allow multiple classiefier elements in a feature element. a warning should be
-				// created
-				currentState = STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT;
-				createObjectFromNamespaceAndType(anchorEObject, feature, namespace, xmlName);
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				if (featureName.equals(xmlName)) {
-					currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-				} else {
-					currentState = STATE_DELEGATE_SIBLING_NEEDED;
-				}
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		public void endElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				// only the feature element was available => consider it as a null value;
-
-				if (feature.isMany()) {
-					@SuppressWarnings("unchecked")
-					EList<EObject> values = (EList<EObject>) anchorEObject.eGet(feature);
-					values.clear();
-				} else {
-					setFeatureValue(anchorEObject, feature, null);
-				}
-				currentState = STATE_HAS_SEEN_END_FEATURE_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT:
-				handleEndCreateObjectElement();
-				currentState = STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT:
-				currentState = STATE_HAS_SEEN_END_FEATURE_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_DELEGATE_CHILD_NEEDED:
-				handleEndCreateObjectElement();
-				currentState = STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT;
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	class LoadPatternEReferenceContained1001Impl extends AbstractLoadPatternImpl {
-		String featureWrapperName = null;
-
-		public LoadPatternEReferenceContained1001Impl(EObject anchorEObject, EStructuralFeature feature) {
-			super(anchorEObject, feature);
-		}
-
-		public void startElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				featureWrapperName = xmlName;
-				currentState = STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT:
-				currentState = STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT;
-				createObjectFromNamespaceAndType(anchorEObject, feature, namespace, xmlName);
-				break;
-			case STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT:
-				currentState = STATE_DELEGATE_CHILD_NEEDED;
-				break;
-			case STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT:
-				currentState = STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT;
-				createObjectFromNamespaceAndType(anchorEObject, feature, namespace, xmlName);
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT:
-				if (featureWrapperName.equals(xmlName)) {
-					currentState = STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT;
-				} else {
-					currentState = STATE_DELEGATE_SIBLING_NEEDED;
-				}
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		public void endElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT:
-				// only the feature element was available => consider it as a null value;
-				if (feature.isMany()) {
-					@SuppressWarnings("unchecked")
-					EList<EObject> values = (EList<EObject>) anchorEObject.eGet(feature);
-					values.clear();
-				} else {
-					setFeatureValue(anchorEObject, feature, null);
-				}
-				currentState = STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT:
-				handleEndCreateObjectElement();
-				currentState = STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT:
-				currentState = STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_DELEGATE_CHILD_NEEDED:
-				handleEndCreateObjectElement();
-				currentState = STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT;
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	/**
-	 * This class implements.... <img src="doc-files/LoadPatternEAttributeContained0100.png">
-	 */
-	class LoadPatternEAttributeContained0100Impl extends AbstractLoadPatternImpl {
-		String featureName = null;
-		int depthsOfUnknownElements = 0;
-		String value = null;
-
-		public LoadPatternEAttributeContained0100Impl(EObject anchorEObject, EStructuralFeature feature) {
-			super(anchorEObject, feature);
-		}
-
-		public void startElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-				featureName = xmlName;
-				types.push(feature);
-				if (!isNull()) {
-					text = new StringBuffer();
-				}
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				currentState = STATE_UNEXPECTED_ELEMENT;
-				depthsOfUnknownElements = 1;
-				types.push(ERROR_TYPE);
-				error(new FeatureNotFoundException(xmlName, null, getLocation(), getLineNumber(), getColumnNumber()));
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements++;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				if (featureName.equals(xmlName)) {
-					text = new StringBuffer(); // record all strings
-					currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-					// wait to read contained text
-				} else {
-					currentState = STATE_DELEGATE_SIBLING_NEEDED;
-				}
-				break;
-
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		public void endElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				if (isNull()) {
-					setFeatureValue(anchorEObject, feature, null);
-				} else {
-					setFeatureValue(anchorEObject, feature, text == null ? null : text.toString());
-				}
-				text = null;
-				currentState = STATE_HAS_SEEN_END_FEATURE_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements--;
-				if (0 > depthsOfUnknownElements) {
-					currentState = STATE_HAS_SEEN_END_FEATURE_ELEMENT;
-				}
-				break;
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	class LoadPatternEAttributeContained1000Impl extends AbstractLoadPatternImpl {
-		String featureWrapperName = null;
-		int depthsOfUnknownElements = 0;
-
-		public LoadPatternEAttributeContained1000Impl(EObject anchorEObject, EStructuralFeature feature) {
-			super(anchorEObject, feature);
-		}
-
-		public void startElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT;
-				featureWrapperName = xmlName;
-				text = new StringBuffer(); // record all strings
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT:
-				currentState = STATE_UNEXPECTED_ELEMENT;
-				depthsOfUnknownElements = 1;
-				types.push(ERROR_TYPE);
-				error(new FeatureNotFoundException(xmlName, null, getLocation(), getLineNumber(), getColumnNumber()));
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements++;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT:
-				if (featureWrapperName.equals(xmlName)) {
-					currentState = STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT;
-					text = new StringBuffer(); // record all strings
-					// wait to read contained text
-				} else {
-					currentState = STATE_DELEGATE_SIBLING_NEEDED;
-				}
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		public void endElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT:
-				if (null == text) {
-					setFeatureValue(anchorEObject, feature, null);
-				} else {
-					String svalues = text.toString();
-					StringTokenizer st = new StringTokenizer(svalues);
-					String svalue;
-					while (st.hasMoreTokens()) {
-						svalue = st.nextToken();
-						setFeatureValue(anchorEObject, feature, svalue);
-					}
-				}
-				text = null;
-				currentState = STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements--;
-				if (0 > depthsOfUnknownElements) {
-					currentState = STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT;
-				}
-				break;
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	class LoadPatternEAttributeContained1100Impl extends AbstractLoadPatternImpl {
-		String featureWrapperName = null;
-		int depthsOfUnknownElements = 0;
-
-		public LoadPatternEAttributeContained1100Impl(EObject anchorEObject, EStructuralFeature feature) {
-			super(anchorEObject, feature);
-		}
-
-		public void startElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				featureWrapperName = xmlName;
-				currentState = STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT:
-				currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-				text = new StringBuffer(); // record all strings
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				currentState = STATE_UNEXPECTED_ELEMENT;
-				depthsOfUnknownElements = 1;
-				types.push(ERROR_TYPE);
-				error(new FeatureNotFoundException(xmlName, null, getLocation(), getLineNumber(), getColumnNumber()));
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT:
-				if (featureWrapperName == xmlName) {
-					currentState = STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT;
-				} else {
-					currentState = STATE_DELEGATE_SIBLING_NEEDED;
-				}
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-				text = new StringBuffer(); // record all strings
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements++;
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		public void endElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT:
-				currentState = STATE_READY;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				setFeatureValue(anchorEObject, feature, text == null ? null : text.toString());
-				text = null;
-				currentState = STATE_READY;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				currentState = STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT;
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements--;
-				if (0 > depthsOfUnknownElements) {
-					currentState = STATE_HAS_SEEN_END_FEATURE_ELEMENT;
-				}
-				break;
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	class LoadPatternEReferenceReferenced0100Impl extends AbstractLoadPatternImpl {
-		String featureName = null;
-		InternalEObject proxy;
-		int depthsOfUnknownElements = 0;
-
-		public LoadPatternEReferenceReferenced0100Impl(EObject anchorEObject, EStructuralFeature feature) {
-			super(anchorEObject, feature);
-		}
-
-		public void startElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-				createObject(anchorEObject, feature);
-				proxy = (InternalEObject) objects.peekEObject();
-				text = new StringBuffer(); // record all strings
-				featureName = xmlName;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				currentState = STATE_UNEXPECTED_ELEMENT;
-				depthsOfUnknownElements = 1;
-				types.push(ERROR_TYPE);
-				error(new FeatureNotFoundException(xmlName, null, getLocation(), getLineNumber(), getColumnNumber()));
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				if (featureName.equals(xmlName)) {
-					currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-					createObject(anchorEObject, feature);
-					proxy = (InternalEObject) objects.peekEObject();
-					text = new StringBuffer(); // record all strings
-				} else {
-					currentState = STATE_DELEGATE_SIBLING_NEEDED;
-				}
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements++;
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		public void endElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				if (null != proxy) {
-					handleProxy(proxy, resourceURI.toString() + "#" + text.toString()); //$NON-NLS-1$
-					objects.pop();
-				} else {
-					// NOP: error already handled during startElement()
-				}
-				text = null;
-				currentState = STATE_HAS_SEEN_END_FEATURE_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements--;
-				if (0 > depthsOfUnknownElements) {
-					currentState = STATE_HAS_SEEN_END_FEATURE_ELEMENT;
-				}
-				break;
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	class LoadPatternEReferenceReferenced0101Impl extends AbstractLoadPatternImpl {
-		String featureName = null;
-		InternalEObject proxy = null;
-		int depthsOfUnknownElements = 0;
-
-		public LoadPatternEReferenceReferenced0101Impl(EObject anchorEObject, EStructuralFeature feature) {
-			super(anchorEObject, feature);
-		}
-
-		public void startElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				featureName = xmlName;
-				currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				currentState = STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT;
-				proxy = (InternalEObject) createObjectFromNamespaceAndType(anchorEObject, feature, namespace, xmlName);
-				text = new StringBuffer(); // record all strings
-				break;
-			case STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT:
-				currentState = STATE_UNEXPECTED_ELEMENT;
-				depthsOfUnknownElements = 1;
-				types.push(ERROR_TYPE);
-				error(new FeatureNotFoundException(xmlName, null, getLocation(), getLineNumber(), getColumnNumber()));
-				break;
-			case STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT:
-				// for robustness: we allow multiple classifier elements in a feature element. a warning should be
-				// created
-				proxy = (InternalEObject) createObjectFromNamespaceAndType(anchorEObject, feature, namespace, xmlName);
-				currentState = STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT;
-				text = new StringBuffer(); // record all strings
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				if (featureName.equals(xmlName)) {
-					currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-				} else {
-					currentState = STATE_DELEGATE_SIBLING_NEEDED;
-				}
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements++;
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		public void endElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				currentState = STATE_HAS_SEEN_END_FEATURE_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT:
-				if (null != proxy) {
-					handleProxy(proxy, resourceURI.toString() + "#" + text.toString()); //$NON-NLS-1$
-					objects.pop();
-				} else {
-					// NOP: error already handled during startElement
-				}
-				text = null;
-				currentState = STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT:
-				currentState = STATE_HAS_SEEN_END_FEATURE_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements--;
-				if (0 > depthsOfUnknownElements) {
-					currentState = STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT;
-				}
-				break;
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	class LoadPatternEReferenceReferenced1001Impl extends AbstractLoadPatternImpl {
-		InternalEObject proxy = null;
-		String featureWrapperName = null;
-		int depthsOfUnknownElements = 0;
-
-		public LoadPatternEReferenceReferenced1001Impl(EObject anchorEObject, EStructuralFeature feature) {
-			super(anchorEObject, feature);
-		}
-
-		public void startElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				featureWrapperName = xmlName;
-				currentState = STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT:
-				currentState = STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT;
-				proxy = (InternalEObject) createObjectFromNamespaceAndType(anchorEObject, feature, namespace, xmlName);
-				text = new StringBuffer(); // record all strings
-				break;
-			case STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT:
-				currentState = STATE_UNEXPECTED_ELEMENT;
-				depthsOfUnknownElements = 1;
-				types.push(ERROR_TYPE);
-				error(new FeatureNotFoundException(xmlName, null, getLocation(), getLineNumber(), getColumnNumber()));
-				break;
-			case STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT:
-				// for robustness: we allow multiple classiefier elements in a feature element. a warning should be
-				// created
-				currentState = STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT;
-				proxy = (InternalEObject) createObjectFromNamespaceAndType(anchorEObject, feature, namespace, xmlName);
-				text = new StringBuffer(); // record all strings
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT:
-				if (featureWrapperName.equals(xmlName)) {
-					currentState = STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT;
-				} else {
-					currentState = STATE_DELEGATE_SIBLING_NEEDED;
-				}
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements++;
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		public void endElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT:
-				// only the feature element was available => consider it as a null value;
-				if (feature.isMany()) {
-					@SuppressWarnings("unchecked")
-					EList<EObject> values = (EList<EObject>) anchorEObject.eGet(feature);
-					values.clear();
-				} else {
-					setFeatureValue(anchorEObject, feature, null);
-				}
-				currentState = STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_START_CLASSIFIER_ELEMENT:
-				if (null != proxy) {
-					objects.pop();
-					handleProxy(proxy, resourceURI.toString() + "#" + text.toString()); //$NON-NLS-1$
-				}
-
-				text = null;
-				currentState = STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT:
-				currentState = STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements--;
-				if (0 > depthsOfUnknownElements) {
-					currentState = STATE_HAS_SEEN_END_CLASSIFIER_ELEMENT;
-				}
-				break;
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	class LoadPatternEReferenceReferenced1100Impl extends AbstractLoadPatternImpl {
-		String featureWrapperName = null;
-		EObject proxy;
-		int depthsOfUnknownElements = 0;
-
-		public LoadPatternEReferenceReferenced1100Impl(EObject anchorEObject, EStructuralFeature feature) {
-			super(anchorEObject, feature);
-		}
-
-		public void startElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				featureWrapperName = xmlName;
-				currentState = STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT:
-				currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-				createObject(anchorEObject, feature);
-				text = new StringBuffer(); // record all strings
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				currentState = STATE_UNEXPECTED_ELEMENT;
-				depthsOfUnknownElements = 1;
-				types.push(ERROR_TYPE);
-				error(new FeatureNotFoundException(xmlName, null, getLocation(), getLineNumber(), getColumnNumber()));
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT:
-				if (featureWrapperName.equals(xmlName)) {
-					currentState = STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT;
-				} else {
-					currentState = STATE_DELEGATE_SIBLING_NEEDED;
-				}
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				currentState = STATE_HAS_SEEN_START_FEATURE_ELEMENT;
-				createObject(anchorEObject, feature);
-				text = new StringBuffer(); // record all strings
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		public void endElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_WRAPPER_ELEMENT:
-				currentState = STATE_READY;
-				break;
-			case STATE_HAS_SEEN_START_FEATURE_ELEMENT:
-				if (null != proxy) {
-					handleProxy((InternalEObject) objects.peekEObject(), resourceURI.toString() + "#" + text.toString()); //$NON-NLS-1$
-					objects.pop();
-				}
-				text = null;
-				currentState = STATE_READY;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_HAS_SEEN_END_FEATURE_ELEMENT:
-				currentState = STATE_HAS_SEEN_END_FEATURE_WRAPPER_ELEMENT;
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements--;
-				if (0 > depthsOfUnknownElements) {
-					currentState = STATE_HAS_SEEN_END_FEATURE_ELEMENT;
-				}
-				break;
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	class LoadPatternUnknownImpl extends AbstractLoadPatternImpl {
-		int depthsOfUnknownElements = 0;
-
-		public LoadPatternUnknownImpl(EObject anchorEObject, EStructuralFeature feature) {
-			super(anchorEObject, feature);
-		}
-
-		public void startElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_UNEXPECTED_ELEMENT;
-				depthsOfUnknownElements = 1;
-				types.push(ERROR_TYPE);
-				error(new FeatureNotFoundException(xmlName, null, getLocation(), getLineNumber(), getColumnNumber()));
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements++;
-				break;
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		public void endElement(String namespace, String xmlName) {
-			switch (currentState) {
-			case STATE_READY:
-				currentState = STATE_DELEGATE_PARENT_NEEDED;
-				break;
-			case STATE_UNEXPECTED_ELEMENT:
-				depthsOfUnknownElements--;
-				if (0 > depthsOfUnknownElements) {
-					currentState = STATE_DELEGATE_PARENT_NEEDED;
-				}
-				break;
-			case STATE_DELEGATE_CHILD_NEEDED:
-			case STATE_DELEGATE_SIBLING_NEEDED:
-			case STATE_DELEGATE_PARENT_NEEDED:
-				assert false : "handshake error: the dispatcher should have switched to another load pattern instance (state=" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-				break;
-			default:
-				assert false : "state machine error: unsupported state (state =" + currentState + ", startElement)"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	public XMLPersistenceMappingHandler(XMLResource xmlResource, XMLHelper helper, Map<?, ?> options) {
-		super(xmlResource, helper, options);
-
-		// set extended meta data
-		Object extendedMetaDataOption = options.get(XMLResource.OPTION_EXTENDED_META_DATA);
-		if (null != extendedMetaDataOption && extendedMetaDataOption instanceof XMLPersistenceMappingExtendedMetaData) {
-			xmlPersistenceMappingExtendedMetaData = (XMLPersistenceMappingExtendedMetaData) options.get(XMLResource.OPTION_EXTENDED_META_DATA);
-			extendedMetaData = xmlPersistenceMappingExtendedMetaData;
-		} else {
-			// default
-			xmlPersistenceMappingExtendedMetaData = xmlResource == null || xmlResource.getResourceSet() == null ? XMLPersistenceMappingExtendedMetaData.INSTANCE
-					: new XMLPersistenceMappingExtendedMetaDataImpl(xmlResource.getResourceSet().getPackageRegistry());
-			extendedMetaData = xmlPersistenceMappingExtendedMetaData;
-		}
-		helper.setExtendedMetaData(xmlPersistenceMappingExtendedMetaData);
-
-		// initialize progress monitor
-		Object progressMonitor = options.get(XMLPersistenceMappingResource.OPTION_PROGRESS_MONITOR);
-		if (progressMonitor instanceof IProgressMonitor) {
-			this.progressMonitor = (IProgressMonitor) progressMonitor;
-		} else {
-			// ignore
-		}
-
-		// get chunk size of xml parser, that is required for calculation of progress monitor ticks
-		Object parserPropertiesObject = options.get(XMLResource.OPTION_PARSER_PROPERTIES);
-		if (null != parserPropertiesObject && parserPropertiesObject instanceof Map<?, ?>) {
-			@SuppressWarnings("unchecked")
-			Map<String, Object> parserProperties = (Map<String, Object>) parserPropertiesObject;
-			Object bufferSizeObject = parserProperties.get(Constants.XERCES_PROPERTY_PREFIX + Constants.BUFFER_SIZE_PROPERTY);
-			if (bufferSizeObject instanceof Integer) {
-				progressMonitorChunkSize = (Integer) bufferSizeObject;
-			} else {
-				// use default;
-			}
-		} else {
-			// use default;
-		}
-
-		loadPatternStack = new MyStack<LoadPattern>();
-		xsiType = null;
-
-		// redefine href attribute since e.g.:
-		// xhtml.a.type/@href conflicts with this attribute and results in proxy resolution which can in turn
-		// result in long delays during load.
-		hrefAttribute = XMLPersistenceMappingResource.HREF;
-
-		// postconditions
-		assert null != xmlPersistenceMappingExtendedMetaData;
-		assert null != extendedMetaData;
-
-	}
-
-	/**
-	 * Create an object based on the given feature and attributes.
-	 */
-	protected EObject createObjectFromNamespaceAndType(EObject peekObject, EStructuralFeature feature, String namespace, String typeXMLName) {
-		assert null != xmlPersistenceMappingExtendedMetaData;
-		assert null != peekObject;
-		assert null != feature;
-		assert null != namespace;
-		assert null != typeXMLName;
-
-		// Inform the progress monitor. As looking up the namespace can be slow (network),
-		// it will at least tell the user what's taking so long
-		if (progressMonitor != null && namespace != null && !progressReportedNamespaces.contains(namespace)) {
-			progressMonitor.subTask("Processing Namespace: " + namespace); //$NON-NLS-1$
-			progressReportedNamespaces.add(namespace);
-		}
-
-		// make sure, that information about feature is available for handleMissingPackage
-		contextFeature = feature;
-		EPackage ePackage = getPackageForURI(namespace);
-		contextFeature = null;
-
-		if (null != ePackage) {
-			EClassifier eClassifier;
-			if (xmlPersistenceMappingExtendedMetaData.demandedPackages().contains(ePackage)) {
-				// demand package requires demand type
-				eClassifier = xmlPersistenceMappingExtendedMetaData.demandType(namespace, typeXMLName);
-			} else {
-				eClassifier = xmlPersistenceMappingExtendedMetaData.getTypeByXMLName(namespace, typeXMLName, feature);
-			}
-
-			EFactory eFactory = ePackage.getEFactoryInstance();
-
-			if (null != eClassifier) {
-				EObject obj = createObject(eFactory, eClassifier, false);
-				obj = validateCreateObjectFromFactory(eFactory, typeXMLName, obj, feature);
-				if (obj != null) {
-					setFeatureValue(peekObject, feature, obj);
-					processObject(obj);
-				}
-				return obj;
-			} else {
-				error(new ClassNotFoundException(typeXMLName, eFactory, getLocation(), getLineNumber(), getColumnNumber()));
-				return null;
-			}
-
-		} else {
-			return null;
-		}
-	}
-
-	@Override
-	protected EObject validateCreateObjectFromFactory(EFactory factory, String typeName, EObject newObject, EStructuralFeature feature) {
-		if (newObject != null) {
-			if (extendedMetaData != null) {
-				Collection<EPackage> demandedPackages = extendedMetaData.demandedPackages();
-				if (!demandedPackages.isEmpty() && demandedPackages.contains(newObject.eClass().getEPackage())) {
-					if (xmlPersistenceMappingExtendedMetaData.isXMLPersistenceMappingEnabled(feature)) {
-						List<String> wildcards = xmlPersistenceMappingExtendedMetaData.getWildcards(feature);
-						if (xmlPersistenceMappingExtendedMetaData.matches(wildcards, newObject.eClass().getEPackage().getNsURI())) {
-							return newObject;
-						} else {
-							return null;
-						}
-					} else {
-						// the new object resulted from a demanded package
-						if (recordUnknownFeature) {
-							// recordUnknownFeature
-							EObject peekObject = objects.peekEObject();
-							if (!(peekObject instanceof AnyType)) {
-								AnyType anyType = getExtension(objects.peekEObject());
-								EStructuralFeature entryFeature = extendedMetaData.demandFeature(extendedMetaData.getNamespace(feature),
-										extendedMetaData.getName(feature), true);
-								anyType.getAny().add(entryFeature, newObject);
-								contextFeature = entryFeature;
-							}
-							return newObject;
-						} else {
-							// reportUnknowFeature
-							String namespace = extendedMetaData.getNamespace(feature);
-							String name = extendedMetaData.getName(feature);
-							EStructuralFeature wildcardFeature = extendedMetaData.getElementWildcardAffiliation(objects.peekEObject().eClass(),
-									namespace, name);
-							if (wildcardFeature != null) {
-								int processingKind = laxWildcardProcessing ? ExtendedMetaData.LAX_PROCESSING : extendedMetaData
-										.getProcessingKind(wildcardFeature);
-								switch (processingKind) {
-								case ExtendedMetaData.LAX_PROCESSING:
-								case ExtendedMetaData.SKIP_PROCESSING: {
-									return newObject;
-								}
-								}
-							}
-						}
-
-						newObject = null;
-					}
-				}
-			}
-		} else if (feature != null && factory != null && extendedMetaData != null) {
-			// processing unknown feature with xsi:type (xmi:type)
-			if (recordUnknownFeature || processAnyXML) {
-
-				EObject result = null;
-				String namespace = extendedMetaData.getNamespace(factory.getEPackage());
-				if (namespace == null) {
-					usedNullNamespacePackage = true;
-				}
-
-				EClassifier type = extendedMetaData.demandType(namespace, typeName);
-				result = createObject(type.getEPackage().getEFactoryInstance(), type, false);
-
-				EObject peekObject = objects.peekEObject();
-				if (!(peekObject instanceof AnyType)) {
-					// add as extension to an existing eobject
-					AnyType anyType = getExtension(peekObject);
-					EStructuralFeature entryFeature = extendedMetaData.demandFeature(extendedMetaData.getNamespace(feature),
-							extendedMetaData.getName(feature), true);
-					anyType.getAny().add(entryFeature, result);
-					contextFeature = entryFeature;
-				}
-				return result;
-			} else {
-				String namespace = extendedMetaData.getNamespace(feature);
-				String name = extendedMetaData.getName(feature);
-				EStructuralFeature wildcardFeature = extendedMetaData.getElementWildcardAffiliation(objects.peekEObject().eClass(), namespace, name);
-				if (wildcardFeature != null) {
-					int processingKind = laxWildcardProcessing ? ExtendedMetaData.LAX_PROCESSING : extendedMetaData
-							.getProcessingKind(wildcardFeature);
-					switch (processingKind) {
-					case ExtendedMetaData.LAX_PROCESSING:
-					case ExtendedMetaData.SKIP_PROCESSING: {
-						// EATM Demand create metadata; needs to depend on processing mode...
-						String factoryNamespace = extendedMetaData.getNamespace(factory.getEPackage());
-						if (factoryNamespace == null) {
-							usedNullNamespacePackage = true;
-						}
-						EClassifier type = extendedMetaData.demandType(factoryNamespace, typeName);
-						return createObject(type.getEPackage().getEFactoryInstance(), type, false);
-					}
-					}
-				}
-			}
-		}
-
-		validateCreateObjectFromFactory(factory, typeName, newObject);
-
-		return newObject;
-	}
-
-	@Override
-	public void characters(char[] ch, int start, int length) {
-		super.characters(ch, start, length);
-		if (null != progressMonitor) {
-			if (start < progressMonitorLastStartInChunk) {
-				progressMonitorChunksRead += 1;
-			}
-			if (progressMonitorChunksRead > progressMonitorNumberOfChunksPerUpdate) {
-				progressMonitor.worked(progressMonitorChunksRead);
-				progressMonitorChunksRead = 0;
-			}
-			progressMonitorLastStartInChunk = start;
-		}
-	}
-
-	@Override
-	public void endElement(String uri, String localName, String qName) {
-		if (null != xmlPersistenceMappingExtendedMetaData) {
-			elements.pop();
-			types.pop();
-
-			helper.popContext(prefixesToFactories);
-
-			// end from super.endElement
-
-			LoadPattern activeDeserializationRule = loadPatternStack.peek();
-			if (null != activeDeserializationRule) {
-				activeDeserializationRule.endElement(uri, localName);
-				if (activeDeserializationRule.needsDelegateParent()) {
-					loadPatternStack.pop();
-					activeDeserializationRule = loadPatternStack.peek();
-					if (null != activeDeserializationRule) {
-						// this happens if we return to the root object
-						activeDeserializationRule.endElement(uri, localName);
-					}
-				}
-			}
-		} else {
-			super.endElement(uri, localName, qName);
-		}
-	}
-
-	/**
-	 * The XML element represents a feature. There are two cases to handle: 1. The feature has a type that is a
-	 * datatype. 2. The feature has a type that is a class.
-	 */
-	@Override
-	protected void handleFeature(String prefix, String name) {
-		assert useNewMethods == true;
-		EObject peekObject = objects.peekEObject();
-
-		// This happens when processing an element with simple content that has elements content even though it
-		// shouldn't.
-		//
-		if (peekObject == null) {
-			types.push(ERROR_TYPE);
-			error(new FeatureNotFoundException(name, null, getLocation(), getLineNumber(), getColumnNumber()));
-			return;
-		}
-
-		if (null != xmlPersistenceMappingExtendedMetaData) {
-			String namespace = helper.getNamespaceURI(prefix);
-			LoadPattern activeDeserializationRule = loadPatternStack.peek();
-			if (null == activeDeserializationRule) {
-				activeDeserializationRule = getLoadPattern(peekObject, prefix, name);
-				assert null != activeDeserializationRule : "getLoadPattern() should never return null"; //$NON-NLS-1$
-				loadPatternStack.push(activeDeserializationRule);
-			}
-
-			if (null != activeDeserializationRule) {
-				activeDeserializationRule.startElement(namespace, name);
-				if (activeDeserializationRule.needsDelegateChild()) {
-					activeDeserializationRule = getLoadPattern(peekObject, prefix, name);
-					assert null != activeDeserializationRule : "getLoadPattern() should never return null"; //$NON-NLS-1$
-					loadPatternStack.push(activeDeserializationRule);
-					activeDeserializationRule.startElement(namespace, name);
-				} else if (activeDeserializationRule.needsDelegateSibling()) {
-					activeDeserializationRule = getLoadPattern(peekObject, prefix, name);
-					assert null != activeDeserializationRule : "getLoadPattern() should never return null"; //$NON-NLS-1$
-					loadPatternStack.pop();
-					loadPatternStack.push(activeDeserializationRule);
-					activeDeserializationRule.startElement(namespace, name);
-				} else {
-					// normal operation, no need for switching to another load pattern
-				}
-
-			}
-
-		} else {
-			EStructuralFeature feature = getFeature(peekObject, prefix, name, true);
-			if (feature != null) {
-				int kind = helper.getFeatureKind(feature);
-				if (kind == XMLHelper.DATATYPE_SINGLE || kind == XMLHelper.DATATYPE_IS_MANY) {
-					objects.push(null);
-					mixedTargets.push(null);
-					types.push(feature);
-					if (!isNull()) {
-						text = new StringBuffer();
-					}
-				} else if (extendedMetaData != null) {
-					EReference eReference = (EReference) feature;
-					boolean isContainment = eReference.isContainment();
-					if (!isContainment && !eReference.isResolveProxies()
-							&& extendedMetaData.getFeatureKind(feature) != ExtendedMetaData.UNSPECIFIED_FEATURE) {
-						isIDREF = true;
-						objects.push(null);
-						mixedTargets.push(null);
-						types.push(feature);
-						text = new StringBuffer();
-					} else {
-						createObject(peekObject, feature);
-						// child object is put on top of objects stack
-						// if an error occured, then types.peek is ERROR
-						//
-						EObject childObject = objects.peekEObject();
-						if (childObject != null) {
-							if (isContainment) {
-								EStructuralFeature simpleFeature = extendedMetaData.getSimpleFeature(childObject.eClass());
-								if (simpleFeature != null) {
-									isSimpleFeature = true;
-									isIDREF = simpleFeature instanceof EReference;
-									objects.push(null);
-									mixedTargets.push(null);
-									types.push(simpleFeature);
-									text = new StringBuffer();
-								}
-							} else if (!childObject.eIsProxy()) {
-								text = new StringBuffer();
-							}
-						}
-					}
-				} else {
-					createObject(peekObject, feature);
-				}
-			} else {
-				// Try to get a general-content feature.
-				// Use a pattern that's not possible any other way.
-				//
-				if (xmlMap != null && (feature = getFeature(peekObject, null, "", true)) != null) { //$NON-NLS-1$
-
-					EFactory eFactory = getFactoryForPrefix(prefix);
-
-					// This is for the case for a local unqualified element that has been bound.
-					//
-					if (eFactory == null) {
-						eFactory = feature.getEContainingClass().getEPackage().getEFactoryInstance();
-					}
-
-					EObject newObject = null;
-					newObject = createObject(eFactory, helper.getType(eFactory, name), false);
-					newObject = validateCreateObjectFromFactory(eFactory, name, newObject, feature);
-					if (newObject != null) {
-						setFeatureValue(peekObject, feature, newObject);
-					}
-					processObject(newObject);
-				} else {
-					// This handles the case of a substitution group.
-					//
-					if (xmlMap != null) {
-						EFactory eFactory = getFactoryForPrefix(prefix);
-						EObject newObject = createObjectFromFactory(eFactory, name);
-						validateCreateObjectFromFactory(eFactory, name, newObject);
-						if (newObject != null) {
-							for (EReference eReference : peekObject.eClass().getEAllReferences()) {
-								if (eReference.getEType().isInstance(newObject)) {
-									setFeatureValue(peekObject, eReference, newObject);
-									processObject(newObject);
-									return;
-								}
-							}
-						}
-					}
-
-					handleUnknownFeature(prefix, name, true, peekObject, null);
-				}
-			}
-		}
-	}
-
-	protected LoadPattern getLoadPattern(EObject eObject, String prefix, String name) {
-		assert null != xmlPersistenceMappingExtendedMetaData;
-
-		LoadPattern deserializationRule = null;
-
-		if (eObject instanceof AnyType) {
-			// handle any type using standard emf serialization
-			EStructuralFeature feature = super.getFeature(eObject, prefix, name, true);
-			deserializationRule = new LoadPatternEReferenceContained0100Impl(eObject, feature);
-		} else {
-			EStructuralFeature feature = getFeature(eObject, prefix, name, true);
-			if (null != feature) {
-				int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(feature);
-				if (feature instanceof EReference) {
-					EReference reference = (EReference) feature;
-					if (reference.isContainment()) {
-						switch (featureSerializationStructure) {
-						case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT:
-							deserializationRule = new LoadPatternEReferenceContained0001Impl(eObject, feature);
-							break;
-						case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
-							deserializationRule = new LoadPatternEReferenceContained0100Impl(eObject, feature);
-							break;
-						case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-							deserializationRule = new LoadPatternEReferenceContained0101Impl(eObject, feature);
-							break;
-						case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-							deserializationRule = new LoadPatternEReferenceContained1001Impl(eObject, feature);
-							break;
-						case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
-							deserializationRule = new LoadPatternEReferenceContained0100Impl(eObject, feature);
-							break;
-						default:
-							deserializationRule = new LoadPatternEReferenceContained1001Impl(eObject, feature);
-							break;
-						}
-					} else {
-						switch (featureSerializationStructure) {
-						case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
-							deserializationRule = new LoadPatternEReferenceReferenced0100Impl(eObject, feature);
-							break;
-						case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-							deserializationRule = new LoadPatternEReferenceReferenced0101Impl(eObject, feature);
-							break;
-						case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-							deserializationRule = new LoadPatternEReferenceReferenced1001Impl(eObject, feature);
-							break;
-						case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
-							deserializationRule = new LoadPatternEReferenceReferenced0100Impl(eObject, feature);
-							break;
-						default:
-							deserializationRule = new LoadPatternEReferenceReferenced1001Impl(eObject, feature);
-							break;
-						}
-					}
-				} else {
-					// feature is an EAttribute
-					switch (featureSerializationStructure) {
-					case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
-						deserializationRule = new LoadPatternEAttributeContained0100Impl(eObject, feature);
-						break;
-					case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT:
-						deserializationRule = new LoadPatternEAttributeContained1000Impl(eObject, feature);
-						break;
-					case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT:
-						deserializationRule = new LoadPatternEAttributeContained1100Impl(eObject, feature);
-						break;
-					case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
-						deserializationRule = new LoadPatternEAttributeContained0100Impl(eObject, feature);
-						break;
-
-					default:
-						deserializationRule = new LoadPatternEAttributeContained0100Impl(eObject, feature);
-						break;
-					}
-
-				}
-			} else {
-				deserializationRule = new LoadPatternUnknownImpl(eObject, feature);
-			}
-		}
-
-		assert null != deserializationRule : "getLoadPattern() should always return a LoadPattern (!=null)"; //$NON-NLS-1$
-		return deserializationRule;
-
-	}
-
-	@Override
-	protected EStructuralFeature getFeature(EObject object, String prefix, String name, boolean isElement) {
-		assert null != object;
-		assert null != name;
-		EStructuralFeature result = null;
-		if (isElement && null != xmlPersistenceMappingExtendedMetaData) {
-			String namespace = helper.getNamespaceURI(prefix);
-			result = xmlPersistenceMappingExtendedMetaData.getFeatureByXMLElementName(object.eClass(), namespace, name);
-		} else {
-			result = super.getFeature(object, prefix, name, isElement);
-		}
-		return result;
-	}
-
-	@Override
-	public void reset() {
-		super.reset();
-		loadPatternStack = null;
-		hrefAttribute = XMLPersistenceMappingResource.HREF;
-
-	};
-
-	@Override
-	public void prepare(XMLResource resource, XMLHelper helper, Map<?, ?> options) {
-		super.prepare(resource, helper, options);
-		loadPatternStack = new MyStack<LoadPattern>();
-		// enforce use of new methods
-		useNewMethods = true;
-		xsiType = null;
-	}
-
-	@Override
-	protected String getXSIType() {
-		if (xsiType != null) {
-			return xsiType;
-		} else {
-			return super.getXSIType();
-		}
-	}
-
-	protected void handleEndCreateObjectElement() {
-		if (text == null) {
-			objects.pop();
-			mixedTargets.pop();
-		} else {
-			EObject object = objects.popEObject();
-			if (mixedTargets.peek() != null
-					&& (object.eContainer() != null || suppressDocumentRoot || recordUnknownFeature
-							&& (eObjectToExtensionMap.containsValue(object) || ((InternalEObject) object).eDirectResource() != null))) {
-				handleMixedText();
-				mixedTargets.pop();
-			}
-		}
-	}
-
-	@Override
-	public void startDocument() {
-		super.startDocument();
-		// initialize the progress monitor
-		if (null != progressMonitor) {
-			progressMonitorChunksRead = 0;
-			progressMonitorLastStartInChunk = 0;
-			progressMonitor.beginTask("Reading resource '" + resourceURI + "'", getProgressMonitorTotalWork()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-	}
-
-	@Override
-	public void endDocument() {
-		super.endDocument();
-		// finalize the progress monitor
-		if (null != progressMonitor) {
-			progressMonitor.done();
-		}
-	}
-
-	protected int getProgressMonitorTotalWork() {
-		int totalWork = IProgressMonitor.UNKNOWN;
-		URI uri = xmlResource.getURI();
-
-		InputStream is = null;
-		try {
-			is = URIConverter.INSTANCE.createInputStream(uri);
-			totalWork = is.available() / progressMonitorChunkSize;
-		} catch (IOException ex) {
-			// NOP
-		} finally {
-			if (null != is) {
-				try {
-					is.close();
-				} catch (IOException ex) {
-					// NOP
-				}
-			}
-		}
-		return totalWork;
-	}
-
-	@Override
-	protected EPackage handleMissingPackage(String uriString) {
-		if (null != contextFeature && null != xmlPersistenceMappingExtendedMetaData
-				&& xmlPersistenceMappingExtendedMetaData.isXMLPersistenceMappingEnabled(contextFeature)) {
-			return xmlPersistenceMappingExtendedMetaData.demandPackage(uriString);
-
-		} else {
-			return super.handleMissingPackage(uriString);
-		}
-	}
-
-}
diff --git a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/XMLPersistenceMappingHelperImpl.java b/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/XMLPersistenceMappingHelperImpl.java
deleted file mode 100644
index 58c4476..0000000
--- a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/XMLPersistenceMappingHelperImpl.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *   itemis AG - initial API and implementation
- */
-package org.eclipse.rmf.internal.serialization;
-
-import javax.xml.datatype.XMLGregorianCalendar;
-
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl;
-import org.eclipse.emf.ecore.xml.type.XMLTypeFactory;
-
-public class XMLPersistenceMappingHelperImpl extends XMLHelperImpl implements XMLHelper {
-
-	public XMLPersistenceMappingHelperImpl(XMLResource resource) {
-		super(resource);
-		EMap<String, String> prefixToNamespaceMap = getPrefixToNamespaceMap();
-		//prefixToNamespaceMap.put("", ReqIF10Package.eNS_URI); //$NON-NLS-1$
-		setPrefixToNamespaceMap(prefixToNamespaceMap);
-	}
-
-	@Override
-	public String getHREF(EObject obj) {
-		if (obj.eIsProxy()) {
-			URI uri = ((InternalEObject) obj).eProxyURI();
-			return uri.fragment();
-		} else {
-			return getIDREF(obj);
-		}
-	}
-
-	@Override
-	public String convertToString(EFactory factory, EDataType dataType, Object value) {
-		if (value instanceof XMLGregorianCalendar) {
-			return XMLTypeFactory.eINSTANCE.convertDateTime((XMLGregorianCalendar) value);
-		} else {
-			return super.convertToString(factory, dataType, value);
-		}
-	}
-
-	@Override
-	public EClassifier getType(EFactory eFactory, String typeName) {
-		EClassifier eClassifier;
-		EPackage ePackage = eFactory.getEPackage();
-		if (extendedMetaData.demandedPackages().contains(ePackage)) {
-			eClassifier = extendedMetaData.demandType(ePackage.getNsURI(), typeName);
-		} else {
-			eClassifier = super.getType(eFactory, typeName);
-		}
-		return eClassifier;
-
-	}
-}
diff --git a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/XMLPersistenceMappingLoadImpl.java b/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/XMLPersistenceMappingLoadImpl.java
deleted file mode 100644
index 96b4ba2..0000000
--- a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/XMLPersistenceMappingLoadImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *   itemis AG - initial API and implementation
- */
-package org.eclipse.rmf.internal.serialization;
-
-import java.io.IOException;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-public class XMLPersistenceMappingLoadImpl extends XMLLoadImpl {
-
-	public XMLPersistenceMappingLoadImpl(XMLHelper helper) {
-		super(helper);
-	}
-
-	@Override
-	protected DefaultHandler makeDefaultHandler() {
-		XMLPersistenceMappingHandler handler = new XMLPersistenceMappingHandler(resource, helper, options);
-
-		return handler;
-	}
-
-	@Override
-	protected SAXParser makeParser() throws ParserConfigurationException, SAXException {
-		// Create an instance of org.apache.xerces.parsers.SAXParser
-		/*
-		 * !! Important Note !! We must override makeParser() - even if we wouldn't have any functional changes to apply
-		 * - in order to make sure that SAXParserFactory.newInstance() gets invoked from this plug-in which has a
-		 * dependency to the org.apache.xerces plug-in and all its classes on the classpath. Otherwise we wouldn't
-		 * obtain an instance of org.apache.xerces.jaxp.SAXParserFactoryImpl as intended but fall back to the default
-		 * implementation com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl.
-		 */
-		SAXParserFactory factory = SAXParserFactory.newInstance();
-		return factory.newSAXParser();
-	}
-
-	@Override
-	protected void handleErrors() throws IOException {
-		// avoid throwing exception even if errors occur during load
-	}
-
-}
diff --git a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/XMLPersistenceMappingSaveImpl.java b/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/XMLPersistenceMappingSaveImpl.java
deleted file mode 100644
index 4042167..0000000
--- a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/XMLPersistenceMappingSaveImpl.java
+++ /dev/null
@@ -1,1767 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *   itemis AG - initial API and implementation
- */
-package org.eclipse.rmf.internal.serialization;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.ExtendedMetaData;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingExtendedMetaData;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingExtendedMetaDataImpl;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResource;
-
-// TODO: add javadoc with images
-// TODO: deactivate or implement dom support 
-// TODO: implement prefix overwrite
-// TODO: overwrite all explicitly not used methods from super-class and use asserts to show that it is not allowed to go there
-// TODO: consider using the "kind" mechanism for switching between different savepatterns
-/**
- * @author broerkens
- */
-public class XMLPersistenceMappingSaveImpl extends XMLSaveImpl {
-	XMLPersistenceMappingExtendedMetaData xmlPersistenceMappingExtendedMetaData = null;
-	static final String TRUE = "true"; //$NON-NLS-1$
-	Map<String, String> redefinedNamespaceUriToPrefixMap = null;
-
-	final StringBuffer buffer = new StringBuffer();
-
-	public enum SerializationType {
-		attributesOnly, elementsOnly, attributesAndElements
-	}
-
-	public XMLPersistenceMappingSaveImpl(XMLHelper helper) {
-		super(helper);
-	}
-
-	@Override
-	protected boolean saveFeatures(EObject o, boolean attributesOnly) {
-		if (attributesOnly) {
-			return saveFeatures(o, SerializationType.attributesOnly, false);
-		} else {
-			return saveFeatures(o, SerializationType.attributesAndElements, false);
-		}
-	}
-
-	protected boolean saveFeatures(EObject o, SerializationType serializationType, boolean suppressClosingElement) {
-		EClass eClass = o.eClass();
-		int contentKind = extendedMetaData.getContentKind(eClass);
-		if (!toDOM) {
-			switch (contentKind) {
-			case ExtendedMetaData.MIXED_CONTENT:
-			case ExtendedMetaData.SIMPLE_CONTENT: {
-				doc.setMixed(true);
-				break;
-			}
-			}
-		}
-
-		if (o == root) {
-			writeTopAttributes(root);
-		}
-
-		EStructuralFeature[] features = featureTable.getFeatures(eClass);
-		int[] featureKinds = featureTable.getKinds(eClass, features);
-		int[] elementFeatures = null;
-		int elementCount = 0;
-
-		String content = null;
-
-		// Process XML attributes
-		if (SerializationType.elementsOnly == serializationType) {
-			LOOP: for (int i = 0; i < features.length; i++) {
-				int kind = featureKinds[i];
-				EStructuralFeature f = features[i];
-
-				if (kind != TRANSIENT && shouldSaveFeature(o, f)) {
-					switch (kind) {
-					case DATATYPE_ELEMENT_SINGLE: {
-						if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
-							content = getDataTypeElementSingleSimple(o, f);
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case DATATYPE_SINGLE: {
-						continue LOOP; // next feature, no element required
-					}
-					case DATATYPE_SINGLE_NILLABLE: {
-						if (!isNil(o, f)) {
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case OBJECT_ATTRIBUTE_SINGLE: {
-						continue LOOP; // next feature, no element required
-					}
-					case OBJECT_ATTRIBUTE_MANY: {
-						continue LOOP; // next feature, no element required
-					}
-					case OBJECT_ATTRIBUTE_IDREF_SINGLE: {
-						continue LOOP; // next feature, no element required
-					}
-					case OBJECT_ATTRIBUTE_IDREF_MANY: {
-						continue LOOP; // next feature, no element required
-					}
-					case OBJECT_HREF_SINGLE_UNSETTABLE: {
-						if (isNil(o, f)) {
-							break;
-						}
-						// it's intentional to keep going
-					}
-					case OBJECT_HREF_SINGLE: {
-						if (useEncodedAttributeStyle) {
-							continue LOOP; // next feature, no element required
-						} else {
-							switch (sameDocSingle(o, f)) {
-							case SAME_DOC: {
-								continue LOOP; // next feature, no element required
-							}
-							case CROSS_DOC: {
-								break;
-							}
-							default: {
-								continue LOOP; // next feature, no element required
-							}
-							}
-						}
-						break;
-					}
-					case OBJECT_HREF_MANY_UNSETTABLE: {
-						if (isEmpty(o, f) && !isXMLPersistenceMappingEnabled(f)) {
-							continue LOOP; // next feature, no element required
-						}
-						// It's intentional to keep going.
-					}
-					case OBJECT_HREF_MANY: {
-						if (useEncodedAttributeStyle) {
-							continue LOOP; // next feature, no element required
-						} else {
-							switch (sameDocMany(o, f)) {
-							case SAME_DOC: {
-								continue LOOP; // next feature, no element required
-							}
-							case CROSS_DOC: {
-								break;
-							}
-							default: {
-								continue LOOP; // next feature, no element required
-							}
-							}
-						}
-						break;
-					}
-					case OBJECT_ELEMENT_SINGLE_UNSETTABLE:
-					case OBJECT_ELEMENT_SINGLE: {
-						if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
-							content = getElementReferenceSingleSimple(o, f);
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case OBJECT_ELEMENT_MANY: {
-						if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
-							content = getElementReferenceManySimple(o, f);
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case OBJECT_ELEMENT_IDREF_SINGLE_UNSETTABLE:
-					case OBJECT_ELEMENT_IDREF_SINGLE: {
-						if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
-							content = getElementIDRefSingleSimple(o, f);
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case OBJECT_ELEMENT_IDREF_MANY: {
-						if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
-							content = getElementIDRefManySimple(o, f);
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case DATATYPE_ATTRIBUTE_MANY: {
-						break;
-					}
-					case OBJECT_CONTAIN_MANY_UNSETTABLE:
-					case DATATYPE_MANY: {
-						if (isEmpty(o, f) && !isXMLPersistenceMappingEnabled(f)) {
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case OBJECT_CONTAIN_SINGLE_UNSETTABLE:
-					case OBJECT_CONTAIN_SINGLE:
-					case OBJECT_CONTAIN_MANY:
-					case ELEMENT_FEATURE_MAP: {
-						break;
-					}
-					case ATTRIBUTE_FEATURE_MAP: {
-						continue LOOP; // next feature, no element required
-					}
-					default: {
-						continue LOOP; // next feature, no element required
-					}
-
-					} // end switch
-
-					// We only get here if we should do this.
-					//
-					if (elementFeatures == null) {
-						elementFeatures = new int[features.length];
-					}
-					elementFeatures[elementCount++] = i;
-				} // end if
-			} // end for
-		} else {
-
-			LOOP: for (int i = 0; i < features.length; i++) {
-				int kind = featureKinds[i];
-				EStructuralFeature f = features[i];
-
-				if (kind != TRANSIENT && shouldSaveFeature(o, f)) {
-
-					switch (kind) {
-					case DATATYPE_ELEMENT_SINGLE: {
-						if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
-							content = getDataTypeElementSingleSimple(o, f);
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case DATATYPE_SINGLE: {
-						saveDataTypeSingle(o, f);
-						continue LOOP; // next feature, no element required
-					}
-					case DATATYPE_SINGLE_NILLABLE: {
-						if (!isNil(o, f)) {
-							saveDataTypeSingle(o, f);
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case OBJECT_ATTRIBUTE_SINGLE: {
-						saveEObjectSingle(o, f);
-						continue LOOP; // next feature, no element required
-					}
-					case OBJECT_ATTRIBUTE_MANY: {
-						saveEObjectMany(o, f);
-						continue LOOP; // next feature, no element required
-					}
-					case OBJECT_ATTRIBUTE_IDREF_SINGLE: {
-						saveIDRefSingle(o, f);
-						continue LOOP; // next feature, no element required
-					}
-					case OBJECT_ATTRIBUTE_IDREF_MANY: {
-						saveIDRefMany(o, f);
-						continue LOOP; // next feature, no element required
-					}
-					case OBJECT_HREF_SINGLE_UNSETTABLE: {
-						if (isNil(o, f)) {
-							break;
-						}
-						// it's intentional to keep going
-					}
-					case OBJECT_HREF_SINGLE: {
-						if (useEncodedAttributeStyle) {
-							saveEObjectSingle(o, f);
-							continue LOOP; // next feature, no element required
-						} else {
-							switch (sameDocSingle(o, f)) {
-							case SAME_DOC: {
-								saveIDRefSingle(o, f);
-								continue LOOP; // next feature, no element required
-							}
-							case CROSS_DOC: {
-								break;
-							}
-							default: {
-								continue LOOP; // next feature, no element required
-							}
-							}
-						}
-						break;
-					}
-					case OBJECT_HREF_MANY_UNSETTABLE: {
-						if (isEmpty(o, f) && !isXMLPersistenceMappingEnabled(f)) {
-							saveManyEmpty(o, f);
-							continue LOOP; // next feature, no element required
-						}
-						// It's intentional to keep going.
-					}
-					case OBJECT_HREF_MANY: {
-						if (useEncodedAttributeStyle) {
-							saveEObjectMany(o, f);
-							continue LOOP; // next feature, no element required
-						} else {
-							switch (sameDocMany(o, f)) {
-							case SAME_DOC: {
-								saveIDRefMany(o, f);
-								continue LOOP; // next feature, no element required
-							}
-							case CROSS_DOC: {
-								break;
-							}
-							default: {
-								continue LOOP; // next feature, no element required
-							}
-							}
-						}
-						break;
-					}
-					case OBJECT_ELEMENT_SINGLE_UNSETTABLE:
-					case OBJECT_ELEMENT_SINGLE: {
-						if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
-							content = getElementReferenceSingleSimple(o, f);
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case OBJECT_ELEMENT_MANY: {
-						if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
-							content = getElementReferenceManySimple(o, f);
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case OBJECT_ELEMENT_IDREF_SINGLE_UNSETTABLE:
-					case OBJECT_ELEMENT_IDREF_SINGLE: {
-						if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
-							content = getElementIDRefSingleSimple(o, f);
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case OBJECT_ELEMENT_IDREF_MANY: {
-						if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
-							content = getElementIDRefManySimple(o, f);
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case DATATYPE_ATTRIBUTE_MANY: {
-						break;
-					}
-					case OBJECT_CONTAIN_MANY_UNSETTABLE:
-					case DATATYPE_MANY: {
-						if (isEmpty(o, f) && !isXMLPersistenceMappingEnabled(f)) {
-							saveManyEmpty(o, f);
-							continue LOOP; // next feature, no element required
-						}
-						break;
-					}
-					case OBJECT_CONTAIN_SINGLE_UNSETTABLE:
-					case OBJECT_CONTAIN_SINGLE:
-					case OBJECT_CONTAIN_MANY:
-					case ELEMENT_FEATURE_MAP: {
-						break;
-					}
-					case ATTRIBUTE_FEATURE_MAP: {
-						saveAttributeFeatureMap(o, f);
-						continue LOOP; // next feature, no element required
-					}
-					default: {
-						continue LOOP; // next feature, no element required
-					}
-					}
-
-					if (SerializationType.attributesOnly == serializationType) {
-						continue LOOP; // next feature, no element required
-					}
-
-					// We only get here if we should do this.
-					//
-					if (elementFeatures == null) {
-						elementFeatures = new int[features.length];
-					}
-					elementFeatures[elementCount++] = i;
-				}
-			}
-			processAttributeExtensions(o);
-
-			if (elementFeatures == null) {
-				if (content == null) {
-					content = getContent(o, features);
-				}
-
-				if (content == null) {
-					if (o == root && writeTopElements(root)) {
-						endSaveFeatures(o, 0, null);
-						return true;
-					} else {
-						endSaveFeatures(o, EMPTY_ELEMENT, null);
-						return false;
-					}
-				} else {
-					endSaveFeatures(o, CONTENT_ELEMENT, content);
-					return true;
-				}
-			}
-		}
-
-		if (o == root) {
-			writeTopElements(root);
-		}
-
-		// Process XML elements
-		for (int i = 0; i < elementCount; i++) {
-			int kind = featureKinds[elementFeatures[i]];
-			EStructuralFeature f = features[elementFeatures[i]];
-			switch (kind) {
-			case DATATYPE_SINGLE_NILLABLE: {
-				saveNil(o, f);
-				break;
-			}
-			case ELEMENT_FEATURE_MAP: {
-				saveElementFeatureMap(o, f);
-				break;
-			}
-			case DATATYPE_MANY: {
-				saveDataTypeMany(o, f);
-				break;
-			}
-			case DATATYPE_ATTRIBUTE_MANY: {
-				saveDataTypeAttributeMany(o, f);
-				break;
-			}
-			case DATATYPE_ELEMENT_SINGLE: {
-				saveDataTypeElementSingle(o, f);
-				break;
-			}
-			case OBJECT_CONTAIN_SINGLE_UNSETTABLE: {
-				if (isNil(o, f)) {
-					saveNil(o, f);
-					break;
-				}
-				// it's intentional to keep going
-			}
-			case OBJECT_CONTAIN_SINGLE: {
-				saveContainedSingle(o, f);
-				break;
-			}
-			case OBJECT_CONTAIN_MANY_UNSETTABLE:
-			case OBJECT_CONTAIN_MANY: {
-				saveContainedMany(o, f);
-				break;
-			}
-			case OBJECT_HREF_SINGLE_UNSETTABLE: {
-				if (isNil(o, f)) {
-					saveNil(o, f);
-					break;
-				}
-				// it's intentional to keep going
-			}
-			case OBJECT_HREF_SINGLE: {
-				saveHRefSingle(o, f);
-				break;
-			}
-			case OBJECT_HREF_MANY_UNSETTABLE:
-			case OBJECT_HREF_MANY: {
-				saveHRefMany(o, f);
-				break;
-			}
-			case OBJECT_ELEMENT_SINGLE_UNSETTABLE: {
-				if (isNil(o, f)) {
-					saveNil(o, f);
-					break;
-				}
-				// it's intentional to keep going
-			}
-			case OBJECT_ELEMENT_SINGLE: {
-				saveElementReferenceSingle(o, f);
-				break;
-			}
-			case OBJECT_ELEMENT_MANY: {
-				saveElementReferenceMany(o, f);
-				break;
-			}
-			case OBJECT_ELEMENT_IDREF_SINGLE_UNSETTABLE: {
-				if (isNil(o, f)) {
-					saveNil(o, f);
-					break;
-				}
-				// it's intentional to keep going
-			}
-			case OBJECT_ELEMENT_IDREF_SINGLE: {
-				saveElementIDRefSingle(o, f);
-				break;
-			}
-			case OBJECT_ELEMENT_IDREF_MANY: {
-				saveElementIDRefMany(o, f);
-				break;
-			}
-			} // end switch
-		} // end for
-		if (!suppressClosingElement) {
-			endSaveFeatures(o, 0, null);
-		}
-		return true;
-	}
-
-	@Override
-	protected void saveNil(EStructuralFeature f) {
-		if (isXMLPersistenceMappingEnabled(f)) {
-			int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
-			switch (featureSerializationStructure) {
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
-				// no means for describing null values
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT:
-				doc.saveNilElement(getClassifierQName(f.getEType(), f));
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0010__CLASSIFIER_WRAPPER_ELEMENT:
-				doc.saveNilElement(getClassifierWrapperQName(f.getEType()));
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0011__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				doc.startElement(getClassifierWrapperQName(f.getEType()));
-				doc.endEmptyElement();
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
-				super.saveNil(f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0110__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0111__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				doc.startElement(getFeatureQName(f));
-				doc.endEmptyElement();
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT:
-				doc.saveNilElement(getFeatureWrapperQName(f));
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1010__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1011__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT:
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1101__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1110__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1111__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				doc.startElement(getFeatureWrapperQName(f));
-				doc.endEmptyElement();
-				break;
-			default:
-				super.saveNil(f);
-			}
-
-		} else {
-			super.saveNil(f);
-		}
-
-	}
-
-	@Override
-	protected void saveElementReferenceSingle(EObject o, EStructuralFeature f) {
-		assert null != helper.getValue(o, f);
-
-		EObject remote = (EObject) helper.getValue(o, f);
-		if (null != remote) {
-
-			int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
-
-			switch (featureSerializationStructure) {
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
-				// not allowed - ignore;
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
-				// default EMF mapping
-				saveEReferenceReferenced0100Single(remote, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEReferenceReferenced0101Single(remote, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEReferenceReferenced1001Single(remote, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
-				// if undefined, use the standard EMF mechanism
-				super.saveElementReferenceSingle(o, f);
-				break;
-			default:
-				saveEReferenceReferenced1001Single(remote, f);
-				break;
-			}
-		}
-
-	}
-
-	protected void saveReferencedHREF(EStructuralFeature f, EObject remote, String qname, boolean doSaveType) {
-		{
-			String href = helper.getHREF(remote);
-			if (href != null) {
-				href = convertURI(href);
-				EClass eClass = remote.eClass();
-				EClass expectedType = (EClass) f.getEType();
-				boolean shouldSaveType = doSaveType && (saveTypeInfo ? xmlTypeInfo.shouldSaveType(eClass, expectedType, f) : eClass != expectedType);
-				doc.startElement(qname);
-				if (shouldSaveType) {
-					saveTypeAttribute(eClass);
-				}
-				doc.endContentElement(href);
-			}
-		}
-	}
-
-	protected void saveEReferenceReferenced0100Single(EObject remote, EStructuralFeature f) {
-		String qname = getFeatureQName(f);
-		saveReferencedHREF(f, remote, qname, true);
-	}
-
-	protected void saveEReferenceReferenced0101Single(EObject remote, EStructuralFeature f) {
-		doc.startElement(getFeatureQName(f));
-		String qname = getClassifierQName(remote.eClass(), f);
-		saveReferencedHREF(f, remote, qname, false);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceReferenced1001Single(EObject remote, EStructuralFeature f) {
-		doc.startElement(getFeatureWrapperQName(f));
-		String qname = getClassifierQName(remote.eClass(), f);
-		saveReferencedHREF(f, remote, qname, false);
-		doc.endElement();
-	}
-
-	@Override
-	protected void saveElementReferenceMany(EObject o, EStructuralFeature f) {
-		assert f.isMany() : "saveElementReferenceMany is applicable for references with true == isMany()"; //$NON-NLS-1$
-		@SuppressWarnings("unchecked")
-		InternalEList<? extends EObject> values = (InternalEList<? extends EObject>) helper.getValue(o, f);
-		int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
-
-		switch (featureSerializationStructure) {
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
-			// not allowed - ignore;
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
-			// default EMF mapping
-			saveEReferenceReferenced0100Many(values, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-			saveEReferenceReferenced0101Many(values, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-			saveEReferenceReferenced1001Many(values, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
-			// if undefined, use the standard EMF mechanism
-			super.saveHRefMany(o, f);
-			break;
-		default:
-			saveEReferenceReferenced1001Many(values, f);
-			break;
-		}
-
-	}
-
-	protected void saveEReferenceReferenced0100Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		int size = values.size();
-		String qname = getFeatureQName(f);
-		for (int i = 0; i < size; i++) {
-			saveReferencedHREF(f, values.basicGet(i), qname, true);
-		}
-	}
-
-	protected void saveEReferenceReferenced0101Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		int size = values.size();
-		String qname;
-		EObject value;
-		for (int i = 0; i < size; i++) {
-			doc.startElement(getFeatureQName(f));
-			value = values.basicGet(i);
-			qname = getClassifierQName(value.eClass(), f);
-			saveReferencedHREF(f, value, qname, false);
-			doc.endElement();
-		}
-
-	}
-
-	protected void saveEReferenceReferenced1001Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		int size = values.size();
-		String qname;
-		EObject value;
-		doc.startElement(getFeatureWrapperQName(f));
-		for (int i = 0; i < size; i++) {
-			value = values.basicGet(i);
-			qname = getClassifierQName(value.eClass(), f);
-			saveReferencedHREF(f, value, qname, false);
-		}
-		doc.endElement();
-	}
-
-	@Override
-	protected void saveDataTypeElementSingle(EObject o, EStructuralFeature f) {
-		assert !f.isMany() : "saveElementReferenceMany is applicable for references with false == isMany()"; //$NON-NLS-1$
-		String svalue = getDatatypeValue(helper.getValue(o, f), f, false);
-		int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
-
-		switch (featureSerializationStructure) {
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
-			// not allowed - ignore;
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT:
-			saveEAttributeContained0001Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0010__CLASSIFIER_WRAPPER_ELEMENT:
-			saveEAttributeContained0010Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0011__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-			saveEAttributeContained0011Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
-			saveEAttributeContained0100Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-			saveEAttributeContained0101Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0110__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-			saveEAttributeContained0110Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0111__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-			saveEAttributeContained0111Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT:
-			saveEAttributeContained1000Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-			saveEAttributeContained1001Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1010__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-			saveEAttributeContained1010Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1011__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-			saveEAttributeContained1011Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT:
-			saveEAttributeContained1100Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1101__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-			saveEAttributeContained1101Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1110__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-			saveEAttributeContained1110Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1111__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-			saveEAttributeContained1111Single(svalue, f);
-			break;
-		case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
-			// if undefined, use the standard EMF mechanism
-			super.saveDataTypeMany(o, f);
-			break;
-		default:
-			saveEAttributeContained1001Single(svalue, f);
-			break;
-		}
-
-	}
-
-	protected void saveEAttributeContained0001Single(String value, EStructuralFeature f) {
-		String name = getClassifierQName(f.getEType());
-		if (value == null) {
-			doc.startElement(name);
-			doc.addAttribute(XSI_NIL, TRUE);
-			doc.endEmptyElement();
-			declareXSI = true;
-		} else {
-			doc.saveDataValueElement(name, value);
-		}
-
-	}
-
-	protected void saveEAttributeContained0010Single(String value, EStructuralFeature f) {
-		String name = getClassifierWrapperQName(f.getEType());
-		if (value == null) {
-			doc.startElement(name);
-			doc.addAttribute(XSI_NIL, TRUE);
-			doc.endEmptyElement();
-			declareXSI = true;
-		} else {
-			doc.saveDataValueElement(name, value);
-		}
-	}
-
-	protected void saveEAttributeContained0011Single(String value, EStructuralFeature f) {
-		doc.startElement(getClassifierWrapperQName(f.getEType()));
-		saveEAttributeContained0001Single(value, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained0100Single(String value, EStructuralFeature f) {
-		// this is the default EMF behaviour
-		String name = getFeatureQName(f);
-		if (value == null) {
-			doc.startElement(name);
-			doc.addAttribute(XSI_NIL, TRUE);
-			doc.endEmptyElement();
-			declareXSI = true;
-		} else {
-			doc.saveDataValueElement(name, value);
-		}
-	}
-
-	protected void saveEAttributeContained0101Single(String value, EStructuralFeature f) {
-		doc.startElement(getFeatureQName(f));
-		saveEAttributeContained0001Single(value, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained0110Single(String value, EStructuralFeature f) {
-		doc.startElement(getFeatureQName(f));
-		saveEAttributeContained0010Single(value, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained0111Single(String value, EStructuralFeature f) {
-		doc.startElement(getFeatureQName(f));
-		doc.startElement(getClassifierWrapperQName(f.getEType()));
-		saveEAttributeContained0001Single(value, f);
-		doc.endElement();
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1000Single(String value, EStructuralFeature f) {
-		String name = getFeatureWrapperQName(f);
-		if (value == null) {
-			doc.startElement(name);
-			doc.addAttribute(XSI_NIL, TRUE);
-			doc.endEmptyElement();
-			declareXSI = true;
-		} else {
-			doc.saveDataValueElement(name, value);
-		}
-	}
-
-	protected void saveEAttributeContained1001Single(String value, EStructuralFeature f) {
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEAttributeContained0001Single(value, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1010Single(String value, EStructuralFeature f) {
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEAttributeContained0010Single(value, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1011Single(String value, EStructuralFeature f) {
-		doc.startElement(getFeatureWrapperQName(f));
-		doc.startElement(getClassifierWrapperQName(f.getEType()));
-		saveEAttributeContained0001Single(value, f);
-		doc.endElement();
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1100Single(String value, EStructuralFeature f) {
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEAttributeContained0100Single(value, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1101Single(String value, EStructuralFeature f) {
-		doc.startElement(getFeatureWrapperQName(f));
-		doc.startElement(getFeatureQName(f));
-		saveEAttributeContained0001Single(value, f);
-		doc.endElement();
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1110Single(String value, EStructuralFeature f) {
-		doc.startElement(getFeatureWrapperQName(f));
-		doc.startElement(getFeatureQName(f));
-		saveEAttributeContained0010Single(value, f);
-		doc.endElement();
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1111Single(String value, EStructuralFeature f) {
-		doc.startElement(getFeatureWrapperQName(f));
-		doc.startElement(getFeatureQName(f));
-		doc.startElement(getClassifierWrapperQName(f.getEType()));
-		saveEAttributeContained0001Single(value, f);
-		doc.endElement();
-		doc.endElement();
-		doc.endElement();
-	}
-
-	@Override
-	protected void saveDataTypeMany(EObject o, EStructuralFeature f) {
-		assert f.isMany() : "saveElementReferenceMany is applicable for references with true == isMany()"; //$NON-NLS-1$
-
-		@SuppressWarnings("unchecked")
-		InternalEList<? extends EObject> values = (InternalEList<? extends EObject>) helper.getValue(o, f);
-		if (null != values && !values.isEmpty()) {
-			int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
-
-			switch (featureSerializationStructure) {
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
-				// not allowed - ignore;
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT:
-				saveEAttributeContained0001Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0010__CLASSIFIER_WRAPPER_ELEMENT:
-				saveEAttributeContained0010Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0011__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEAttributeContained0011Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
-				saveEAttributeContained0100Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEAttributeContained0101Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0110__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-				saveEAttributeContained0110Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0111__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEAttributeContained0111Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT:
-				saveEAttributeContained1000Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEAttributeContained1001Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1010__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-				saveEAttributeContained1010Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1011__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEAttributeContained1011Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT:
-				saveEAttributeContained1100Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1101__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEAttributeContained1101Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1110__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-				saveEAttributeContained1110Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1111__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEAttributeContained1111Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
-				// if undefined, use the standard EMF mechanism
-				saveEAttributeContained0100Many(values, f);
-				break;
-			default:
-				saveEAttributeContained1001Many(values, f);
-				break;
-			}
-		}
-	}
-
-	protected String getAttributeString(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		EDataType d = (EDataType) f.getEType();
-		EPackage ePackage = d.getEPackage();
-		EFactory fac = ePackage.getEFactoryInstance();
-		buffer.setLength(0);
-		for (Iterator<? extends EObject> i = values.basicIterator();;) {
-			Object value = i.next();
-			String svalue = helper.convertToString(fac, d, value);
-			if (escape != null) {
-				svalue = escape.convertText(svalue);
-			}
-			buffer.append(svalue);
-			if (i.hasNext()) {
-				buffer.append(' ');
-			} else {
-				break;
-			}
-		}
-		return buffer.toString();
-	}
-
-	protected void saveEAttributeContained0001Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		EDataType d = (EDataType) f.getEType();
-		EPackage ePackage = d.getEPackage();
-		EFactory fac = ePackage.getEFactoryInstance();
-		String name = helper.getQName(d);
-		int size = values.size();
-		for (int i = 0; i < size; ++i) {
-			Object value = values.get(i);
-			if (value == null) {
-				doc.startElement(name);
-				doc.addAttribute(XSI_NIL, TRUE);
-				doc.endEmptyElement();
-				declareXSI = true;
-			} else {
-				String svalue = helper.convertToString(fac, d, value);
-				if (escape != null) {
-					svalue = escape.convertText(svalue);
-				}
-				doc.saveDataValueElement(name, svalue);
-			}
-		}
-	}
-
-	protected void saveEAttributeContained0010Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		String name = getClassifierWrapperQName(f.getEType());
-		doc.saveDataValueElement(name, getAttributeString(values, f));
-	}
-
-	protected void saveEAttributeContained0011Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		doc.startElement(getClassifierWrapperQName(f.getEType()));
-		saveEAttributeContained0001Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained0100Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		// this is the default EMF behaviour
-		assert null != values;
-
-		EDataType d = (EDataType) f.getEType();
-		EPackage ePackage = d.getEPackage();
-		EFactory fac = ePackage.getEFactoryInstance();
-		String name = helper.getQName(f);
-		int size = values.size();
-		for (int i = 0; i < size; ++i) {
-			Object value = values.get(i);
-			if (value == null) {
-				doc.startElement(name);
-				doc.addAttribute(XSI_NIL, TRUE);
-				doc.endEmptyElement();
-				declareXSI = true;
-			} else {
-				String svalue = helper.convertToString(fac, d, value);
-				if (escape != null) {
-					svalue = escape.convertText(svalue);
-				}
-				doc.saveDataValueElement(name, svalue);
-			}
-		}
-	}
-
-	protected void saveEAttributeContained0101Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		EDataType d = (EDataType) f.getEType();
-		EPackage ePackage = d.getEPackage();
-		EFactory fac = ePackage.getEFactoryInstance();
-		String name = getClassifierQName(d);
-		int size = values.size();
-		for (int i = 0; i < size; ++i) {
-			Object value = values.get(i);
-			doc.startElement(getFeatureQName(f));
-			if (value == null) {
-				doc.startElement(name);
-				doc.addAttribute(XSI_NIL, TRUE);
-				doc.endEmptyElement();
-				declareXSI = true;
-			} else {
-				String svalue = helper.convertToString(fac, d, value);
-				if (escape != null) {
-					svalue = escape.convertText(svalue);
-				}
-				doc.saveDataValueElement(name, svalue);
-			}
-			doc.endElement();
-		}
-	}
-
-	protected void saveEAttributeContained0110Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		doc.startElement(getFeatureQName(f));
-		saveEAttributeContained0010Many(values, f);
-		doc.endElement();
-
-	}
-
-	protected void saveEAttributeContained0111Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		doc.startElement(getFeatureQName(f));
-		saveEAttributeContained0011Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1000Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		String name = getFeatureWrapperQName(f);
-		doc.saveDataValueElement(name, getAttributeString(values, f));
-	}
-
-	protected void saveEAttributeContained1001Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEAttributeContained0001Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1010Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEAttributeContained0010Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1011Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEAttributeContained0011Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1100Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEAttributeContained0100Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1101Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEAttributeContained0101Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1110Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEAttributeContained0110Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEAttributeContained1111Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEAttributeContained0111Many(values, f);
-		doc.endElement();
-	}
-
-	@Override
-	protected void saveContainedMany(EObject o, EStructuralFeature f) {
-		assert f.isMany();
-
-		// XML Mapping serialization enabled
-		@SuppressWarnings("unchecked")
-		List<? extends InternalEObject> values = ((InternalEList<? extends InternalEObject>) helper.getValue(o, f)).basicList();
-		if (null != values) {
-			int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
-
-			switch (featureSerializationStructure) {
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
-				saveEReferenceContained0000Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT:
-				saveEReferenceContained0001Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0010__CLASSIFIER_WRAPPER_ELEMENT:
-				saveEReferenceContained0010Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0011__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEReferenceContained0011Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
-				saveEReferenceContained0100Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEReferenceContained0101Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0110__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-				saveEReferenceContained0110Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0111__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEReferenceContained0111Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT:
-				saveEReferenceContained1000Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEReferenceContained1001Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1010__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-				saveEReferenceContained1010Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1011__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEReferenceContained1011Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT:
-				saveEReferenceContained1100Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1101__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEReferenceContained1101Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1110__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-				saveEReferenceContained1110Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1111__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-				saveEReferenceContained1111Many(values, f);
-				break;
-			case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
-				// if undefined, use the standard EMF mechanism
-				saveEReferenceContained0100Many(values, f);
-				break;
-			default:
-				saveEReferenceContained1001Many(values, f);
-				break;
-			}
-
-		}
-
-	}
-
-	protected void saveEReferenceContained0000Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-		for (EObject value : values) {
-			saveFeatures(value, SerializationType.elementsOnly, true);
-		}
-	}
-
-	protected void saveEReferenceContained0001Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		for (EObject value : values) {
-			doc.startElement(getClassifierQName(value.eClass()));
-			saveFeatures(value);
-		}
-	}
-
-	protected void saveEReferenceContained0010Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		for (EClass eClass : getOrderedClasses(values)) {
-			doc.startElement(getClassifierWrapperQName(eClass));
-			for (EObject value : values) {
-				if (eClass == value.eClass()) {
-					saveFeatures(value, SerializationType.elementsOnly, true);
-				}
-			}
-			doc.endElement();
-		}
-	}
-
-	protected void saveEReferenceContained0011Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-		assert !values.isEmpty();
-
-		for (EClass eClass : getOrderedClasses(values)) {
-			doc.startElement(getClassifierWrapperQName(eClass));
-			for (EObject value : values) {
-				if (eClass == value.eClass()) {
-					doc.startElement(getClassifierQName(value.eClass()));
-					saveFeatures(value, SerializationType.attributesAndElements, false);
-				}
-			}
-			doc.endElement();
-		}
-	}
-
-	protected void saveEReferenceContained0100Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		// this is the default EMF behaviour
-		assert null != values;
-		assert !values.isEmpty();
-
-		for (EObject value : values) {
-			saveElement(value, f);
-		}
-	}
-
-	protected void saveEReferenceContained0101Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-		assert !values.isEmpty();
-
-		for (EObject value : values) {
-			doc.startElement(getFeatureQName(f));
-			doc.startElement(getClassifierQName(value.eClass()));
-			saveFeatures(value, SerializationType.attributesAndElements, false);
-			doc.endElement();
-		}
-	}
-
-	protected void saveEReferenceContained0110Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-		assert !values.isEmpty();
-
-		doc.startElement(getFeatureQName(f));
-		for (EClass eClass : getOrderedClasses(values)) {
-			doc.startElement(getClassifierWrapperQName(eClass));
-			for (EObject value : values) {
-				if (eClass == value.eClass()) {
-					saveFeatures(value, SerializationType.elementsOnly, true);
-				}
-			}
-			doc.endElement();
-		}
-		doc.endElement();
-
-	}
-
-	protected void saveEReferenceContained0111Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-		assert !values.isEmpty();
-
-		doc.startElement(getFeatureQName(f));
-		for (EClass eClass : getOrderedClasses(values)) {
-			doc.startElement(getClassifierWrapperQName(eClass));
-			for (EObject value : values) {
-				if (eClass == value.eClass()) {
-					doc.startElement(getClassifierQName(value.eClass()));
-					saveFeatures(value);
-				}
-			}
-			doc.endElement();
-		}
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1000Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-		assert !values.isEmpty();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0000Many(values, f);
-		doc.endElement();
-		// last end is written by caller
-	}
-
-	protected void saveEReferenceContained1001Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0001Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1010Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-		assert !values.isEmpty();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0010Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1011Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-		assert !values.isEmpty();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0011Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1100Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-		assert !values.isEmpty();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0100Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1101Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-		assert !values.isEmpty();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0101Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1110Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-		assert !values.isEmpty();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0110Many(values, f);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1111Many(List<? extends InternalEObject> values, EStructuralFeature f) {
-		assert null != values;
-		assert !values.isEmpty();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0111Many(values, f);
-		doc.endElement();
-	}
-
-	@Override
-	protected void saveContainedSingle(EObject o, EStructuralFeature f) {
-		assert !f.isMany();
-
-		if (isXMLPersistenceMappingEnabled(f)) {
-			// XML Mapping serialization enabled
-			EObject value = (EObject) helper.getValue(o, f);
-			if (null != value) {
-				int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
-
-				switch (featureSerializationStructure) {
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
-					saveEReferenceContained0000Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT:
-					saveEReferenceContained0001Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0010__CLASSIFIER_WRAPPER_ELEMENT:
-					saveEReferenceContained0010Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0011__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-					saveEReferenceContained0011Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
-					saveEReferenceContained0100Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-					saveEReferenceContained0101Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0110__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-					saveEReferenceContained0110Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0111__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-					saveEReferenceContained0111Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT:
-					saveEReferenceContained1000Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-					saveEReferenceContained1001Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1010__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-					saveEReferenceContained1010Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1011__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-					saveEReferenceContained1011Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT:
-					saveEReferenceContained1100Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1101__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
-					saveEReferenceContained1101Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1110__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
-					saveEReferenceContained1110Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1111__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
-					saveEReferenceContained1111Single(value, f);
-					break;
-				case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
-					// if undefined, use the standard EMF mechanism
-					super.saveContainedSingle(o, f);
-					break;
-				default:
-					saveEReferenceContained1001Single(value, f);
-					break;
-				}
-
-			}
-
-		} else {
-			super.saveContainedSingle(o, f);
-		}
-	}
-
-	protected void saveEReferenceContained0000Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		saveFeatures(value, SerializationType.elementsOnly, true);
-	}
-
-	protected void saveEReferenceContained0001Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		doc.startElement(getClassifierQName(value.eClass()));
-		saveFeatures(value);
-
-	}
-
-	protected void saveEReferenceContained0010Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		EClass eClass = value.eClass();
-		doc.startElement(getClassifierWrapperQName(eClass));
-		saveFeatures(value);
-	}
-
-	protected void saveEReferenceContained0011Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		EClass eClass = value.eClass();
-		doc.startElement(getClassifierWrapperQName(eClass));
-		doc.startElement(getClassifierQName(eClass));
-		saveFeatures(value);
-		doc.endElement();
-
-	}
-
-	protected void saveEReferenceContained0100Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		saveElement(value, f);
-	}
-
-	protected void saveEReferenceContained0101Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		EClass eClass = value.eClass();
-		doc.startElement(getFeatureQName(f));
-		doc.startElement(getClassifierQName(eClass));
-		saveFeatures(value);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained0110Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		EClass eClass = value.eClass();
-		doc.startElement(getFeatureQName(f));
-		doc.startElement(getClassifierWrapperQName(eClass));
-		saveFeatures(value);
-		doc.endElement();
-
-	}
-
-	protected void saveEReferenceContained0111Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		EClass eClass = value.eClass();
-		doc.startElement(getFeatureQName(f));
-		doc.startElement(getClassifierWrapperQName(eClass));
-		doc.startElement(getClassifierQName(eClass));
-		saveFeatures(value);
-		doc.endElement();
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1000Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0000Single(value, f);
-		doc.endElement();
-		// last end is written by caller
-	}
-
-	protected void saveEReferenceContained1001Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0001Single(value, f);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1010Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0010Single(value, f);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1011Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0011Single(value, f);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1100Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0100Single(value, f);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1101Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0101Single(value, f);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1110Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0110Single(value, f);
-		doc.endElement();
-	}
-
-	protected void saveEReferenceContained1111Single(EObject value, EStructuralFeature f) {
-		assert null != value;
-		assert !f.isMany();
-
-		doc.startElement(getFeatureWrapperQName(f));
-		saveEReferenceContained0111Single(value, f);
-		doc.endElement();
-	}
-
-	protected String getFeatureQName(EStructuralFeature eStructuralFeature) {
-		String featureXMLName = xmlPersistenceMappingExtendedMetaData.getXMLName(eStructuralFeature);
-		EPackage ePackage = eStructuralFeature.getEContainingClass().getEPackage();
-		String prefix = helper.getPrefix(ePackage);
-		return getQName(prefix, featureXMLName);
-	}
-
-	protected String getFeatureWrapperQName(EStructuralFeature eStructuralFeature) {
-		String featureWrapperXMLName = xmlPersistenceMappingExtendedMetaData.getXMLWrapperName(eStructuralFeature);
-		EPackage ePackage = eStructuralFeature.getEContainingClass().getEPackage();
-		String prefix = helper.getPrefix(ePackage);
-		return getQName(prefix, featureWrapperXMLName);
-	}
-
-	protected String getClassifierQName(EClassifier eClassifier) {
-		String classifierXMLName = xmlPersistenceMappingExtendedMetaData.getXMLName(eClassifier);
-		EPackage ePackage = eClassifier.getEPackage();
-		String prefix = helper.getPrefix(ePackage);
-		return getQName(prefix, classifierXMLName);
-	}
-
-	protected String getClassifierQName(EClassifier eClassifier, EStructuralFeature eStructuralFeature) {
-		String classifierXMLName = xmlPersistenceMappingExtendedMetaData.getXMLName(eClassifier, eStructuralFeature);
-		EPackage ePackage = eClassifier.getEPackage();
-		String prefix = helper.getPrefix(ePackage);
-		return getQName(prefix, classifierXMLName);
-	}
-
-	protected String getClassifierWrapperQName(EClassifier eClassifier) {
-		String classifierWrapperXMLName = xmlPersistenceMappingExtendedMetaData.getXMLWrapperName(eClassifier);
-		EPackage ePackage = eClassifier.getEPackage();
-		String prefix = helper.getPrefix(ePackage);
-		return getQName(prefix, classifierWrapperXMLName);
-	}
-
-	protected String getQName(String prefix, String name) {
-		if (null == prefix || 0 == prefix.length()) {
-			return name;
-		} else {
-			return prefix + ":" + name; //$NON-NLS-1$
-		}
-	}
-
-	@Override
-	protected void init(XMLResource resource, Map<?, ?> options) {
-		super.init(resource, options);
-
-		// set extended meta data
-		Object extendedMetaDataOption = options.get(XMLResource.OPTION_EXTENDED_META_DATA);
-		if (null != extendedMetaDataOption && extendedMetaDataOption instanceof XMLPersistenceMappingExtendedMetaData) {
-			xmlPersistenceMappingExtendedMetaData = (XMLPersistenceMappingExtendedMetaData) options.get(XMLResource.OPTION_EXTENDED_META_DATA);
-			extendedMetaData = xmlPersistenceMappingExtendedMetaData;
-		} else {
-			// default
-			xmlPersistenceMappingExtendedMetaData = xmlResource == null || xmlResource.getResourceSet() == null ? XMLPersistenceMappingExtendedMetaData.INSTANCE
-					: new XMLPersistenceMappingExtendedMetaDataImpl(xmlResource.getResourceSet().getPackageRegistry());
-			extendedMetaData = xmlPersistenceMappingExtendedMetaData;
-		}
-		helper.setExtendedMetaData(xmlPersistenceMappingExtendedMetaData);
-
-		Object namespaceToPrefixMapObject = options.get(XMLPersistenceMappingResource.OPTION_NAMEPSACE_TO_PREFIX_MAP);
-		if (null != namespaceToPrefixMapObject && namespaceToPrefixMapObject instanceof Map<?, ?>) {
-			@SuppressWarnings("unchecked")
-			Map<Object, Object> namespaceToPrefixMap = (Map<Object, Object>) namespaceToPrefixMapObject;
-			EMap<String, String> prefixToNamespaceMap = helper.getPrefixToNamespaceMap();
-			for (Map.Entry<Object, Object> entry : namespaceToPrefixMap.entrySet()) {
-				Object namespace = entry.getKey();
-				Object prefix = entry.getValue();
-				if (namespace instanceof String && prefix instanceof String) {
-					if (prefixToNamespaceMap.contains(prefix)) {
-						// TODO: handle namespace redefinitions
-						if (null == redefinedNamespaceUriToPrefixMap) {
-							redefinedNamespaceUriToPrefixMap = new HashMap<String, String>();
-						}
-						redefinedNamespaceUriToPrefixMap.put((String) namespace, (String) prefix);
-					} else {
-						prefixToNamespaceMap.put((String) prefix, (String) namespace);
-					}
-				}
-			}
-		}
-
-		assert null != xmlPersistenceMappingExtendedMetaData : "xmlPersistenceMappingExtendedMetaData should never be null"; //$NON-NLS-1$
-		assert null != extendedMetaData : "extendedMetaData should never be null"; //$NON-NLS-1$
-	}
-
-	protected Collection<EClass> getOrderedClasses(List<? extends InternalEObject> values) {
-		Set<EClass> classesSet = new LinkedHashSet<EClass>();
-		for (EObject value : values) {
-			classesSet.add(value.eClass());
-		}
-
-		List<EClass> classesList = new ArrayList<EClass>(classesSet);
-		Comparator<EClass> comparator = new Comparator<EClass>() {
-			public int compare(EClass o1, EClass o2) {
-				return o1.getName().compareTo(o2.getName());
-			}
-		};
-
-		Collections.sort(classesList, comparator);
-
-		return classesList;
-	}
-
-	protected boolean isXMLPersistenceMappingEnabled(EStructuralFeature feature) {
-		return xmlPersistenceMappingExtendedMetaData.isXMLPersistenceMappingEnabled(feature);
-	}
-
-	@Override
-	protected void saveElementID(EObject o) {
-		// avoid writing the ID since this is already written as usual attribute
-		saveFeatures(o);
-	}
-
-}
diff --git a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/doc-files/LoadPatternEAttributeContained0100.png b/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/doc-files/LoadPatternEAttributeContained0100.png
deleted file mode 100644
index da8e79d..0000000
--- a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/internal/serialization/doc-files/LoadPatternEAttributeContained0100.png
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/IdAdapter.java b/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/IdAdapter.java
deleted file mode 100644
index 0de7ac2..0000000
--- a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/IdAdapter.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *     Mark Broerkens - initial API and implementation
- * 
- */
-package org.eclipse.rmf.serialization;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.util.EContentAdapter;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-
-public class IdAdapter extends EContentAdapter {
-	final Map<String, EObject> idToEObjectMap;
-	final Map<EObject, String> eObjectToIDMap;
-	final Collection<EPackage> createIdForPackages;
-
-	public IdAdapter(Map<String, EObject> idToEObjectMap, Map<EObject, String> eObjectToIDMap, Collection<EPackage> createIdForPackages) {
-		super();
-		this.idToEObjectMap = idToEObjectMap;
-		this.eObjectToIDMap = eObjectToIDMap;
-		this.createIdForPackages = createIdForPackages;
-	}
-
-	@Override
-	public boolean isAdapterForType(Object type) {
-		// TODO Auto-generated method stub
-		return super.isAdapterForType(type);
-	}
-
-	@Override
-	public void notifyChanged(Notification n) {
-		assert null != n.getNotifier();
-		super.notifyChanged(n); // the superclass handles adding/removing this Adapter to new Books
-
-		Object notifier_ = n.getNotifier();
-		if (!n.isTouch()) {
-			if (notifier_ instanceof EObject) {
-				Object feature = n.getFeature();
-				if (feature instanceof EAttribute) {
-					// handle changed id
-					EAttribute attribute = (EAttribute) feature;
-					if (attribute.isID()) {
-						String newId = n.getNewStringValue();
-						String oldId = n.getOldStringValue();
-						EObject objectWithId = (EObject) n.getNotifier();
-						switch (n.getEventType()) {
-						case Notification.SET:
-							if (null == newId) {
-								eObjectToIDMap.remove(objectWithId);
-							} else {
-								eObjectToIDMap.put(objectWithId, newId);
-								idToEObjectMap.put(newId, objectWithId);
-							}
-
-							if (null != oldId) {
-								idToEObjectMap.remove(oldId);
-							}
-							break;
-						case Notification.UNSET:
-							eObjectToIDMap.remove(objectWithId);
-							idToEObjectMap.remove(oldId);
-							break;
-						}
-					}
-				} else {
-					// handle removed or added objects
-					EReference reference = (EReference) feature;
-					if (reference.isContainment()) {
-
-						switch (n.getEventType()) {
-						case Notification.SET:
-						case Notification.ADD:
-							handleNewObjectAndSubObjects((EObject) n.getNewValue());
-							break;
-						case Notification.ADD_MANY:
-							EList<EObject> newObjects = (EList<EObject>) n.getNewValue();
-							int size = newObjects.size();
-							for (int i = 0; i < size; i++) {
-								handleNewObjectAndSubObjects(newObjects.get(i));
-							}
-							break;
-						case Notification.UNSET:
-						case Notification.REMOVE:
-							handleRemoveObjectAndSubObjects((EObject) n.getOldValue());
-							break;
-						case Notification.REMOVE_MANY:
-							EList<EObject> removeObjects = (EList<EObject>) n.getOldValue();
-							size = removeObjects.size();
-							for (int i = 0; i < size; i++) {
-								handleRemoveObjectAndSubObjects(removeObjects.get(i));
-							}
-							break;
-						}
-
-					}
-				}
-
-			} else if (notifier_ instanceof Resource) {
-				// feature is null
-				int featureID = n.getFeatureID(Resource.class);
-				if (Resource.RESOURCE__CONTENTS == featureID) {
-					switch (n.getEventType()) {
-					case Notification.SET:
-					case Notification.ADD:
-						handleNewObjectAndSubObjects((EObject) n.getNewValue());
-						break;
-					case Notification.ADD_MANY:
-						EList<EObject> newObjects = (EList<EObject>) n.getNewValue();
-						int size = newObjects.size();
-						for (int i = 0; i < size; i++) {
-							handleNewObjectAndSubObjects(newObjects.get(i));
-						}
-						break;
-					case Notification.UNSET:
-					case Notification.REMOVE:
-						handleRemoveObjectAndSubObjects((EObject) n.getOldValue());
-						break;
-					case Notification.REMOVE_MANY:
-						EList<EObject> removeObjects = (EList<EObject>) n.getOldValue();
-						size = removeObjects.size();
-						for (int i = 0; i < size; i++) {
-							handleRemoveObjectAndSubObjects(removeObjects.get(i));
-						}
-						break;
-					}
-				}
-			} else if (notifier_ instanceof ResourceSet) {
-				// NOP
-			} else {
-				// NOP
-			}
-
-		} // end if isTouch
-
-	}// end notifyChanged
-
-	void handleNewObjectAndSubObjects(EObject objectWithId) {
-		if (null != objectWithId) {
-			handleNewObject(objectWithId);
-		}
-		TreeIterator<EObject> iterator = objectWithId.eAllContents();
-		while (iterator.hasNext()) {
-			handleNewObject(iterator.next());
-		}
-	}
-
-	void handleNewObject(EObject objectWithId) {
-		assert null != objectWithId;
-		EAttribute idAttribute = objectWithId.eClass().getEIDAttribute();
-		if (null != idAttribute) {
-			String id = (String) objectWithId.eGet(idAttribute);
-			if ((id == null || 0 == id.length()) && createIdForPackages.contains(objectWithId.eClass().getEPackage())) {
-				id = EcoreUtil.generateUUID();
-				objectWithId.eSet(idAttribute, id);
-				// id map gets updated by notification on setId
-			} else {
-				eObjectToIDMap.put(objectWithId, id);
-				idToEObjectMap.put(id, objectWithId);
-			}
-		}
-	}
-
-	void handleRemoveObjectAndSubObjects(EObject objectWithId) {
-		if (null != objectWithId) {
-			handleRemoveObject(objectWithId);
-		}
-		TreeIterator<EObject> iterator = objectWithId.eAllContents();
-		while (iterator.hasNext()) {
-			handleRemoveObject(iterator.next());
-		}
-	}
-
-	void handleRemoveObject(EObject objectWithId) {
-		assert null != objectWithId;
-		String id = eObjectToIDMap.remove(objectWithId);
-		if (null != id) {
-			idToEObjectMap.remove(id);
-		}
-	}
-
-}
diff --git a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingExtendedMetaData.java b/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingExtendedMetaData.java
deleted file mode 100644
index 72da53e..0000000
--- a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingExtendedMetaData.java
+++ /dev/null
@@ -1,405 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *   itemis AG - initial API and implementation
- */
-package org.eclipse.rmf.serialization;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.ExtendedMetaData;
-
-public interface XMLPersistenceMappingExtendedMetaData extends ExtendedMetaData {
-
-	/**
-	 * The URI used as the annotation source:
-	 * "http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData".
-	 */
-	String XML_PERSISTENCE_MAPPING_ANNOTATION_SOURCE_URI = "http:///org/eclipse/sphinx/emf/serialization/XMLPersistenceMappingExtendedMetaData"; //$NON-NLS-1$
-
-	/**
-	 * Returns the XML name for a classifier. This is the name is used if a classifier XML element is configured.
-	 * <p>
-	 * details key: "name"
-	 */
-	String getXMLName(EClassifier eClassifier);
-
-	/**
-	 * Returns the XML name for a classifier in a context of a given feature. This name is used if a classifier XML
-	 * element is configured.
-	 * <p>
-	 * details key: Classifier "name" <br/>
-	 * details key: EStructuralFeature "classifierNameSuffix"
-	 */
-	String getXMLName(EClassifier classifier, EStructuralFeature eStructuralFeature);
-
-	/**
-	 * Sets the XML name for a classifier. This is the name is used if a classifier XML element is configured.
-	 * <p>
-	 * details key: "xmlName"
-	 */
-	// void setXMLName(EClassifier eClassifier, String xmlName);
-
-	/**
-	 * Returns the XML wrapper name for a classifier. This is the name is used if a classifier wrapper XML element is
-	 * configured.
-	 * <p>
-	 * details key: "wrapperName"
-	 */
-	String getXMLWrapperName(EClassifier eClassifier);
-
-	/**
-	 * Sets the XML wrapper name for a classifier. This is the name is used if a classifier wrapper XML element is
-	 * configured.
-	 * <p>
-	 * details key: "wrapperName"
-	 */
-	// void setXMLWrapperName(EClassifier eClassifier, String xmlName);
-
-	/**
-	 * Returns the XML name for a structural feature. This is the name is used if a feature XML element is configured.
-	 * <p>
-	 * details key: "name"
-	 */
-	String getXMLName(EStructuralFeature eStructuralFeature);
-
-	/**
-	 * Set the XML name for a structural feature. This is the name is used if a feature XML element is configured.
-	 * <p>
-	 * details key: "name"
-	 */
-	// void setXMLName(EStructuralFeature eStructuralFeature, String xmlName);
-
-	/**
-	 * Returns the XML name for a structural feature. This is the name is used if a feature wrapper XML element is
-	 * configured.
-	 * <p>
-	 * details key: "wrapperName"
-	 */
-	String getXMLWrapperName(EStructuralFeature eStructuralFeature);
-
-	/**
-	 * Set the XML name for a structural feature. This is the name is used if a feature wrapper XML element is
-	 * configured.
-	 * <p>
-	 * details key: "wrapperName"
-	 */
-	// void setXMLWrapperName(EStructuralFeature eStructuralFeature, String xmlName);
-
-	/**
-	 * Returns the classifier with the given XML name within the package with the given namespace.
-	 */
-	EClassifier getTypeByXMLName(String namespace, String xmlName);
-
-	/**
-	 * Returns the classifier with the given XML name within the package with the given namespace.
-	 */
-	EClassifier getTypeByXMLName(String namespace, String xmlName, EStructuralFeature feature);
-
-	/**
-	 * Returns the classifier with the given XML wrapper name within the package with the given namespace.
-	 */
-	EClassifier getTypeByXMLWrapperName(String namespace, String xmlWrapperName);
-
-	/**
-	 * Returns the classifier with the given XML name within the given package.
-	 */
-	EClassifier getTypeByXMLName(EPackage ePackage, String xmlName);
-
-	/**
-	 * Returns the classifier with the given XML name within the given package.
-	 */
-	EClassifier getTypeByXMLWrapperName(EPackage ePackage, String xmlWrapperName);
-
-	/**
-	 * Retrieves the package with the specified namespace URI from the package registry associated with this instance.
-	 */
-	EPackage getPackage(String namespace);
-
-	boolean isXMLPersistenceMappingEnabled(EStructuralFeature feature);
-
-	/**
-	 * Returns a structural feature within a class, corresponding to a local attribute with the given namespace and
-	 * name, or, failing that, a document root feature corresponding to a global attribute with the given namespace and
-	 * name that is {@link #getAffiliation(EClass, EStructuralFeature) affiliated} with a feature in the class.
-	 */
-	EStructuralFeature getAttribute(EClass eClass, String namespace, String name);
-
-	/**
-	 * Returns a structural feature within a class, corresponding to a local element with the given namespace and name,
-	 * or, failing that, a document root feature corresponding to a global element with the given namespace and name
-	 * that is {@link #getAffiliation(EClass, EStructuralFeature) affiliated} with a feature in the class.
-	 */
-	EStructuralFeature getFeatureByXMLElementName(EClass eClass, String namespace, String name);
-
-	int SERIALIZATION_STRUCTURE__UNDEFINED = -1;
-
-	/**
-	 * The feature serialization structure ID for a feature that is serialized using the following XML element
-	 * structure:
-	 * 
-	 * <pre>
-	 * &lt;Parent&gt;
-	 *   ...
-	 * &lt;/Parent&gt;
-	 * </pre>
-	 * 
-	 * details key: "featureWrapperElement=false" <br/>
-	 * details key: "featureElement=false" <br/>
-	 * details key: "classifierWrapperElement=false"<br/>
-	 * details key: "classifierElement=false" <br/>
-	 * 
-	 * @see #getFeatureSerializationStructure
-	 * @see #setFeatureSerializationStructure
-	 */
-	int SERIALIZATION_STRUCTURE__0000__NONE = 0;
-
-	/**
-	 * The feature serialization structure ID for a feature that is serialized using the following XML element
-	 * structure:
-	 * 
-	 * <pre>
-	 * &lt;Parent&gt;
-	 *   	(&lt;ClassifierName&gt; ... &lt;/ClassifierName&gt;)?
-	 * &lt;/Parent&gt;
-	 * </pre>
-	 * 
-	 * details key: "featureWrapperElement=false" <br/>
-	 * details key: "featureElement=false" <br/>
-	 * details key: "classifierWrapperElement=false"<br/>
-	 * details key: "classifierElement=true" <br/>
-	 * 
-	 * @see #getFeatureSerializationStructure
-	 * @see #setFeatureSerializationStructure
-	 */
-	int SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT = 1;
-
-	/**
-	 * The feature serialization structure ID for a feature that is serialized using the following XML element
-	 * structure:
-	 * 
-	 * <pre>
-	 * &lt;Parent&gt;
-	 *    &lt;ClassifierWrapperName&gt;
-	 *   	( ... )?
-	 *    &lt;/ClassifierWrapperName&gt;
-	 * &lt;/Parent&gt;
-	 * </pre>
-	 * 
-	 * details key: "featureWrapperElement=false" <br/>
-	 * details key: "featureElement=false" <br/>
-	 * details key: "classifierWrapperElement=true"<br/>
-	 * details key: "classifierElement=false" <br/>
-	 * 
-	 * @see #getFeatureSerializationStructure
-	 * @see #setFeatureSerializationStructure
-	 */
-	int SERIALIZATION_STRUCTURE__0010__CLASSIFIER_WRAPPER_ELEMENT = 2;
-
-	/**
-	 * The feature serialization structure ID for a feature that is serialized using the following XML element
-	 * structure:
-	 * 
-	 * <pre>
-	 * &lt;Parent&gt;
-	 *    &lt;ClassifierWrapperName&gt;
-	 *   	(&lt;ClassifierName&gt; ... &lt;/ClassifierName&gt;)?
-	 *    &lt;/ClassifierWrapperName&gt;
-	 * &lt;/Parent&gt;
-	 * </pre>
-	 * 
-	 * details key: "featureWrapperElement=false" <br/>
-	 * details key: "featureElement=false" <br/>
-	 * details key: "classifierWrapperElement=true"<br/>
-	 * details key: "classifierElement=true" <br/>
-	 * 
-	 * @see #getFeatureSerializationStructure
-	 * @see #setFeatureSerializationStructure
-	 */
-	int SERIALIZATION_STRUCTURE__0011__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT = 3;
-
-	/**
-	 * The feature serialization structure ID for a feature that is serialized using the following XML element
-	 * structure:
-	 * 
-	 * <pre>
-	 * &lt;Parent&gt;
-	 *    (&lt;FeatureName&gt;
-	 *   	...
-	 *    &lt;/FeatureName&gt;)?
-	 * &lt;/Parent&gt;
-	 * </pre>
-	 * 
-	 * details key: "featureWrapperElement=false" <br/>
-	 * details key: "featureElement=true" <br/>
-	 * details key: "classifierWrapperElement=false"<br/>
-	 * details key: "classifierElement=false" <br/>
-	 * 
-	 * @see #getFeatureSerializationStructure
-	 * @see #setFeatureSerializationStructure
-	 */
-	int SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT = 4;
-
-	/**
-	 * The feature serialization structure ID for a feature that is serialized using the following XML element
-	 * structure:
-	 * 
-	 * <pre>
-	 * &lt;Parent&gt;
-	 *   (&lt;FeatureName&gt;
-	 *   	&lt;ClassifierName&gt; ... &lt;/ClassifierName&gt;
-	 *   &lt;/FeatureName&gt;)?
-	 * &lt;/Parent&gt;
-	 * </pre>
-	 * 
-	 * details key: "featureWrapperElement=false" <br/>
-	 * details key: "featureElement=true" <br/>
-	 * details key: "classifierWrapperElement=false"<br/>
-	 * details key: "classifierElement=true" <br/>
-	 * 
-	 * @see #getFeatureSerializationStructure
-	 * @see #setFeatureSerializationStructure
-	 */
-	int SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT = 5;
-
-	/**
-	 * The feature serialization structure ID for a feature that is serialized using the following XML element
-	 * structure:
-	 * 
-	 * <pre>
-	 * &lt;Parent&gt;
-	 *   (&lt;FeatureName&gt;
-	 *   	&lt;ClassifierWrapperName&gt; ... &lt;/ClassifierWrapperName&gt;
-	 *   &lt;/FeatureName&gt;)?
-	 * &lt;/Parent&gt;
-	 * </pre>
-	 * 
-	 * details key: "featureWrapperElement=false" <br/>
-	 * details key: "featureElement=true" <br/>
-	 * details key: "classifierWrapperElement=true"<br/>
-	 * details key: "classifierElement=false" <br/>
-	 * 
-	 * @see #getFeatureSerializationStructure
-	 * @see #setFeatureSerializationStructure
-	 */
-	int SERIALIZATION_STRUCTURE__0110__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT = 6;
-
-	/**
-	 * The feature serialization structure ID for a feature that is serialized using the following XML element
-	 * structure:
-	 * 
-	 * <pre>
-	 * &lt;Parent&gt;
-	 *   (&lt;FeatureName&gt;
-	 *   	&lt;ClassifierWrapperName&gt; 
-	 *        (&lt;ClassifierName&gt; ... &lt;/ClassifierName&gt;)?
-	 *      &lt;/ClassifierWrapperName&gt; 
-	 *   &lt;/FeatureName&gt;)?
-	 * &lt;/Parent&gt;
-	 * </pre>
-	 * 
-	 * details key: "featureWrapperElement=false" <br/>
-	 * details key: "featureElement=true" <br/>
-	 * details key: "classifierWrapperElement=true"<br/>
-	 * details key: "classifierElement=true" <br/>
-	 * 
-	 * @see #getFeatureSerializationStructure
-	 * @see #setFeatureSerializationStructure
-	 */
-	int SERIALIZATION_STRUCTURE__0111__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT = 7;
-
-	/**
-	 * The feature serialization structure ID for a feature that is serialized using the following XML element
-	 * structure:
-	 * 
-	 * <pre>
-	 * &lt;Parent&gt;
-	 *   &lt;FeatureWrapperName&gt;
-	 *       ( ... )? 
-	 *   &lt;/FeatureWrapperName&gt;
-	 * &lt;/Parent&gt;
-	 * </pre>
-	 * 
-	 * details key: "featureWrapperElement=true" <br/>
-	 * details key: "featureElement=false" <br/>
-	 * details key: "classifierWrapperElement=false"<br/>
-	 * details key: "classifierElement=false" <br/>
-	 * 
-	 * @see #getFeatureSerializationStructure
-	 * @see #setFeatureSerializationStructure
-	 */
-	int SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT = 8;
-
-	/**
-	 * The feature serialization structure ID for a feature that is serialized using the following XML element
-	 * structure:
-	 * 
-	 * <pre>
-	 * &lt;Parent&gt;
-	 *   &lt;FeatureWrapperName&gt;
-	 *   	(&lt;ClassifierName&gt; ... &lt;/ClassifierName&gt;)?
-	 *   &lt;/FeatureWrapperName&gt;
-	 * &lt;/Parent&gt;
-	 * </pre>
-	 * 
-	 * details key: "featureWrapperElement=true" <br/>
-	 * details key: "featureElement=false" <br/>
-	 * details key: "classifierWrapperElement=false"<br/>
-	 * details key: "classifierElement=true" <br/>
-	 * 
-	 * @see #getFeatureSerializationStructure
-	 * @see #setFeatureSerializationStructure
-	 */
-	int SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT = 9;
-
-	int SERIALIZATION_STRUCTURE__1010__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT = 10;
-
-	int SERIALIZATION_STRUCTURE__1011__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT = 11;
-
-	int SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT = 12;
-
-	int SERIALIZATION_STRUCTURE__1101__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_ELEMENT = 13;
-
-	int SERIALIZATION_STRUCTURE__1110__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT = 14;
-
-	int SERIALIZATION_STRUCTURE__1111__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT = 15;
-
-	/**
-	 * Returns the kind of XML structure that should be used to represent the given structural feature.
-	 * <p>
-	 * details key: "featureElement" <br/>
-	 * details key: "featureWrapperElement" <br/>
-	 * details key: "classifierElement" <br/>
-	 * details key: "classifierWrapperElement"<br/>
-	 * 
-	 * @param eStructuralFeature
-	 * @param featureSerializationKind
-	 */
-	int getFeatureSerializationStructure(EStructuralFeature eStructuralFeature);
-
-	/**
-	 * Sets the kind of XML structure that should be used to represent the given structural feature.
-	 * <p>
-	 * details key: "featureElement" <br/>
-	 * details key: "featureWrapperElement" <br/>
-	 * details key: "classifierElement" <br/>
-	 * details key: "classifierWrapperElement"<br/>
-	 * 
-	 * @param eStructuralFeature
-	 * @param featureSerializationKind
-	 */
-	void setFeatureSerializationStructure(EStructuralFeature eStructuralFeature, int serializationStructure);
-
-	/**
-	 * The default RMFExtendedMetaData instance.
-	 */
-	XMLPersistenceMappingExtendedMetaData INSTANCE = new XMLPersistenceMappingExtendedMetaDataImpl();
-
-}
diff --git a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingExtendedMetaDataImpl.java b/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingExtendedMetaDataImpl.java
deleted file mode 100644
index 7840841..0000000
--- a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingExtendedMetaDataImpl.java
+++ /dev/null
@@ -1,874 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *   itemis AG - initial API and implementation
- */
-package org.eclipse.rmf.serialization;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcoreFactory;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.util.BasicExtendedMetaData;
-
-public class XMLPersistenceMappingExtendedMetaDataImpl extends BasicExtendedMetaData implements XMLPersistenceMappingExtendedMetaData {
-	static final String WRAPPER_NAME = "wrapperName"; //$NON-NLS-1$
-	static final String CLASSIFIER_NAME_SUFFIX = "classifierNameSuffix"; //$NON-NLS-1$
-
-	static final String FEATURE_WRAPPER_ELEMENT = "featureWrapperElement"; //$NON-NLS-1$
-	static final String FEATURE_ELEMENT = "featureElement"; //$NON-NLS-1$
-	static final String CLASSIFIER_WRAPPER_ELEMENT = "classifierWrapperElement"; //$NON-NLS-1$
-	static final String CLASSIFIER_ELEMENT = "classifierElement"; //$NON-NLS-1$
-
-	static final int FEATURE_WRAPPER_ELEMENT_MASK = 8;
-	static final int FEATURE_ELEMENT_MASK = 4;
-	static final int CLASSIFIER_WRAPPER_ELEMENT_MASK = 2;
-	static final int CLASSIFIER_ELEMENT_MASK = 1;
-
-	protected EPackage.Registry registry;
-
-	protected int[] fallbackSerializationConfiguration = {
-			SERIALIZATION_STRUCTURE__0000__NONE /* 0000 */,
-			// SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 0001 */,
-			SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT /* 0001 */,
-			// SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 0010 */,
-			SERIALIZATION_STRUCTURE__0010__CLASSIFIER_WRAPPER_ELEMENT /* 0010 */,
-			// SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 0011 */,
-			SERIALIZATION_STRUCTURE__0011__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 0011 */,
-			SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT /* 0100 */,
-			SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT/* 0101 */,
-			// SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 0110 */,
-			SERIALIZATION_STRUCTURE__0110__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT/* 0110 */,
-			// SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 0111 */,
-			SERIALIZATION_STRUCTURE__0111__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT /* 0111 */,
-			SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT /* 1000 */,
-			SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 1001 */,
-			SERIALIZATION_STRUCTURE__1010__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT/* 1010 */,
-			SERIALIZATION_STRUCTURE__1011__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 1011 */,
-			SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT/* 1100_ */,
-			SERIALIZATION_STRUCTURE__1101__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_ELEMENT /* 1101 */,
-			SERIALIZATION_STRUCTURE__1110__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT/* 1110 */,
-			SERIALIZATION_STRUCTURE__1111__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT /* 1111 */
-	};
-
-	static final String PLURAL_EXTENSION = "s"; //$NON-NLS-1$
-
-	protected Map<EModelElement, Object> extendedMetaDataCache = new HashMap<EModelElement, Object>();
-	protected Map<EModelElement, EAnnotation> annotationCache = new HashMap<EModelElement, EAnnotation>();
-
-	public static interface XMLPersistenceMappingEPackageExtendedMetaData {
-		EClassifier getType(String name);
-
-		EClassifier getType(String name, EStructuralFeature feature);
-
-		EClassifier getTypeByWrapperName(String wrapperName);
-
-		void renameToXMLName(EClassifier eClassifier, String newName);
-
-		void renameToXMLWrapperName(EClassifier eClassifier, String newName);
-	}
-
-	public class XMLPersistenceMappingEPackageExtendedMetaDataImpl implements XMLPersistenceMappingEPackageExtendedMetaData {
-		protected EPackage ePackage;
-		protected boolean isInitialized;
-		protected boolean isQualified;
-		protected Map<String, EClassifier> xmlNameToClassifierMap = new HashMap<String, EClassifier>();
-		protected Map<String, EClassifier> xmlWrapperNameToClassifierMap = new HashMap<String, EClassifier>();
-
-		public XMLPersistenceMappingEPackageExtendedMetaDataImpl(EPackage ePackage) {
-			this.ePackage = ePackage;
-		}
-
-		public EClassifier getType(String name) {
-			EClassifier result = null;
-			if (xmlNameToClassifierMap != null) {
-				result = xmlNameToClassifierMap.get(name);
-			}
-			if (result == null) {
-				List<EClassifier> eClassifiers = ePackage.getEClassifiers();
-				int size = eClassifiers.size();
-				if (xmlNameToClassifierMap == null || xmlNameToClassifierMap.size() != size) {
-					Map<String, EClassifier> nameToClassifierMap = new HashMap<String, EClassifier>();
-					if (xmlNameToClassifierMap != null) {
-						nameToClassifierMap.putAll(xmlNameToClassifierMap);
-					}
-
-					// For demand created created packages we allow the list of classifiers to grow
-					// so this should handle those additional instances.
-					//
-					int originalMapSize = nameToClassifierMap.size();
-					for (int i = originalMapSize; i < size; ++i) {
-						EClassifier eClassifier = eClassifiers.get(i);
-						String eClassifierName = getXMLName(eClassifier);
-						EClassifier conflictingEClassifier = nameToClassifierMap.put(eClassifierName, eClassifier);
-						if (conflictingEClassifier != null && conflictingEClassifier != eClassifier) {
-							nameToClassifierMap.put(eClassifierName, conflictingEClassifier);
-						}
-					}
-
-					if (nameToClassifierMap.size() != size) {
-						for (int i = 0; i < originalMapSize; ++i) {
-							EClassifier eClassifier = eClassifiers.get(i);
-							String eClassifierName = getXMLName(eClassifier);
-							EClassifier conflictingEClassifier = nameToClassifierMap.put(eClassifierName, eClassifier);
-							if (conflictingEClassifier != null && conflictingEClassifier != eClassifier) {
-								nameToClassifierMap.put(eClassifierName, conflictingEClassifier);
-							}
-						}
-					}
-					result = nameToClassifierMap.get(name);
-					xmlNameToClassifierMap = nameToClassifierMap;
-				}
-			}
-
-			return result;
-		}
-
-		public EClassifier getType(String name, EStructuralFeature feature) {
-			// TODO optimize implementation for performance
-			String classifierNameSuffix = getXMLPersistenceMappingExtendedMetaData(feature).getXMLClassiferNameSuffix();
-			EClassifier classifier;
-			int classifierNameSuffixLength = classifierNameSuffix.length();
-			if (0 == classifierNameSuffixLength) {
-				classifier = getType(name);
-			} else {
-				if (name.endsWith(classifierNameSuffix)) {
-					String classfierName = name.substring(0, name.length() - classifierNameSuffixLength);
-					classifier = getType(classfierName);
-				} else {
-					classifier = null;
-				}
-			}
-
-			return classifier;
-		}
-
-		public EClassifier getTypeByWrapperName(String name) {
-			EClassifier result = null;
-			if (xmlWrapperNameToClassifierMap != null) {
-				result = xmlWrapperNameToClassifierMap.get(name);
-			}
-			if (result == null) {
-				List<EClassifier> eClassifiers = ePackage.getEClassifiers();
-				int size = eClassifiers.size();
-				if (xmlWrapperNameToClassifierMap == null || xmlWrapperNameToClassifierMap.size() != size) {
-					Map<String, EClassifier> wrapperNameToClassifierMap = new HashMap<String, EClassifier>();
-					if (xmlWrapperNameToClassifierMap != null) {
-						wrapperNameToClassifierMap.putAll(xmlWrapperNameToClassifierMap);
-					}
-
-					// For demand created created packages we allow the list of classifiers to grow
-					// so this should handle those additional instances.
-					//
-					int originalMapSize = wrapperNameToClassifierMap.size();
-					for (int i = originalMapSize; i < size; ++i) {
-						EClassifier eClassifier = eClassifiers.get(i);
-						String eClassifierWrapperName = getXMLWrapperName(eClassifier);
-						EClassifier conflictingEClassifier = wrapperNameToClassifierMap.put(eClassifierWrapperName, eClassifier);
-						if (conflictingEClassifier != null && conflictingEClassifier != eClassifier) {
-							wrapperNameToClassifierMap.put(eClassifierWrapperName, conflictingEClassifier);
-						}
-					}
-
-					if (wrapperNameToClassifierMap.size() != size) {
-						for (int i = 0; i < originalMapSize; ++i) {
-							EClassifier eClassifier = eClassifiers.get(i);
-							String eClassifierWrapperName = getXMLWrapperName(eClassifier);
-							EClassifier conflictingEClassifier = wrapperNameToClassifierMap.put(eClassifierWrapperName, eClassifier);
-							if (conflictingEClassifier != null && conflictingEClassifier != eClassifier) {
-								wrapperNameToClassifierMap.put(eClassifierWrapperName, conflictingEClassifier);
-							}
-						}
-					}
-					result = wrapperNameToClassifierMap.get(name);
-					xmlWrapperNameToClassifierMap = wrapperNameToClassifierMap;
-				}
-			}
-
-			return result;
-		}
-
-		public void renameToXMLName(EClassifier eClassifier, String newName) {
-			if (xmlNameToClassifierMap != null) {
-				xmlNameToClassifierMap.values().remove(eClassifier);
-				xmlNameToClassifierMap.put(newName, eClassifier);
-			}
-		}
-
-		public void renameToXMLWrapperName(EClassifier eClassifier, String newName) {
-			if (xmlWrapperNameToClassifierMap != null) {
-				xmlWrapperNameToClassifierMap.values().remove(eClassifier);
-				xmlWrapperNameToClassifierMap.put(newName, eClassifier);
-			}
-		}
-	}
-
-	public static interface XMLPersistenceMappingEClassifierExtendedMetaData {
-		String getXMLName();
-
-		void setXMLName(String name);
-
-		String getXMLWrapperName();
-
-		void setXMLWrapperName(String name);
-
-		EStructuralFeature getFeatureByXMLElementName(String namespace, String xmlElementName);
-
-	}
-
-	class XMLPersistenceMappingEDataTypeExtendedMetaDataImpl implements XMLPersistenceMappingEClassifierExtendedMetaData {
-		protected static final String UNINITIALIZED_STRING = "uninitialized"; //$NON-NLS-1$
-		protected static final int UNINITIALIZED_INT = -2;
-
-		protected EClassifier eClassifier;
-		protected String xmlName = UNINITIALIZED_STRING;
-		protected String xmlWrapperName = UNINITIALIZED_STRING;
-
-		public XMLPersistenceMappingEDataTypeExtendedMetaDataImpl(EClassifier eClassifier) {
-			super();
-			this.eClassifier = eClassifier;
-		}
-
-		public String getXMLName() {
-			if (UNINITIALIZED_STRING == xmlName) {
-				setXMLName(basicGetName(eClassifier));
-			}
-			return xmlName;
-		}
-
-		public void setXMLName(String xmlName) {
-			this.xmlName = xmlName;
-		}
-
-		public String getXMLWrapperName() {
-			if (UNINITIALIZED_STRING == xmlName) {
-				setXMLWrapperName(basicGetWrapperName(eClassifier));
-			}
-			return xmlWrapperName;
-		}
-
-		public void setXMLWrapperName(String xmlWrapperName) {
-			this.xmlWrapperName = xmlWrapperName;
-
-		}
-
-		public EStructuralFeature getFeatureByXMLElementName(String namespace, String xmlElementName) {
-			throw new UnsupportedOperationException("Can't get a feature of an EDataType"); //$NON-NLS-1$
-		}
-	}
-
-	class XMLPersistenceMappingEClassExtendedMetaDataImpl implements XMLPersistenceMappingEClassifierExtendedMetaData {
-		protected static final String UNINITIALIZED_STRING = "uninitialized"; //$NON-NLS-1$
-		protected static final int UNINITIALIZED_INT = -2;
-
-		protected EClass eClass;
-		protected String xmlName = UNINITIALIZED_STRING;
-		protected String xmlWrapperName = UNINITIALIZED_STRING;
-
-		protected Map<String, EStructuralFeature> xmlNameToEStructuralFeatureMap = new HashMap<String, EStructuralFeature>();
-
-		public XMLPersistenceMappingEClassExtendedMetaDataImpl(EClassifier eClassifier) {
-			super();
-			assert eClassifier instanceof EClass;
-			eClass = (EClass) eClassifier;
-		}
-
-		public String getXMLName() {
-			if (UNINITIALIZED_STRING == xmlName) {
-				setXMLName(basicGetName(eClass));
-			}
-			return xmlName;
-		}
-
-		public void setXMLName(String xmlName) {
-			this.xmlName = xmlName;
-		}
-
-		public String getXMLWrapperName() {
-			if (UNINITIALIZED_STRING == xmlWrapperName) {
-				setXMLWrapperName(basicGetWrapperName(eClass));
-			}
-			return xmlWrapperName;
-		}
-
-		public void setXMLWrapperName(String xmlWrapperName) {
-			this.xmlWrapperName = xmlWrapperName;
-
-		}
-
-		/**
-		 * return first EStructuralFeature that fits to the XML element name TODO: add error handling for ambiguous
-		 * features
-		 */
-		public EStructuralFeature getFeatureByXMLElementName(String namespace, String xmlElementName) {
-			// try to find the EStructural feature locally
-			// TODO: consider namespace
-			EStructuralFeature result = xmlNameToEStructuralFeatureMap.get(xmlElementName);
-			if (null == result) {
-				Iterator<EStructuralFeature> allFeaturesIter = eClass.getEAllStructuralFeatures().iterator();
-				// TODO: we should iterate over features with no kind or
-				List<EStructuralFeature> results = new ArrayList<EStructuralFeature>();
-				EStructuralFeature possibleResult;
-
-				while (allFeaturesIter.hasNext()) {
-					EStructuralFeature feature = allFeaturesIter.next();
-					possibleResult = null;
-					String xmlWrapperName = getXMLPersistenceMappingExtendedMetaData(feature).getXMLWrapperName();
-
-					// search by feature wrapper
-					if (xmlWrapperName.equals(xmlElementName) && isIdentifiedByFeatureWrapper(feature)) {
-						if (isIdentifiedByFeatureWrapper(feature)) {
-							possibleResult = feature;
-						} else {
-							// not found, continue with next feature
-						}
-					}
-
-					if (null == possibleResult) {
-						// search by feature name
-						String xmlName = getXMLPersistenceMappingExtendedMetaData(feature).getXMLName();
-						if (xmlName.equals(xmlElementName)) {
-							if (isIdentifiedByFeature(feature)) {
-								possibleResult = feature;
-							} else {
-								// not found, continue with next feature
-							}
-						}
-					}
-
-					if (null == possibleResult) {
-						// search by type wrapper (assuming type is type of feature)
-						String classifierWrapperXMLName = getXMLPersistenceMappingExtendedMetaData(feature.getEType()).getXMLWrapperName();
-						if (classifierWrapperXMLName.equals(xmlElementName)) {
-							if (isIdentifiedByClassifierWrapper(feature)) {
-								possibleResult = feature;
-							} else {
-								// not found, continue with next feature
-							}
-						} else {
-							// search by type wrapper name (assuming type not type of feature)
-							EClassifier classifier = getTypeByXMLWrapperName(namespace, xmlElementName);
-							if (null != classifier) {
-								if (feature.getEType().equals(classifier)) {
-									if (isIdentifiedByClassifierWrapper(feature)) {
-										possibleResult = feature;
-									} else {
-										// not found, continue with next feature
-									}
-								} else if (classifier instanceof EClass) {
-									EClass eClass = (EClass) classifier;
-									// check if the identified is a sub-type of the eType of the reference
-									// note: EObject is not listed in EAllSuperTypes
-									if (feature.getEType() == EcorePackage.eINSTANCE.getEObject()
-											|| eClass.getEAllSuperTypes().contains(feature.getEType())) {
-										if (isIdentifiedByClassifierWrapper(feature)) {
-											possibleResult = feature;
-										} else {
-											// not found, continue with next feature
-										}
-									} else {
-										// not found, continue with next feature
-									}
-								} else {
-									// not found, continue with next feature
-								}
-							}
-						}
-					}
-					if (null == possibleResult) {
-						// search by type name (assuming type not type of feature)
-						EClassifier classifier;
-						EPackage ePackage = getPackage(namespace);
-						if (null == ePackage) {
-							// unregistered package
-							classifier = demandType(namespace, xmlElementName);
-						} else {
-							// registered package
-							classifier = getTypeByXMLName(namespace, xmlElementName);
-						}
-
-						if (null != classifier) {
-							if (feature.getEType().equals(classifier)) {
-								if (isIdentifiedByClassifier(feature)) {
-									possibleResult = feature;
-								} else if (isEReference_Contained0000(feature)) {
-									possibleResult = feature;
-								} else {
-									// not found, continue with next feature
-								}
-							} else if (classifier instanceof EClass) {
-								EClass eClass = (EClass) classifier;
-								// check if the identified is a sub-type of the eType of the reference
-								// note: EObject is not listed in EAllSuperTypes
-								if (feature.getEType() == EcorePackage.eINSTANCE.getEObject()
-										|| eClass.getEAllSuperTypes().contains(feature.getEType())) {
-									if (isIdentifiedByClassifier(feature)) {
-										possibleResult = feature;
-									} else if (isEReference_Contained0000(feature)) {
-										possibleResult = feature;
-									} else {
-										// not found, continue with next feature
-									}
-								} else if (isEReference_Contained0000(feature)) {
-									possibleResult = feature;
-								} else {
-									// not found, continue with next feature
-								}
-							} else if (isEReference_Contained0000(feature)) {
-								possibleResult = feature;
-							} else {
-								// not found, continue with next feature
-							}
-						} else if (isEReference_Contained0000(feature)) {
-							possibleResult = feature;
-						} else {
-							// not found, continue with next feature
-						}
-					}
-
-					if (null != possibleResult) {
-						results.add(possibleResult);
-					}
-				} // while
-
-				// if there are multiple valid features, we prefer the feature that is many and is not NONE
-				int size = results.size();
-				if (1 == size) {
-					result = results.get(0);
-				} else if (1 < size) {
-					// rule 1 we like the features that are explicitly selected
-					List<EStructuralFeature> identifiedFeatures = new ArrayList<EStructuralFeature>();
-					List<EStructuralFeature> noneFeatures = new ArrayList<EStructuralFeature>();
-					for (int i = 0; i < size; i++) {
-						EStructuralFeature feature = results.get(i);
-						if (isNone(feature)) {
-							noneFeatures.add(feature);
-						} else {
-							identifiedFeatures.add(feature);
-						}
-					}
-
-					if (identifiedFeatures.isEmpty()) {
-						// there are none Features only
-						results = noneFeatures;
-					} else {
-						results = identifiedFeatures;
-					}
-
-					result = results.get(0);
-
-					// try to find a better features that is many
-					for (EStructuralFeature feature : results) {
-						if (feature.isMany()) {
-							result = feature;
-							break;
-						}
-					}
-				}
-				xmlNameToEStructuralFeatureMap.put(xmlElementName, result);
-			} // if (null == result)
-
-			// TODO: fall back to standard serialization?
-
-			return result;
-		}
-	}
-
-	public static interface XMLPersistenceMappingEStructuralFeatureExtendedMetaData {
-		String getXMLName();
-
-		void setXMLName(String name);
-
-		String getXMLWrapperName();
-
-		void setXMLWrapperName(String name);
-
-		String getXMLClassiferNameSuffix();
-
-		void setXMLClassiferNameSuffix(String suffix);
-
-		boolean isXMLPersistenceMappingEnabled();
-
-		int getFeatureSerializationStructure();
-
-		void setFeatureSerializationStructure(int featureSerializationStructure);
-	}
-
-	class XMLPersistenceMappingEStructuralFeatureExtendedMetaDataImpl implements XMLPersistenceMappingEStructuralFeatureExtendedMetaData {
-		protected static final String UNINITIALIZED_STRING = "uninitialized"; //$NON-NLS-1$
-		protected static final int UNINITIALIZED_INT = -2;
-
-		protected EStructuralFeature eStructuralFeature;
-		protected String xmlName = UNINITIALIZED_STRING;
-		protected String xmlWrapperName = UNINITIALIZED_STRING;
-		protected String xmlClassifierNameSuffix = UNINITIALIZED_STRING;
-		protected int featureSerializationStructure = UNINITIALIZED_INT;
-		protected Boolean xmlPersistenceMappingEnabled = null;
-
-		public XMLPersistenceMappingEStructuralFeatureExtendedMetaDataImpl(EStructuralFeature eStructuralFeature) {
-			super();
-			this.eStructuralFeature = eStructuralFeature;
-		}
-
-		public String getXMLName() {
-			if (UNINITIALIZED_STRING == xmlName) {
-				setXMLName(basicGetName(eStructuralFeature));
-			}
-			return xmlName;
-		}
-
-		public void setXMLName(String xmlName) {
-			this.xmlName = xmlName;
-		}
-
-		public String getXMLWrapperName() {
-			if (UNINITIALIZED_STRING == xmlWrapperName) {
-				setXMLWrapperName(basicGetWrapperName(eStructuralFeature));
-			}
-			return xmlWrapperName;
-		}
-
-		public void setXMLWrapperName(String xmlWrapperName) {
-			this.xmlWrapperName = xmlWrapperName;
-		}
-
-		public String getXMLClassiferNameSuffix() {
-			if (UNINITIALIZED_STRING == xmlClassifierNameSuffix) {
-				setXMLClassiferNameSuffix(basicGetClassifierNameSuffix(eStructuralFeature));
-			}
-			return xmlClassifierNameSuffix;
-		}
-
-		public boolean isXMLPersistenceMappingEnabled() {
-			if (null == xmlPersistenceMappingEnabled) {
-				setXMLPersistenceMappingEnabled(basicIsXMLPersistenceMappingEnabled(eStructuralFeature));
-			}
-			return xmlPersistenceMappingEnabled;
-
-		};
-
-		void setXMLPersistenceMappingEnabled(Boolean xmlPersistenceMappingEnabled) {
-			this.xmlPersistenceMappingEnabled = xmlPersistenceMappingEnabled;
-		};
-
-		public void setXMLClassiferNameSuffix(String suffix) {
-			xmlClassifierNameSuffix = suffix;
-		}
-
-		public int getFeatureSerializationStructure() {
-			if (UNINITIALIZED_INT == featureSerializationStructure) {
-				setFeatureSerializationStructure(basicGetFeatureSerializationStructure(eStructuralFeature));
-			}
-			return featureSerializationStructure;
-		}
-
-		public void setFeatureSerializationStructure(int featureSerializationStructure) {
-			this.featureSerializationStructure = featureSerializationStructure;
-		}
-
-	}
-
-	public XMLPersistenceMappingExtendedMetaDataImpl() {
-		this(EPackage.Registry.INSTANCE);
-	}
-
-	public XMLPersistenceMappingExtendedMetaDataImpl(EPackage.Registry registry) {
-		super();
-		this.registry = registry;
-	}
-
-	public XMLPersistenceMappingExtendedMetaDataImpl(int[] fallbackSerializations) {
-		this();
-		int min = 0;
-		int max = fallbackSerializationConfiguration.length;
-		for (int i = min; i < max && i < fallbackSerializations.length; i++) {
-			int newValue = fallbackSerializations[i];
-			if (min <= i && i < max) {
-				fallbackSerializationConfiguration[i] = newValue;
-			}
-		}
-	}
-
-	public boolean isXMLPersistenceMappingEnabled(EStructuralFeature feature) {
-		return null != getRMFAnnotation(feature, false);
-	}
-
-	public String getXMLName(EClassifier eClassifier) {
-		return getXMLPersistenceMappingExtendedMetaData(eClassifier).getXMLName();
-	}
-
-	public String getXMLWrapperName(EClassifier eClassifier) {
-		return getXMLPersistenceMappingExtendedMetaData(eClassifier).getXMLWrapperName();
-	}
-
-	public String getXMLName(EClassifier eClassifier, EStructuralFeature eStructuralFeature) {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(getXMLPersistenceMappingExtendedMetaData(eClassifier).getXMLName());
-		buffer.append(getXMLPersistenceMappingExtendedMetaData(eStructuralFeature).getXMLClassiferNameSuffix());
-		return buffer.toString();
-	}
-
-	public void setXMLWrapperName(EClassifier eClassifier, String xmlWrapperName) {
-		EAnnotation eAnnotation = getRMFAnnotation(eClassifier, true);
-		eAnnotation.getDetails().put(WRAPPER_NAME, xmlWrapperName);
-		getXMLPersistenceMappingExtendedMetaData(eClassifier).setXMLWrapperName(xmlWrapperName);
-		EPackage ePackage = eClassifier.getEPackage();
-		if (ePackage != null) {
-			getXMLPersistenceMappingExtendedMetaData(ePackage).renameToXMLWrapperName(eClassifier, xmlWrapperName);
-		}
-	}
-
-	public String getXMLName(EStructuralFeature eStructuralFeature) {
-		return getXMLPersistenceMappingExtendedMetaData(eStructuralFeature).getXMLName();
-	}
-
-	public String getXMLWrapperName(EStructuralFeature eStructuralFeature) {
-		return getXMLPersistenceMappingExtendedMetaData(eStructuralFeature).getXMLWrapperName();
-	}
-
-	public void setXMLWrapperName(EStructuralFeature eStructuralFeature, String xmlWrapperName) {
-		EAnnotation eAnnotation = getRMFAnnotation(eStructuralFeature, true);
-		eAnnotation.getDetails().put(WRAPPER_NAME, xmlWrapperName);
-		getXMLPersistenceMappingExtendedMetaData(eStructuralFeature).setXMLWrapperName(xmlWrapperName);
-	}
-
-	public int getFeatureSerializationStructure(EStructuralFeature eStructuralFeature) {
-		return getXMLPersistenceMappingExtendedMetaData(eStructuralFeature).getFeatureSerializationStructure();
-	}
-
-	public void setFeatureSerializationStructure(EStructuralFeature eStructuralFeature, int serializationStructure) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public EClassifier getTypeByXMLName(String namespace, String xmlName) {
-		EPackage ePackage = getPackage(namespace);
-		return ePackage == null ? null : getTypeByXMLName(ePackage, xmlName);
-	}
-
-	public EClassifier getTypeByXMLName(String namespace, String xmlName, EStructuralFeature feature) {
-		EPackage ePackage = getPackage(namespace);
-		return ePackage == null ? null : getTypeByXMLName(ePackage, xmlName, feature);
-	}
-
-	public EClassifier getTypeByXMLWrapperName(String namespace, String xmlWrapperName) {
-		EPackage ePackage = getPackage(namespace);
-		return ePackage == null ? null : getTypeByXMLWrapperName(ePackage, xmlWrapperName);
-	}
-
-	public EClassifier getTypeByXMLName(EPackage ePackage, String xmlName) {
-		return getXMLPersistenceMappingExtendedMetaData(ePackage).getType(xmlName);
-	}
-
-	public EClassifier getTypeByXMLName(EPackage ePackage, String xmlName, EStructuralFeature feature) {
-		return getXMLPersistenceMappingExtendedMetaData(ePackage).getType(xmlName, feature);
-	}
-
-	public EClassifier getTypeByXMLWrapperName(EPackage ePackage, String xmlWrapperName) {
-		return getXMLPersistenceMappingExtendedMetaData(ePackage).getTypeByWrapperName(xmlWrapperName);
-	}
-
-	@Override
-	public EPackage getPackage(String namespace) {
-		EPackage ePackage = registry.getEPackage(namespace);
-		return ePackage;
-	}
-
-	public EStructuralFeature getFeatureByXMLElementName(EClass eClass, String namespace, String xmlElementName) {
-		return getXMLPersistenceMappingExtendedMetaData(eClass).getFeatureByXMLElementName(namespace, xmlElementName);
-	}
-
-	protected boolean basicIsXMLPersistenceMappingEnabled(EStructuralFeature eStructuralFeature) {
-		return null != getRMFAnnotation(eStructuralFeature, false);
-	}
-
-	protected String basicGetWrapperName(EClassifier eClassifier) {
-		EAnnotation eAnnotation = getRMFAnnotation(eClassifier, false);
-		String result = null;
-		if (eAnnotation != null) {
-			result = eAnnotation.getDetails().get(WRAPPER_NAME);
-		}
-		if (null == result) {
-			result = basicGetName(eClassifier) + PLURAL_EXTENSION;
-		}
-		return result;
-	}
-
-	protected String basicGetWrapperName(EStructuralFeature eStructuralFeature) {
-		EAnnotation eAnnotation = getRMFAnnotation(eStructuralFeature, false);
-		String result = null;
-		if (eAnnotation != null) {
-			result = eAnnotation.getDetails().get(WRAPPER_NAME);
-		}
-		if (null == result) {
-			result = basicGetName(eStructuralFeature) + PLURAL_EXTENSION;
-		}
-		return result;
-	}
-
-	protected String basicGetClassifierNameSuffix(EStructuralFeature eStructuralFeature) {
-		EAnnotation eAnnotation = getRMFAnnotation(eStructuralFeature, false);
-		String result = null;
-		if (eAnnotation != null) {
-			result = eAnnotation.getDetails().get(CLASSIFIER_NAME_SUFFIX);
-		}
-		if (null == result) {
-			result = ""; //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	/**
-	 * @param eStructuralFeature
-	 * @return #SERILIZATION_STRUCTURE__UNDDEFINED, if no annotation is defined
-	 */
-	protected int basicGetFeatureSerializationStructure(EStructuralFeature eStructuralFeature) {
-		EAnnotation eAnnotation = getRMFAnnotation(eStructuralFeature, false);
-		if (eAnnotation != null) {
-			String featureWrapperElement = eAnnotation.getDetails().get(FEATURE_WRAPPER_ELEMENT);
-			String featureElement = eAnnotation.getDetails().get(FEATURE_ELEMENT);
-			String classifierWrapperElement = eAnnotation.getDetails().get(CLASSIFIER_WRAPPER_ELEMENT);
-			String classifierElement = eAnnotation.getDetails().get(CLASSIFIER_ELEMENT);
-
-			int result = 0;
-			if (null == featureWrapperElement || Boolean.parseBoolean(featureWrapperElement)) {
-				// if not explicitly set to false, the feature wrapper element is created
-				result += FEATURE_WRAPPER_ELEMENT_MASK;
-			}
-
-			if (Boolean.parseBoolean(featureElement)) {
-				// if explicitly set to true, the feature element is created
-				result += FEATURE_ELEMENT_MASK;
-			}
-
-			if (Boolean.parseBoolean(classifierWrapperElement)) {
-				// if explicitly set to true, the classifier wrapper element is created
-				result += CLASSIFIER_WRAPPER_ELEMENT_MASK;
-			}
-
-			if (null == classifierWrapperElement || Boolean.parseBoolean(classifierElement)) {
-				// if not explicitly set to false, the classifier element is created
-				result += CLASSIFIER_ELEMENT_MASK;
-			}
-
-			return fallbackSerializationConfiguration[result];
-
-		} else {
-			// default to standard EMF serialization
-			return SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT;
-		}
-	}
-
-	protected XMLPersistenceMappingEStructuralFeatureExtendedMetaData getXMLPersistenceMappingExtendedMetaData(EStructuralFeature eStructuralFeature) {
-		XMLPersistenceMappingEStructuralFeatureExtendedMetaData result = (XMLPersistenceMappingEStructuralFeatureExtendedMetaData) extendedMetaDataCache
-				.get(eStructuralFeature);
-		if (result == null) {
-			extendedMetaDataCache.put(eStructuralFeature, result = createRMFEStructuralFeatureExtendedMetaData(eStructuralFeature));
-		}
-		return result;
-	}
-
-	protected XMLPersistenceMappingEClassifierExtendedMetaData getXMLPersistenceMappingExtendedMetaData(EClassifier eClassifier) {
-		XMLPersistenceMappingEClassifierExtendedMetaData result = (XMLPersistenceMappingEClassifierExtendedMetaData) extendedMetaDataCache
-				.get(eClassifier);
-		if (result == null) {
-			extendedMetaDataCache.put(eClassifier, result = createRMFEClassifierExtendedMetaData(eClassifier));
-		}
-		return result;
-	}
-
-	protected XMLPersistenceMappingEPackageExtendedMetaData getXMLPersistenceMappingExtendedMetaData(EPackage ePackage) {
-		XMLPersistenceMappingEPackageExtendedMetaData result = (XMLPersistenceMappingEPackageExtendedMetaData) extendedMetaDataCache.get(ePackage);
-		if (result == null) {
-			extendedMetaDataCache.put(ePackage, result = createRMFEPackageExtendedMetaData(ePackage));
-		}
-		return result;
-	}
-
-	protected XMLPersistenceMappingEStructuralFeatureExtendedMetaData createRMFEStructuralFeatureExtendedMetaData(
-			EStructuralFeature eStructuralFeature) {
-		return new XMLPersistenceMappingEStructuralFeatureExtendedMetaDataImpl(eStructuralFeature);
-	}
-
-	protected XMLPersistenceMappingEClassifierExtendedMetaData createRMFEClassifierExtendedMetaData(EClassifier eClassifier) {
-		if (eClassifier instanceof EClass) {
-			return new XMLPersistenceMappingEClassExtendedMetaDataImpl(eClassifier);
-		} else {
-			return new XMLPersistenceMappingEDataTypeExtendedMetaDataImpl(eClassifier);
-		}
-	}
-
-	protected XMLPersistenceMappingEPackageExtendedMetaData createRMFEPackageExtendedMetaData(EPackage ePackage) {
-		return new XMLPersistenceMappingEPackageExtendedMetaDataImpl(ePackage);
-	}
-
-	protected EAnnotation getRMFAnnotation(EModelElement eModelElement, boolean demandCreate) {
-		EAnnotation result = annotationCache.get(eModelElement);
-		if (result == null) {
-			result = eModelElement.getEAnnotation(XML_PERSISTENCE_MAPPING_ANNOTATION_SOURCE_URI);
-		}
-		if (result == null && demandCreate) {
-			result = EcoreFactory.eINSTANCE.createEAnnotation();
-			result.setSource(XML_PERSISTENCE_MAPPING_ANNOTATION_SOURCE_URI);
-			annotationCache.put(eModelElement, result);
-		}
-		return result;
-	}
-
-	protected boolean isIdentifiedByFeatureWrapper(EStructuralFeature feature) {
-		int featureSerializationStructure = getXMLPersistenceMappingExtendedMetaData(feature).getFeatureSerializationStructure();
-		return FEATURE_WRAPPER_ELEMENT_MASK == (featureSerializationStructure & FEATURE_WRAPPER_ELEMENT_MASK);
-	}
-
-	protected boolean isIdentifiedByFeature(EStructuralFeature feature) {
-		int featureSerializationStructure = getXMLPersistenceMappingExtendedMetaData(feature).getFeatureSerializationStructure();
-		return FEATURE_ELEMENT_MASK == (featureSerializationStructure & (FEATURE_WRAPPER_ELEMENT_MASK | FEATURE_ELEMENT_MASK));
-	}
-
-	protected boolean isIdentifiedByClassifierWrapper(EStructuralFeature feature) {
-		int featureSerializationStructure = getXMLPersistenceMappingExtendedMetaData(feature).getFeatureSerializationStructure();
-		return CLASSIFIER_WRAPPER_ELEMENT_MASK == (featureSerializationStructure & (FEATURE_WRAPPER_ELEMENT_MASK | FEATURE_ELEMENT_MASK | CLASSIFIER_WRAPPER_ELEMENT_MASK));
-	}
-
-	protected boolean isIdentifiedByClassifier(EStructuralFeature feature) {
-		int featureSerializationStructure = getXMLPersistenceMappingExtendedMetaData(feature).getFeatureSerializationStructure();
-		return CLASSIFIER_ELEMENT_MASK == featureSerializationStructure;
-	}
-
-	protected boolean isNone(EStructuralFeature feature) {
-		int featureSerializationStructure = getXMLPersistenceMappingExtendedMetaData(feature).getFeatureSerializationStructure();
-		return 0 == featureSerializationStructure;
-	}
-
-	protected boolean isEReference_Contained0000(EStructuralFeature feature) {
-		boolean isEReference_Contained0000;
-		if (feature instanceof EReference) {
-			EReference reference = (EReference) feature;
-			if (reference.isContainment()) {
-				isEReference_Contained0000 = isNone(feature);
-			} else {
-				isEReference_Contained0000 = false;
-			}
-		} else {
-			isEReference_Contained0000 = false;
-		}
-		return isEReference_Contained0000;
-	}
-
-}
diff --git a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingResource.java b/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingResource.java
deleted file mode 100644
index d2404a4..0000000
--- a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingResource.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *   itemis AG - initial API and implementation
- */
-package org.eclipse.rmf.serialization;
-
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-public interface XMLPersistenceMappingResource extends XMLResource {
-
-	/**
-	 * This option allows you to tailor the XML serialization of objects. You should provide an RMFExtendedMetaData as
-	 * the value of this option.
-	 * 
-	 * @see org.eclipse.rmf.serialization.RMFExtendedMetaData
-	 */
-	public static final String HREF = "_href"; //$NON-NLS-1$
-	public static final String OPTION_PROGRESS_MONITOR = "progress monitor"; //$NON-NLS-1$
-	public static final String OPTION_NAMEPSACE_TO_PREFIX_MAP = "namespace to prefix map"; //$NON-NLS-1$
-
-}
diff --git a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingResourceFactoryImpl.java b/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingResourceFactoryImpl.java
deleted file mode 100644
index aba5644..0000000
--- a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingResourceFactoryImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *   itemis AG - initial API and implementation
- */
-package org.eclipse.rmf.serialization;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
-
-/**
- * <!-- begin-user-doc --> The <b>Resource Factory</b> associated with the package. <!-- end-user-doc -->
- * 
- * @see org.eclipse.rmf.reqif10.util.Reqif10ResourceImpl
- * @generated
- */
-public class XMLPersistenceMappingResourceFactoryImpl extends ResourceFactoryImpl {
-	/**
-	 * Creates an instance of the resource factory. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public XMLPersistenceMappingResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 */
-	@Override
-	public Resource createResource(URI uri) {
-		Resource result = new XMLPersistenceMappingResourceImpl(uri);
-		return result;
-	}
-
-} // RMFResourceFactoryImpl
diff --git a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingResourceImpl.java b/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingResourceImpl.java
deleted file mode 100644
index 6ea3cac..0000000
--- a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingResourceImpl.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *   itemis AG - initial API and implementation
- */
-package org.eclipse.rmf.serialization;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.xml.XMLConstants;
-
-import org.apache.xerces.impl.Constants;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.XMLLoad;
-import org.eclipse.emf.ecore.xmi.XMLOptions;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.XMLSave;
-import org.eclipse.emf.ecore.xmi.impl.XMLOptionsImpl;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-import org.eclipse.rmf.internal.serialization.XMLPersistenceMappingHelperImpl;
-import org.eclipse.rmf.internal.serialization.XMLPersistenceMappingLoadImpl;
-import org.eclipse.rmf.internal.serialization.XMLPersistenceMappingSaveImpl;
-
-public class XMLPersistenceMappingResourceImpl extends XMLResourceImpl implements XMLPersistenceMappingResource {
-	// TODO: let implementation get the value from preferences and set it to false by default
-	// This is a temporal HACK
-	public boolean enableSchemaValidation = false;
-	protected Collection<EPackage> createIdForPackages;
-
-	class ResourceHandlerImpl implements ResourceHandler {
-
-		ResourceHandlerImpl(Resource resource) {
-			super();
-		}
-
-		public void preLoad(XMLResource resource, InputStream inputStream, Map<?, ?> options) {
-			// NOP
-		}
-
-		public void postLoad(XMLResource resource, InputStream inputStream, Map<?, ?> options) {
-			// NOP
-		}
-
-		public void preSave(XMLResource resource, OutputStream outputStream, Map<?, ?> options) {
-			// NOP
-
-		}
-
-		public void postSave(XMLResource resource, OutputStream outputStream, Map<?, ?> options) {
-			// NOP
-
-		}
-
-	}
-
-	public XMLPersistenceMappingResourceImpl() {
-		super();
-		initDefaultOptions();
-	}
-
-	public XMLPersistenceMappingResourceImpl(URI uri) {
-		super(uri);
-		initDefaultOptions();
-	}
-
-	@Override
-	protected XMLHelper createXMLHelper() {
-		return new XMLPersistenceMappingHelperImpl(this);
-	}
-
-	@Override
-	protected XMLLoad createXMLLoad() {
-		return new XMLPersistenceMappingLoadImpl(createXMLHelper());
-	}
-
-	@Override
-	protected XMLSave createXMLSave() {
-		return new XMLPersistenceMappingSaveImpl(createXMLHelper());
-	}
-
-	@Override
-	public void save(Map<?, ?> options) throws IOException {
-		super.save(options);
-	}
-
-	@Override
-	public EObject getEObject(String uriFragment) {
-		EObject object = getEObjectByID(uriFragment);
-		if (null == object) {
-			object = super.getEObject(uriFragment);
-		}
-		return object;
-	}
-
-	/**
-	 * Initializes the resource. Is called by the constructors of XMLResourceImpl
-	 */
-	@Override
-	protected void init() {
-		encoding = "UTF-8"; //$NON-NLS-1$
-		xmlVersion = "1.0"; //$NON-NLS-1$
-
-	}
-
-	public void initDefaultOptions() {
-		ResourceHandler resourceHandler = new ResourceHandlerImpl(this);
-		// ========= default save options ===================
-		Map<Object, Object> saveOptions = getDefaultSaveOptions();
-		// set encoding to UTF-8
-		saveOptions.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
-		// get XML names and attribute/value information from extended metadata
-		saveOptions.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-
-		// make sure to write the <?xml version="1.0" encoding="UTF-8"?> header
-		saveOptions.put(XMLResource.OPTION_DECLARE_XML, Boolean.TRUE);
-
-		saveOptions.put(XMLResource.OPTION_SAVE_TYPE_INFORMATION, Boolean.FALSE);
-
-		saveOptions.put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.FALSE);
-
-		saveOptions.put(XMLResource.OPTION_RESOURCE_HANDLER, resourceHandler);
-
-		// ========= default load options ===================
-		Map<Object, Object> loadOptions = getDefaultLoadOptions();
-		// get XML names and attribute/value information from extended metadata
-		loadOptions.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-
-		// comments and CDATA will be preserved in any mixed text processing. Required to support extensions
-		loadOptions.put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
-		// Improve deserialization performance
-		loadOptions.put(XMLResource.OPTION_USE_DEPRECATED_METHODS, Boolean.FALSE);
-		// avoids creation of href attributes for non containment references
-		loadOptions.put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-
-		// options for handling unknown tool extensions
-		loadOptions.put(XMLResource.OPTION_RECORD_ANY_TYPE_NAMESPACE_DECLARATIONS, Boolean.TRUE);
-		loadOptions.put(XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.FALSE);
-
-		// Performance enhancement
-		loadOptions.put(XMLResource.OPTION_DEFER_IDREF_RESOLUTION, Boolean.TRUE);
-
-		loadOptions.put(XMLResource.OPTION_RESOURCE_HANDLER, resourceHandler);
-
-		// defer attachment of object tree created during load to end of load process.
-		// this creating notifications by EContentAdapters that might be registered for the resource or resource set
-		// during load
-		loadOptions.put(XMLResource.OPTION_DEFER_ATTACHMENT, Boolean.TRUE);
-
-		// Retrieve application-defined XMLReader features (see http://xerces.apache.org/xerces2-j/features.html for
-		// available features and their details)
-		Map<String, Boolean> parserFeatures = new HashMap<String, Boolean>();
-
-		// Retrieve application-defined XMLReader properties (see http://xerces.apache.org/xerces2-j/properties.html
-		// for available properties and their details)
-		Map<String, Object> parserProperties = new HashMap<String, Object>();
-
-		parserProperties.put(Constants.XERCES_PROPERTY_PREFIX + Constants.BUFFER_SIZE_PROPERTY, 1024 * 8);
-
-		// Perform namespace processing (prefixes will be stripped off element and attribute names and replaced with the
-		// corresponding namespace URIs) but do not report attributes used for namespace declarations, and do not report
-		// original prefixed names
-		parserFeatures.put(Constants.SAX_FEATURE_PREFIX + Constants.NAMESPACES_FEATURE, true);
-		parserFeatures.put(Constants.SAX_FEATURE_PREFIX + Constants.NAMESPACE_PREFIXES_FEATURE, false);
-
-		if (enableSchemaValidation) {
-			parserFeatures.put(Constants.SAX_FEATURE_PREFIX + Constants.VALIDATION_FEATURE, true);
-			parserFeatures.put(Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_VALIDATION_FEATURE, true);
-			parserProperties.put(Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_LANGUAGE, XMLConstants.W3C_XML_SCHEMA_NS_URI);
-			parserProperties.put(Constants.XERCES_PROPERTY_PREFIX + Constants.SCHEMA_LOCATION,
-					"http://www.omg.org/spec/ReqIF/20110401/reqif.xsd reqif.xsd");
-		}
-
-		loadOptions.put(XMLResource.OPTION_PARSER_FEATURES, parserFeatures);
-		loadOptions.put(XMLResource.OPTION_PARSER_PROPERTIES, parserProperties);
-
-		XMLOptions xmlOptions = new XMLOptionsImpl();
-
-		xmlOptions.setProcessAnyXML(true);
-
-		// xmlOptions.setProcessSchemaLocations(true);
-
-		loadOptions.put(XMLResource.OPTION_XML_OPTIONS, xmlOptions);
-	}
-
-}
diff --git a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingResourceSetImpl.java b/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingResourceSetImpl.java
deleted file mode 100644
index 0a70306..0000000
--- a/org.eclipse.rmf.serialization/src/org/eclipse/rmf/serialization/XMLPersistenceMappingResourceSetImpl.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Copyright (c) 2013 itemis AG 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:
- *   itemis AG - initial API and implementation
- */
-package org.eclipse.rmf.serialization;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-
-public class XMLPersistenceMappingResourceSetImpl extends ResourceSetImpl {
-
-	/**
-	 * Tools that need to follow the progress may store an {@link IProgressMonitor} in {@link #getLoadOptions()}, using
-	 * this constant as the key.
-	 */
-	public static final String PROGRESS_MONITOR = "PROGRESS_MONITOR"; //$NON-NLS-1$
-
-	@Override
-	/**
-	 * ReqIF doesn't contain any information about the resource where to find an object with a given ID.
-	 * Since most references are expected to be references to objects within the same file, we first search in the resource that contained the reference.
-	 * If the referenced object is not found, then the search continues in all other resources that are contained in the resource set.
-	 * 
-	 * In order to map this behavior to the standard EMF proxy resolution mechanism the 
-	 * URI of the resource that contains the reference is added to the reference by default during deserialization.
-	 * 
-	 * This allows using the ReqIFResourceImpl in a standard EMF resource set if no cross resource links need to be resolved.
-	 */
-	public EObject getEObject(URI uri, boolean loadOnDemand) {
-		EObject eObject = null;
-		// first try to find the object in the resource that contained the reference using the standard EMF proxy
-		// resolution strategy
-
-		eObject = super.getEObject(uri, loadOnDemand);
-
-		// if the eObject was not found: continue searching in all other resources
-		if (null == eObject) {
-			Resource sourceResource = getResource(uri.trimFragment(), loadOnDemand);
-			for (Resource resource : getResources()) {
-				if (resource != sourceResource) {
-					eObject = resource.getEObject(uri.fragment());
-					if (null != eObject) {
-						break;
-					}
-				}
-			}
-		}
-
-		return eObject;
-	}
-
-}
diff --git a/org.eclipse.rmf.tests.ext.prostep/META-INF/MANIFEST.MF b/org.eclipse.rmf.tests.ext.prostep/META-INF/MANIFEST.MF
index a1e5461..ea4161f 100644
--- a/org.eclipse.rmf.tests.ext.prostep/META-INF/MANIFEST.MF
+++ b/org.eclipse.rmf.tests.ext.prostep/META-INF/MANIFEST.MF
@@ -12,4 +12,4 @@
  org.eclipse.rmf.reqif10.serialization;bundle-version="0.12.0",
  org.eclipse.rmf.tests.reqif10.serialization;bundle-version="0.12.0",
  org.eclipse.rmf.tests.reqif10.serialization,
- org.eclipse.rmf.serialization
+ org.eclipse.sphinx.emf.serialization;bundle-version="0.8.1"
diff --git a/org.eclipse.rmf.tests.ext.prostep/src/org/eclipse/rmf/tests/ext/prostep/serializaion/SerializationTests.java b/org.eclipse.rmf.tests.ext.prostep/src/org/eclipse/rmf/tests/ext/prostep/serializaion/SerializationTests.java
index 76b5376..2deb483 100644
--- a/org.eclipse.rmf.tests.ext.prostep/src/org/eclipse/rmf/tests/ext/prostep/serializaion/SerializationTests.java
+++ b/org.eclipse.rmf.tests.ext.prostep/src/org/eclipse/rmf/tests/ext/prostep/serializaion/SerializationTests.java
@@ -15,7 +15,7 @@
 import org.eclipse.rmf.reqif10.ReqIF10Package;
 import org.eclipse.rmf.reqif10.common.util.ReqIFToolExtensionUtil;
 import org.eclipse.rmf.reqif10.serialization.ReqIF10ResourceFactoryImpl;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceSetImpl;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceSetImpl;
 import org.eclipse.rmf.tests.reqif10.serialization.util.AbstractTestCase;
 import org.junit.Assert;
 import org.junit.BeforeClass;
diff --git a/org.eclipse.rmf.tests.reqif10.serialization/META-INF/MANIFEST.MF b/org.eclipse.rmf.tests.reqif10.serialization/META-INF/MANIFEST.MF
index 52176e8..4807baf 100644
--- a/org.eclipse.rmf.tests.reqif10.serialization/META-INF/MANIFEST.MF
+++ b/org.eclipse.rmf.tests.reqif10.serialization/META-INF/MANIFEST.MF
@@ -9,8 +9,8 @@
  org.eclipse.rmf.reqif10.xhtml,
  org.eclipse.rmf.reqif10;bundle-version="0.9.0",
  org.eclipse.rmf.reqif10.serialization;bundle-version="0.9.0",
- org.eclipse.rmf.serialization;bundle-version="0.9.0",
- org.eclipse.rmf.reqif10.common;bundle-version="0.12.0"
+ org.eclipse.rmf.reqif10.common;bundle-version="0.12.0",
+ org.eclipse.sphinx.emf.serialization;bundle-version="0.8.1"
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
 Export-Package: org.eclipse.rmf.tests.reqif10.serialization.model.tool
diff --git a/org.eclipse.rmf.tests.reqif10.serialization/input/SimpleReqIFWithUnknowToolExtensions.reqif b/org.eclipse.rmf.tests.reqif10.serialization/input/SimpleReqIFWithUnknowToolExtensions.reqif
new file mode 100644
index 0000000..a329433
--- /dev/null
+++ b/org.eclipse.rmf.tests.reqif10.serialization/input/SimpleReqIFWithUnknowToolExtensions.reqif
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<REQ-IF xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd" xmlns:configuration="http://eclipse.org/notExistingURL">
+  <THE-HEADER>
+    <REQ-IF-HEADER IDENTIFIER="identifier">
+      <CREATION-TIME>2013-08-13T16:58:30.965+02:00</CREATION-TIME>
+      <REQ-IF-TOOL-ID>RMF - Requirements Modeling Framework (http://www.eclipse.org/rmf)</REQ-IF-TOOL-ID>
+      <REQ-IF-VERSION>1.0</REQ-IF-VERSION>
+      <SOURCE-TOOL-ID>RMF - Requirements Modeling Framework (http://www.eclipse.org/rmf)</SOURCE-TOOL-ID>
+      <TITLE>Unregistered Tool Extension</TITLE>
+    </REQ-IF-HEADER>
+  </THE-HEADER>
+  <CORE-CONTENT>
+       <REQ-IF-CONTENT>
+       </REQ-IF-CONTENT>
+  </CORE-CONTENT>
+  <TOOL-EXTENSIONS>
+      <REQ-IF-TOOL-EXTENSION>
+      <configuration:UnknownToolExtension>
+      </configuration:UnknownToolExtension>
+    </REQ-IF-TOOL-EXTENSION>
+  </TOOL-EXTENSIONS>
+</REQ-IF>
diff --git a/org.eclipse.rmf.tests.reqif10.serialization/src/org/eclipse/rmf/tests/reqif10/serialization/util/AbstractTestCase.java b/org.eclipse.rmf.tests.reqif10.serialization/src/org/eclipse/rmf/tests/reqif10/serialization/util/AbstractTestCase.java
index e11cf1d..a275b63 100644
--- a/org.eclipse.rmf.tests.reqif10.serialization/src/org/eclipse/rmf/tests/reqif10/serialization/util/AbstractTestCase.java
+++ b/org.eclipse.rmf.tests.reqif10.serialization/src/org/eclipse/rmf/tests/reqif10/serialization/util/AbstractTestCase.java
@@ -60,9 +60,9 @@
 import org.eclipse.rmf.reqif10.serialization.ReqIF10ResourceFactoryImpl;
 import org.eclipse.rmf.reqif10.serialization.ReqIF10ResourceImpl;
 import org.eclipse.rmf.reqif10.xhtml.XhtmlPackage;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResource;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceImpl;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceSetImpl;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResource;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceImpl;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceSetImpl;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.w3c.dom.ls.LSInput;
diff --git a/org.eclipse.rmf.tests.serialization/META-INF/MANIFEST.MF b/org.eclipse.rmf.tests.serialization/META-INF/MANIFEST.MF
index 766139b..405b8f6 100644
--- a/org.eclipse.rmf.tests.serialization/META-INF/MANIFEST.MF
+++ b/org.eclipse.rmf.tests.serialization/META-INF/MANIFEST.MF
@@ -9,8 +9,8 @@
  org.eclipse.emf.ecore.xmi;bundle-version="2.7.0",
  org.eclipse.xsd;bundle-version="2.7.1",
  org.apache.xerces;bundle-version="2.9.0",
- org.eclipse.rmf.serialization;bundle-version="0.9.0",
- org.eclipse.core.runtime;bundle-version="3.6.0"
+ org.eclipse.core.runtime;bundle-version="3.6.0",
+ org.eclipse.sphinx.emf.serialization;bundle-version="0.8.1"
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/adapter/IDAdapterTests.java b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/adapter/IDAdapterTests.java
index 73c5de8..d20a340 100644
--- a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/adapter/IDAdapterTests.java
+++ b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/adapter/IDAdapterTests.java
@@ -22,13 +22,13 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResource;
 import org.eclipse.rmf.tests.serialization.model.nodes.Node;
 import org.eclipse.rmf.tests.serialization.model.nodes.NodesFactory;
 import org.eclipse.rmf.tests.serialization.model.nodes.NodesPackage;
 import org.eclipse.rmf.tests.serialization.model.nodes.serialization.NodesResourceFactoryImpl;
 import org.eclipse.rmf.tests.serialization.model.nodes.serialization.NodesResourceImpl;
 import org.eclipse.rmf.tests.serialization.util.AbstractTestCase;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResource;
 import org.junit.Before;
 import org.junit.Test;
 
diff --git a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/load/BasicLoadTests.java b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/load/BasicLoadTests.java
index 0b77b17..a16bcc5 100644
--- a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/load/BasicLoadTests.java
+++ b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/load/BasicLoadTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *   itemis AG - initial API and implementation
  */
@@ -21,11 +21,11 @@
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.EReference;
 import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceFactoryImpl;
 import org.eclipse.rmf.tests.serialization.model.nodes.Node;
 import org.eclipse.rmf.tests.serialization.model.nodes.NodesPackage;
 import org.eclipse.rmf.tests.serialization.model.nodes.SubNode;
 import org.eclipse.rmf.tests.serialization.util.AbstractTestCase;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceFactoryImpl;
 import org.junit.Before;
 import org.junit.Test;
 
diff --git a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/load/FoereignNamespaceLoadTests.java b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/load/FoereignNamespaceLoadTests.java
index 4c56d7a..6e78362 100644
--- a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/load/FoereignNamespaceLoadTests.java
+++ b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/load/FoereignNamespaceLoadTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *   itemis AG - initial API and implementation
  */
@@ -22,14 +22,14 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.EcorePackage;
 import org.eclipse.emf.ecore.xml.type.AnyType;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceFactoryImpl;
 import org.eclipse.rmf.tests.serialization.model.nodes.Node;
 import org.eclipse.rmf.tests.serialization.model.nodes.NodesPackage;
 import org.eclipse.rmf.tests.serialization.util.AbstractTestCase;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceFactoryImpl;
 import org.junit.Before;
 import org.junit.Test;
 
-// Junit 3.8 test 
+// Junit 3.8 test
 @SuppressWarnings("nls")
 public class FoereignNamespaceLoadTests extends AbstractTestCase {
 
diff --git a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/metadata/XMLPersistenceExtendedMetaDataTests.java b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/metadata/XMLPersistenceExtendedMetaDataTests.java
index a3fa2ff..7861d31 100644
--- a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/metadata/XMLPersistenceExtendedMetaDataTests.java
+++ b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/metadata/XMLPersistenceExtendedMetaDataTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *   itemis AG - initial API and implementation
  */
@@ -19,9 +19,9 @@
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingExtendedMetaData;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingExtendedMetaDataImpl;
 import org.eclipse.rmf.tests.serialization.model.nodes.NodesPackage;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingExtendedMetaData;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingExtendedMetaDataImpl;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -53,7 +53,7 @@
 			EStructuralFeature feature = nodeEClass.getEStructuralFeature(featureName);
 			assertNotNull("EReference '" + featureName + "' not found", feature);
 
-			int featureSerializationStructure = metadata.getFeatureSerializationStructure(feature);
+			int featureSerializationStructure = metadata.getXMLPersistenceMappingStrategy(feature);
 			assertSame(i, featureSerializationStructure);
 		}
 	}
@@ -68,7 +68,7 @@
 			EStructuralFeature feature = nodeEClass.getEStructuralFeature(featureName);
 			assertNotNull("EReference '" + featureName + "' not found", feature);
 
-			int featureSerializationStructure = metadata.getFeatureSerializationStructure(feature);
+			int featureSerializationStructure = metadata.getXMLPersistenceMappingStrategy(feature);
 			assertSame(i, featureSerializationStructure);
 		}
 	}
@@ -83,7 +83,7 @@
 			EStructuralFeature feature = nodeEClass.getEStructuralFeature(featureName);
 			assertNotNull("EReference '" + featureName + "' not found", feature);
 
-			int featureSerializationStructure = metadata.getFeatureSerializationStructure(feature);
+			int featureSerializationStructure = metadata.getXMLPersistenceMappingStrategy(feature);
 			assertSame(i, featureSerializationStructure);
 		}
 	}
@@ -98,7 +98,7 @@
 			EStructuralFeature feature = nodeEClass.getEStructuralFeature(featureName);
 			assertNotNull("EReference '" + featureName + "' not found", feature);
 
-			int featureSerializationStructure = metadata.getFeatureSerializationStructure(feature);
+			int featureSerializationStructure = metadata.getXMLPersistenceMappingStrategy(feature);
 			assertSame(i, featureSerializationStructure);
 		}
 	}
@@ -113,7 +113,7 @@
 			EStructuralFeature feature = nodeEClass.getEStructuralFeature(featureName);
 			assertNotNull("EAttribute '" + featureName + "' not found", feature);
 
-			int featureSerializationStructure = metadata.getFeatureSerializationStructure(feature);
+			int featureSerializationStructure = metadata.getXMLPersistenceMappingStrategy(feature);
 			assertSame(i, featureSerializationStructure);
 		}
 	}
@@ -128,7 +128,7 @@
 			EStructuralFeature feature = nodeEClass.getEStructuralFeature(featureName);
 			assertNotNull("Attribute '" + featureName + "' not found", feature);
 
-			int featureSerializationStructure = metadata.getFeatureSerializationStructure(feature);
+			int featureSerializationStructure = metadata.getXMLPersistenceMappingStrategy(feature);
 			assertSame(i, featureSerializationStructure);
 		}
 	}
@@ -138,8 +138,8 @@
 		XMLPersistenceMappingExtendedMetaData metadata = new XMLPersistenceMappingExtendedMetaDataImpl(identitySerializationStructureConfiguration);
 
 		EStructuralFeature feature = NodesPackage.eINSTANCE.getNode_EReference_EmptyAnnotationSingle();
-		int featureSerializationStructure = metadata.getFeatureSerializationStructure(feature);
-		assertSame(XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT,
+		int featureSerializationStructure = metadata.getXMLPersistenceMappingStrategy(feature);
+		assertSame(XMLPersistenceMappingExtendedMetaData.XML_PERSISTENCE_MAPPING_STRATEGY__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT,
 				featureSerializationStructure);
 	}
 
@@ -148,9 +148,9 @@
 		XMLPersistenceMappingExtendedMetaData metadata = new XMLPersistenceMappingExtendedMetaDataImpl(identitySerializationStructureConfiguration);
 
 		EStructuralFeature feature = NodesPackage.eINSTANCE.getNode_EReference_NoAnnotationSingle();
-		int featureSerializationStructure = metadata.getFeatureSerializationStructure(feature);
+		int featureSerializationStructure = metadata.getXMLPersistenceMappingStrategy(feature);
 		// assume standard EMF serialization if not specified explicitly
-		assertSame(XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT, featureSerializationStructure);
+		assertSame(XMLPersistenceMappingExtendedMetaData.XML_PERSISTENCE_MAPPING_STRATEGY__0100__FEATURE_ELEMENT, featureSerializationStructure);
 	}
 
 	@Test
@@ -158,8 +158,8 @@
 		XMLPersistenceMappingExtendedMetaData metadata = new XMLPersistenceMappingExtendedMetaDataImpl(identitySerializationStructureConfiguration);
 
 		EStructuralFeature feature = NodesPackage.eINSTANCE.getNode_EReference_EmptyAnnotationMany();
-		int featureSerializationStructure = metadata.getFeatureSerializationStructure(feature);
-		assertSame(XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT,
+		int featureSerializationStructure = metadata.getXMLPersistenceMappingStrategy(feature);
+		assertSame(XMLPersistenceMappingExtendedMetaData.XML_PERSISTENCE_MAPPING_STRATEGY__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT,
 				featureSerializationStructure);
 	}
 
@@ -168,9 +168,9 @@
 		XMLPersistenceMappingExtendedMetaData metadata = new XMLPersistenceMappingExtendedMetaDataImpl(identitySerializationStructureConfiguration);
 
 		EStructuralFeature feature = NodesPackage.eINSTANCE.getNode_EReference_NoAnnotationMany();
-		int featureSerializationStructure = metadata.getFeatureSerializationStructure(feature);
+		int featureSerializationStructure = metadata.getXMLPersistenceMappingStrategy(feature);
 		// use default: standard emf serialization structure
-		assertSame(XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT, featureSerializationStructure);
+		assertSame(XMLPersistenceMappingExtendedMetaData.XML_PERSISTENCE_MAPPING_STRATEGY__0100__FEATURE_ELEMENT, featureSerializationStructure);
 	}
 
 	@Test
diff --git a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/model/nodes/serialization/NodesResourceFactoryImpl.java b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/model/nodes/serialization/NodesResourceFactoryImpl.java
index 41f8a65..b6ff8e9 100644
--- a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/model/nodes/serialization/NodesResourceFactoryImpl.java
+++ b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/model/nodes/serialization/NodesResourceFactoryImpl.java
@@ -12,7 +12,7 @@
 
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceFactoryImpl;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceFactoryImpl;
 
 public class NodesResourceFactoryImpl extends XMLPersistenceMappingResourceFactoryImpl {
 	@Override
diff --git a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/model/nodes/serialization/NodesResourceImpl.java b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/model/nodes/serialization/NodesResourceImpl.java
index 2851b5e..11dd374 100644
--- a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/model/nodes/serialization/NodesResourceImpl.java
+++ b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/model/nodes/serialization/NodesResourceImpl.java
@@ -18,8 +18,8 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.xmi.XMLResource;
 import org.eclipse.emf.ecore.xmi.impl.XMLMapImpl;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceImpl;
 import org.eclipse.rmf.tests.serialization.model.nodes.NodesPackage;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceImpl;
 
 public class NodesResourceImpl extends XMLPersistenceMappingResourceImpl {
 
@@ -51,7 +51,7 @@
 
 	/**
 	 * Return <code>true</code>.
-	 * 
+	 *
 	 * @return <code>true</code>.
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#useUUIDs()
 	 */
@@ -62,7 +62,7 @@
 
 	/**
 	 * Return <code>true</code>.
-	 * 
+	 *
 	 * @return <code>true</code>.
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#assignIDsWhileLoading()
 	 */
@@ -75,7 +75,7 @@
 	 * Sets the ID of the object. The default implementation will update the {@link #eObjectToIDMap}. This behavior is
 	 * override to set the ID in a object's specific attribute to set the id in the
 	 * {@link Identifiable#setIdentifier(String)} and call the super method.
-	 * 
+	 *
 	 * @param eObject
 	 *            : The object where the Id must be set.
 	 * @param id
diff --git a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/monitor/ProgressMonitorTests.java b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/monitor/ProgressMonitorTests.java
index 9569d84..37c401c 100644
--- a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/monitor/ProgressMonitorTests.java
+++ b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/monitor/ProgressMonitorTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *   itemis AG - initial API and implementation
  */
@@ -20,10 +20,10 @@
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResource;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceFactoryImpl;
 import org.eclipse.rmf.tests.serialization.model.nodes.NodesPackage;
 import org.eclipse.rmf.tests.serialization.util.LoadSaveUtil;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResource;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceFactoryImpl;
 import org.junit.Before;
 import org.junit.Test;
 
diff --git a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/robustness/LoadPatternAttribute0100RobustnessTests.java b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/robustness/LoadPatternAttribute0100RobustnessTests.java
index 7a56c28..1e9fec0 100644
--- a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/robustness/LoadPatternAttribute0100RobustnessTests.java
+++ b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/robustness/LoadPatternAttribute0100RobustnessTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *   itemis AG - initial API and implementation
  */
@@ -22,11 +22,11 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.xmi.FeatureNotFoundException;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceFactoryImpl;
 import org.eclipse.rmf.tests.serialization.model.nodes.Node;
 import org.eclipse.rmf.tests.serialization.model.nodes.NodesPackage;
 import org.eclipse.rmf.tests.serialization.util.AbstractTestCase;
 import org.eclipse.rmf.tests.serialization.util.LoadSaveUtil;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceFactoryImpl;
 import org.junit.Before;
 import org.junit.Test;
 
diff --git a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/save/AbstractSaveTestCase.java b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/save/AbstractSaveTestCase.java
index d66415a..2528cd1 100644
--- a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/save/AbstractSaveTestCase.java
+++ b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/save/AbstractSaveTestCase.java
@@ -23,9 +23,9 @@
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceFactoryImpl;
 import org.eclipse.rmf.tests.serialization.model.nodes.Node;
 import org.eclipse.rmf.tests.serialization.util.AbstractTestCase;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceFactoryImpl;
 import org.junit.Before;
 import org.xml.sax.InputSource;
 
diff --git a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/save/BasicSaveTests.java b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/save/BasicSaveTests.java
index e703a05..f698392 100644
--- a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/save/BasicSaveTests.java
+++ b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/save/BasicSaveTests.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *   itemis AG - initial API and implementation
  */
@@ -1244,8 +1244,7 @@
 			assertEquals("node", xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-0100-MANY-REF[1]", root, XPathConstants.STRING));
 			assertEquals("", xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-0100-MANY-REF[1]/@xsi:type", root, XPathConstants.STRING));
 			assertEquals("subNode", xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-0100-MANY-REF[2]", root, XPathConstants.STRING));
-			assertEquals("nodes:SUB-NODE",
-					xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-0100-MANY-REF[2]/@xsi:type", root, XPathConstants.STRING));
+			assertEquals("SUB-NODE", xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-0100-MANY-REF[2]/@TYPE", root, XPathConstants.STRING));
 
 		} catch (Exception ex) {
 			ex.printStackTrace();
diff --git a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/save/CustomNamespacePrefixSaveTests.java b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/save/CustomNamespacePrefixSaveTests.java
index 5df9a32..0d1ed10 100644
--- a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/save/CustomNamespacePrefixSaveTests.java
+++ b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/save/CustomNamespacePrefixSaveTests.java
@@ -21,7 +21,6 @@
 
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResource;
 import org.eclipse.rmf.tests.serialization.model.extnodes.ExtNodesFactory;
 import org.eclipse.rmf.tests.serialization.model.extnodes.ExtNodesPackage;
 import org.eclipse.rmf.tests.serialization.model.extnodes.ExtendedNode;
@@ -29,6 +28,7 @@
 import org.eclipse.rmf.tests.serialization.model.nodes.Node;
 import org.eclipse.rmf.tests.serialization.model.nodes.NodesFactory;
 import org.eclipse.rmf.tests.serialization.model.nodes.NodesPackage;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResource;
 import org.junit.Test;
 import org.w3c.dom.NodeList;
 
diff --git a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/util/AbstractTestCase.java b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/util/AbstractTestCase.java
index abead8c..3d5175e 100644
--- a/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/util/AbstractTestCase.java
+++ b/org.eclipse.rmf.tests.serialization/src/org/eclipse/rmf/tests/serialization/util/AbstractTestCase.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *   itemis AG - initial API and implementation
  */
@@ -22,7 +22,7 @@
 import org.eclipse.emf.ecore.resource.URIConverter;
 import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
 import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceSetImpl;
+import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingResourceSetImpl;
 import org.junit.Before;
 
 @SuppressWarnings("nls")
diff --git a/specifications/reqif/Search.reqif b/specifications/reqif/Search.reqif
new file mode 100644
index 0000000..bf52bc8
--- /dev/null
+++ b/specifications/reqif/Search.reqif
@@ -0,0 +1,2049 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<REQ-IF xmlns="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd" xmlns:configuration="http://eclipse.org/rmf/pror/toolextensions/1.0" xmlns:headline="http://pror.org/presentation/headline" xmlns:xhtml="http://www.w3.org/1999/xhtml">
+  <THE-HEADER>
+    <REQ-IF-HEADER IDENTIFIER="rmf-e82c1946-823d-40de-8c66-eedcbbbca843">
+      <COMMENT>Created by: jastram</COMMENT>
+      <CREATION-TIME>2014-12-04T08:14:06.220+01:00</CREATION-TIME>
+      <REQ-IF-TOOL-ID>ProR (http://pror.org)</REQ-IF-TOOL-ID>
+      <REQ-IF-VERSION>1.0.1</REQ-IF-VERSION>
+      <SOURCE-TOOL-ID>ProR (http://pror.org)</SOURCE-TOOL-ID>
+    </REQ-IF-HEADER>
+  </THE-HEADER>
+  <CORE-CONTENT>
+    <REQ-IF-CONTENT>
+      <DATATYPES>
+        <DATATYPE-DEFINITION-STRING IDENTIFIER="_Ii3vI3uFEeS1tthkGDp8zA" LAST-CHANGE="2014-12-04T08:14:06.220+01:00" LONG-NAME="T_String32k" MAX-LENGTH="32000"/>
+        <DATATYPE-DEFINITION-STRING IDENTIFIER="_NO484HuGEeS48tWDFoyOsw" LAST-CHANGE="2014-12-04T08:21:42.499+01:00" LONG-NAME="T_ChapterName"/>
+        <DATATYPE-DEFINITION-XHTML IDENTIFIER="_wPv3kHuGEeS48tWDFoyOsw" LAST-CHANGE="2014-12-04T08:25:39.770+01:00" LONG-NAME="T_XHTML"/>
+        <DATATYPE-DEFINITION-DATE IDENTIFIER="_QcQsMH7FEeS-kbr2itXc9A" LAST-CHANGE="2014-12-08T11:30:36.777+01:00" LONG-NAME="T_Date"/>
+        <DATATYPE-DEFINITION-INTEGER IDENTIFIER="_KyTGQH_GEeSYdsnACTHR5g" LAST-CHANGE="2014-12-09T18:09:40.169+01:00" LONG-NAME="T_Integer"/>
+        <DATATYPE-DEFINITION-REAL IDENTIFIER="_MlKyEH_GEeSYdsnACTHR5g" LAST-CHANGE="2014-12-09T18:09:53.379+01:00" LONG-NAME="T_Real"/>
+        <DATATYPE-DEFINITION-ENUMERATION IDENTIFIER="_iNIiMYRqEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T15:56:18.817+01:00" LONG-NAME="T_Status">
+          <SPECIFIED-VALUES>
+            <ENUM-VALUE IDENTIFIER="_p2YykIRqEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T15:57:10.829+01:00" LONG-NAME="Ready">
+              <PROPERTIES>
+                <EMBEDDED-VALUE/>
+              </PROPERTIES>
+            </ENUM-VALUE>
+            <ENUM-VALUE IDENTIFIER="_knXwAIRqEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T15:56:36.997+01:00" LONG-NAME="In progress">
+              <PROPERTIES>
+                <EMBEDDED-VALUE/>
+              </PROPERTIES>
+            </ENUM-VALUE>
+            <ENUM-VALUE IDENTIFIER="_oM33EIRqEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T15:56:58.984+01:00" LONG-NAME="Done">
+              <PROPERTIES>
+                <EMBEDDED-VALUE/>
+              </PROPERTIES>
+            </ENUM-VALUE>
+            <ENUM-VALUE IDENTIFIER="_eqI4YIRxEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:45:58.503+01:00" LONG-NAME="Won't implement">
+              <PROPERTIES>
+                <EMBEDDED-VALUE/>
+              </PROPERTIES>
+            </ENUM-VALUE>
+          </SPECIFIED-VALUES>
+        </DATATYPE-DEFINITION-ENUMERATION>
+        <DATATYPE-DEFINITION-BOOLEAN IDENTIFIER="_gnfjgIX-EeSrC7YZbjRQ5g" LAST-CHANGE="2014-12-17T16:08:05.370+01:00" LONG-NAME="T_Boolean"/>
+      </DATATYPES>
+      <SPEC-TYPES>
+        <SPECIFICATION-TYPE IDENTIFIER="_Ii3vJnuFEeS1tthkGDp8zA" LAST-CHANGE="2014-12-04T08:14:06.220+01:00" LONG-NAME="Specification Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_Ii3vJ3uFEeS1tthkGDp8zA" LAST-CHANGE="2014-12-04T08:14:06.220+01:00" LONG-NAME="Description">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_Ii3vI3uFEeS1tthkGDp8zA</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+          </SPEC-ATTRIBUTES>
+        </SPECIFICATION-TYPE>
+        <SPEC-OBJECT-TYPE IDENTIFIER="_RdybsHuFEeS1tthkGDp8zA" LAST-CHANGE="2014-12-04T08:15:06.090+01:00" LONG-NAME="Requirement Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_RdybsXuFEeS1tthkGDp8zA" LONG-NAME="ID">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_Ii3vI3uFEeS1tthkGDp8zA</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_RdybsnuFEeS1tthkGDp8zA" LONG-NAME="ReqIF.Text">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_Ii3vI3uFEeS1tthkGDp8zA</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_KcpewHuGEeS48tWDFoyOsw" LAST-CHANGE="2014-12-04T08:21:25.168+01:00" LONG-NAME="ReqIF.ChapterName">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_NO484HuGEeS48tWDFoyOsw</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+            <ATTRIBUTE-DEFINITION-ENUMERATION IDENTIFIER="_s29AkIRqEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T15:57:31.283+01:00" LONG-NAME="Status">
+              <TYPE>
+                <DATATYPE-DEFINITION-ENUMERATION-REF>_iNIiMYRqEeSo3fPbjIH42w</DATATYPE-DEFINITION-ENUMERATION-REF>
+              </TYPE>
+              <DEFAULT-VALUE>
+                <ATTRIBUTE-VALUE-ENUMERATION>
+                  <DEFINITION>
+                    <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+                  </DEFINITION>
+                </ATTRIBUTE-VALUE-ENUMERATION>
+              </DEFAULT-VALUE>
+            </ATTRIBUTE-DEFINITION-ENUMERATION>
+            <ATTRIBUTE-DEFINITION-INTEGER IDENTIFIER="_OjmY8IU9EeSrC7YZbjRQ5g" LAST-CHANGE="2014-12-16T17:04:29.629+01:00" LONG-NAME="Integer">
+              <TYPE>
+                <DATATYPE-DEFINITION-INTEGER-REF>_KyTGQH_GEeSYdsnACTHR5g</DATATYPE-DEFINITION-INTEGER-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-INTEGER>
+            <ATTRIBUTE-DEFINITION-BOOLEAN IDENTIFIER="_iqVlAIX-EeSrC7YZbjRQ5g" LAST-CHANGE="2014-12-17T16:08:19.384+01:00" LONG-NAME="Boolean">
+              <TYPE>
+                <DATATYPE-DEFINITION-BOOLEAN-REF>_gnfjgIX-EeSrC7YZbjRQ5g</DATATYPE-DEFINITION-BOOLEAN-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-BOOLEAN>
+            <ATTRIBUTE-DEFINITION-REAL IDENTIFIER="_pUFUoYYIEeSPf9NLiwbWcw" LAST-CHANGE="2014-12-17T17:20:39.608+01:00" LONG-NAME="Real">
+              <TYPE>
+                <DATATYPE-DEFINITION-REAL-REF>_MlKyEH_GEeSYdsnACTHR5g</DATATYPE-DEFINITION-REAL-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-REAL>
+            <ATTRIBUTE-DEFINITION-DATE IDENTIFIER="_hVqvwYYMEeScj_gsSBA4Mw" LAST-CHANGE="2014-12-17T17:48:23.682+01:00" LONG-NAME="Due">
+              <TYPE>
+                <DATATYPE-DEFINITION-DATE-REF>_QcQsMH7FEeS-kbr2itXc9A</DATATYPE-DEFINITION-DATE-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-DATE>
+          </SPEC-ATTRIBUTES>
+        </SPEC-OBJECT-TYPE>
+        <SPEC-OBJECT-TYPE IDENTIFIER="_rGI5cHuGEeS48tWDFoyOsw" LAST-CHANGE="2014-12-04T08:25:02.124+01:00" LONG-NAME="Information Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-XHTML IDENTIFIER="_tdtNwHuGEeS48tWDFoyOsw" LAST-CHANGE="2014-12-04T08:25:19.394+01:00" LONG-NAME="ReqIF.Text">
+              <TYPE>
+                <DATATYPE-DEFINITION-XHTML-REF>_wPv3kHuGEeS48tWDFoyOsw</DATATYPE-DEFINITION-XHTML-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-XHTML>
+          </SPEC-ATTRIBUTES>
+        </SPEC-OBJECT-TYPE>
+        <SPEC-RELATION-TYPE IDENTIFIER="_tHrFwIFMEeSAeqAN7wsrbQ" LAST-CHANGE="2014-12-11T16:45:14.128+01:00" LONG-NAME="Link Type">
+          <SPEC-ATTRIBUTES>
+            <ATTRIBUTE-DEFINITION-STRING IDENTIFIER="_u7mhgIFMEeSAeqAN7wsrbQ" LAST-CHANGE="2014-12-11T16:45:18.638+01:00" LONG-NAME="ReqIF.Text">
+              <TYPE>
+                <DATATYPE-DEFINITION-STRING-REF>_Ii3vI3uFEeS1tthkGDp8zA</DATATYPE-DEFINITION-STRING-REF>
+              </TYPE>
+            </ATTRIBUTE-DEFINITION-STRING>
+          </SPEC-ATTRIBUTES>
+        </SPEC-RELATION-TYPE>
+      </SPEC-TYPES>
+      <SPEC-OBJECTS>
+        <SPEC-OBJECT IDENTIFIER="_Rd7loHuFEeS1tthkGDp8zA" LAST-CHANGE="2014-12-08T13:48:00.220+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="While there is very basic search support available, it is currently not suitable for professional work.  The objective of this project is to improve this, as follows:">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_ReHL0HuFEeS1tthkGDp8zA" LAST-CHANGE="2014-12-08T14:20:41.356+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="The following is a proposal on how the interface could look like, based on best practices in user interface design.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+            <ATTRIBUTE-VALUE-INTEGER THE-VALUE="1">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-INTEGER-REF>_OjmY8IU9EeSrC7YZbjRQ5g</ATTRIBUTE-DEFINITION-INTEGER-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-INTEGER>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_ReRj4HuFEeS1tthkGDp8zA" LAST-CHANGE="2015-01-02T12:29:02.928+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Spec-Nav">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsXuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Within a Specification, users can navigate between search results via corresponding buttons in the toolbar, i.e. .  Note that this will not cycle through elements outside the specification (e.g. elements in other Specifications or SpecTypes).">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_Reb78HuFEeS1tthkGDp8zA" LAST-CHANGE="2014-12-07T16:56:31.782+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Result-Nav">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsXuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="The result of a search will be shown in a separate view, as shown in the mockup (implementation appearance may vary).">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_bBoUAHuGEeS48tWDFoyOsw" LAST-CHANGE="2014-12-08T14:56:30.927+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="User-Friendly Searcing Title">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_xpa_cH4nEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-08T11:26:31.234+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-XHTML>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-XHTML-REF>_tdtNwHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-XHTML-REF>
+              </DEFINITION>
+              <THE-VALUE>
+                <xhtml:div><xhtml:p style="text-align: left;"><xhtml:object data="Search/search-mockup.png" style="max-width:100%;" type="image/png">This is what will show if the image can't be displayed.</xhtml:object></xhtml:p></xhtml:div>
+              </THE-VALUE>
+            </ATTRIBUTE-VALUE-XHTML>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_rGI5cHuGEeS48tWDFoyOsw</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_Ixr7gH4oEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:45:52.846+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Search-UI">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_UjFF8H4oEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:49:42.136+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Note that this is a non-functional mock-up.  The final interface will differ in appearance.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_fQwJkH4oEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:48:57.648+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="The final Details regarding the conditions are found after this table in “Search Conditions” below. interface will differ in appearance.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_jpJtMH4oEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:48:58.371+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="The search interface allows the user to to configure a number of “conditions”.  These relate either to internal attributes (e.g. internal ID) or attribute values (those attributes that the user creates), with typical type-specific relations: equal, contains, etc.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_leVtMH4oEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:49:10.659+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="All conditions are combined via “and” or “or”.  More complex relationships are not supported in this first implementation. Details regarding the conditions are found after this table in “Search Conditions” below.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_wPuMIH4oEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:50:22.946+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Spec-Nav">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_XUBuIH4pEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:55:36.087+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-XHTML>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-XHTML-REF>_tdtNwHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-XHTML-REF>
+              </DEFINITION>
+              <THE-VALUE>
+                <xhtml:div><xhtml:p style="text-align: left;"><xhtml:object data="Search/arrows.png" style="max-width:100%;" type="image/png">This is what will show if the image can't be displayed.</xhtml:object></xhtml:p></xhtml:div>
+              </THE-VALUE>
+            </ATTRIBUTE-VALUE-XHTML>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_rGI5cHuGEeS48tWDFoyOsw</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_f8jqMH4pEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:55:43.059+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Result-Nav">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_nTc_QH4pEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:56:46.238+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="In will show all matches, including those that are not accessible from the Specification Editor.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_pb22MH4pEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:56:46.739+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="The View will exhibit the following behavior:">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_qrvwwH4pEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:56:55.116+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Selecting any element will show its properties in the Properties View, where it can be edited.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_r1rNQH4pEeSJSKCeNoEp0g" LAST-CHANGE="2015-01-02T12:29:13.038+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Double-Clicking on a SpecHierarchy will open the corresponding Specification, with the clicked SpecHierarchy selected.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_wWlzsH4pEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:57:59.375+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-XHTML>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-XHTML-REF>_tdtNwHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-XHTML-REF>
+              </DEFINITION>
+              <THE-VALUE>
+                <xhtml:div><xhtml:p style="text-align: left;"><xhtml:object data="Search/search-result.png" style="max-width:100%;" type="image/png">This is what will show if the image can't be displayed.</xhtml:object></xhtml:p></xhtml:div>
+              </THE-VALUE>
+            </ATTRIBUTE-VALUE-XHTML>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_rGI5cHuGEeS48tWDFoyOsw</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_AIIZ0H4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-15T16:27:09.053+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Search-Conditions">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_LsaVUH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:00:34.377+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="In the following, we outline the various Conditions for the search box.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_MKVncH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:01:06.345+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="The Scope of attributes can be “internal” or “value”.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_QMLsQH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:01:06.819+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="  Internal attributes are those defined by the ReqIF standard, e.g. Identifiable.identifier.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_Rm0eQH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:01:16.324+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Values are specific instances of Attributes that were set up by the user. They are identified in the form SPECTYPE.ATTRIBUTENAME.  Thus, as users create new SpecTypes and their attributes, so will the list of choices grow.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_U0NAQH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:01:37.860+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="The available criteria are determined by the Type.  We can class multiple attributes in one type (e.g. integer and real are both of type NUM).">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_V1xyAH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:01:44.736+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="If an attribute is null or does not exist, then it is treated as if it was empty.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_mrWoAH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:03:37.728+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Identifiable.identifier (STRING): Internal attribute&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_oPR44H4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:04:04.413+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Identifiable.lastChange (DATE): Internal attribute">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_riumoH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:04:10.378+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Identifiable.desc (STRING): Internal attribute">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_uOb-8H4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:04:28.383+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Identifiable.longName (STRING) Internal attribute&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_wcpi8H4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:04:43.295+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="AttributeValueBoolean (BOOL): Value">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_yqNmsH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:04:58.139+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="AttributeValueDate (DATE): Value">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_0rNOEH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:05:11.665+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="AttributeValueEnumeration (ENUM): Value">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_3VBI8H4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:05:29.471+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="AttributeValueInteger (NUM): Value">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_5wNZAH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:05:56.386+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="AttributeValueReal (NUM): Value">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_8WllYH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:06:03.189+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="AttributeValueString (STRING): Value">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_-gKhAH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:06:17.616+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="AttributeValueXHTML (XHTML): Value">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_A4zzYH4rEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:06:33.622+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="The following table describes the various types.  Most types are straight forward, except XHTML.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_CPt78H4rEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:06:42.735+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="The XHTML operation is applied to the raw XHTML, including all tags (this allows searching for embedded URLs, for instance).  There is the additional option of “regexp plain”. In that case, the regular expression is applied to the plain text, with all tags stripped out.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_Dug1MH4rEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:06:52.675+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="NOTE: We are considering to introduce a NEGATION flag for all conditions.  This would reduce the number of selectors, but of course not the number of overall options.">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_eqI4YIRxEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_1XObsIRuEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:27:09.035+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Search-Conditions Interface">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_7Xf8EIRuEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:29:49.296+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="String">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_9P0voIRuEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:28:00.017+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="equal:one text field (if empty: false)">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_BUYKMIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:28:29.266+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="not equal: one text field (if empty: true)&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_D_z1sIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:28:47.243+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="contains: one text field (if empty: false)&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_GUXSQIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:29:02.820+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="not contains: one text field (if empty: true)">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_I0jXEIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:29:19.617+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="regexp: one text field (if empty: regexp applied to empty string)&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_NPWucIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:32:06.719+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Date">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_P6ISoIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:30:01.717+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="is: one date selector (if empty: false)&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_Tz2WMIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:30:33.363+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="is not: one date selector (if empty: true)&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_YhH9oIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:31:04.954+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="between: two date selectors (if empty: false)&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_apgmcIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:31:19.255+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="before: one date selector (if empty: false)&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_ftZ-IIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:31:53.218+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="after: one date selector (if empty: false)">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_ht7EYIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:32:35.285+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Bool">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_jY7NoIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:32:15.567+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="is: dropwdown: true/false (if empty: false)&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_l-apMIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:34:37.137+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Number">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_qYF_MIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:33:01.426+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="is: one number field (if empty: false)">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_updGsIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:33:33.467+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="is not: one number field (if empty: true)">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_xhUrsIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:33:52.747+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="between: two number fields (if empty: false)">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_z9RJsIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:34:09.098+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="greater: one number field (if empty: false)">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_2QODwIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:34:24.508+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="smaller: one number field (if empty: false)">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_4IhCIIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:36:01.253+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="XHTML">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_5837sIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:34:47.704+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="contains: one text field (if empty: false)">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_8qk4EIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:35:07.537+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="not contains: one text field (if empty: true)">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="__MW4UIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:35:24.501+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="regexp: one text field (if empty: regexp applied to empty string)">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_CRnZEIRwEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:35:45.185+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="regexp plain: one text field (if empty: regexp applied to empty string)">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_EqsJQIRwEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:36:01.236+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Enum">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_G3v2sIRwEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:36:12.940+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="equal: multiple choice (if empty: false, unless empty)&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_Ka83sIRwEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:36:39.851+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="not equal: multiple choice (if empty: true, unless empty)&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_MrsyUIRwEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:36:55.028+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="contains all: multiple choice (if empty: false, unless empty)&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_PGUaoIRwEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:37:11.242+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="contains any: multiple choice (if emtpy: false, unless empty)&#xA;">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_GvRwkIUHEeSBv4sQQMMdsA" LAST-CHANGE="2014-12-16T10:37:09.141+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Documentation">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_IjTS8IUHEeSBv4sQQMMdsA" LAST-CHANGE="2014-12-16T10:37:19.371+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Context-Sensitive Integration">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_KU82wIUHEeSBv4sQQMMdsA" LAST-CHANGE="2014-12-16T10:37:33.228+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Help Content">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_p2YykIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_baq2AYUREeScH7zcd23EKQ" LAST-CHANGE="2014-12-16T11:51:02.876+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Operators for all">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_KcpewHuGEeS48tWDFoyOsw</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_daicAIUREeScH7zcd23EKQ" LAST-CHANGE="2014-12-16T13:29:21.202+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="is set: If a non-null-value exists, return true.  Ignore default values (i.e. if there is a default value but no explicitly set one, return false).">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+        <SPEC-OBJECT IDENTIFIER="_kTHdYIUREeScH7zcd23EKQ" LAST-CHANGE="2014-12-16T13:29:23.448+01:00">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="is not set: return true only if the attribute exisits, but is not set (irrespective of default value).">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_RdybsnuFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+            <ATTRIBUTE-VALUE-ENUMERATION>
+              <VALUES>
+                <ENUM-VALUE-REF>_oM33EIRqEeSo3fPbjIH42w</ENUM-VALUE-REF>
+              </VALUES>
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-ENUMERATION-REF>_s29AkIRqEeSo3fPbjIH42w</ATTRIBUTE-DEFINITION-ENUMERATION-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-ENUMERATION>
+          </VALUES>
+          <TYPE>
+            <SPEC-OBJECT-TYPE-REF>_RdybsHuFEeS1tthkGDp8zA</SPEC-OBJECT-TYPE-REF>
+          </TYPE>
+        </SPEC-OBJECT>
+      </SPEC-OBJECTS>
+      <SPEC-RELATIONS/>
+      <SPECIFICATIONS>
+        <SPECIFICATION IDENTIFIER="_Ii3vKnuFEeS1tthkGDp8zA" LAST-CHANGE="2014-12-04T08:14:06.220+01:00" LONG-NAME="Specification Document">
+          <VALUES>
+            <ATTRIBUTE-VALUE-STRING THE-VALUE="Requirements Document">
+              <DEFINITION>
+                <ATTRIBUTE-DEFINITION-STRING-REF>_Ii3vJ3uFEeS1tthkGDp8zA</ATTRIBUTE-DEFINITION-STRING-REF>
+              </DEFINITION>
+            </ATTRIBUTE-VALUE-STRING>
+          </VALUES>
+          <TYPE>
+            <SPECIFICATION-TYPE-REF>_Ii3vJnuFEeS1tthkGDp8zA</SPECIFICATION-TYPE-REF>
+          </TYPE>
+          <CHILDREN>
+            <SPEC-HIERARCHY IDENTIFIER="_bB2WcHuGEeS48tWDFoyOsw" LAST-CHANGE="2014-12-04T08:23:14.270+01:00">
+              <OBJECT>
+                <SPEC-OBJECT-REF>_bBoUAHuGEeS48tWDFoyOsw</SPEC-OBJECT-REF>
+              </OBJECT>
+              <CHILDREN>
+                <SPEC-HIERARCHY IDENTIFIER="_ReFWoHuFEeS1tthkGDp8zA" LAST-CHANGE="2014-12-04T08:24:04.425+01:00">
+                  <OBJECT>
+                    <SPEC-OBJECT-REF>_Rd7loHuFEeS1tthkGDp8zA</SPEC-OBJECT-REF>
+                  </OBJECT>
+                </SPEC-HIERARCHY>
+                <SPEC-HIERARCHY IDENTIFIER="_Ix2TkH4oEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:45:52.847+01:00">
+                  <OBJECT>
+                    <SPEC-OBJECT-REF>_Ixr7gH4oEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                  </OBJECT>
+                  <CHILDREN>
+                    <SPEC-HIERARCHY IDENTIFIER="_ReQVwHuFEeS1tthkGDp8zA" LAST-CHANGE="2014-12-07T16:46:13.912+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_ReHL0HuFEeS1tthkGDp8zA</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_xpl-kH4nEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:50:56.983+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_xpa_cH4nEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_UjR6QH4oEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:47:17.070+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_UjFF8H4oEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_fQ7vwH4oEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:48:28.969+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_fQwJkH4oEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_jpTeMH4oEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:48:58.371+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_jpJtMH4oEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_legFQH4oEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:49:10.659+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_leVtMH4oEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                  </CHILDREN>
+                </SPEC-HIERARCHY>
+                <SPEC-HIERARCHY IDENTIFIER="_wP81oH4oEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:50:22.946+01:00">
+                  <OBJECT>
+                    <SPEC-OBJECT-REF>_wPuMIH4oEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                  </OBJECT>
+                  <CHILDREN>
+                    <SPEC-HIERARCHY IDENTIFIER="_Reat0HuFEeS1tthkGDp8zA" LAST-CHANGE="2014-12-07T16:54:31.540+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_ReRj4HuFEeS1tthkGDp8zA</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_XUNUUH4pEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:54:41.918+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_XUBuIH4pEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                  </CHILDREN>
+                </SPEC-HIERARCHY>
+                <SPEC-HIERARCHY IDENTIFIER="_f8uCQH4pEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:55:43.059+01:00">
+                  <OBJECT>
+                    <SPEC-OBJECT-REF>_f8jqMH4pEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                  </OBJECT>
+                  <CHILDREN>
+                    <SPEC-HIERARCHY IDENTIFIER="_ReoJMHuFEeS1tthkGDp8zA" LAST-CHANGE="2014-12-07T16:56:05.298+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_Reb78HuFEeS1tthkGDp8zA</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_wW2SYH4pEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:57:07.408+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_wWlzsH4pEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_nTolcH4pEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:56:32.436+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_nTc_QH4pEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_pcAnMH4pEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:56:46.739+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_pb22MH4pEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_qr6v4H4pEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:56:55.116+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_qrvwwH4pEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_r12MYH4pEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:57:02.868+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_r1rNQH4pEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                  </CHILDREN>
+                </SPEC-HIERARCHY>
+                <SPEC-HIERARCHY IDENTIFIER="_AITY8H4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T16:59:47.890+01:00">
+                  <OBJECT>
+                    <SPEC-OBJECT-REF>_AIIZ0H4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                  </OBJECT>
+                  <CHILDREN>
+                    <SPEC-HIERARCHY IDENTIFIER="_LsmikH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:00:34.377+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_LsaVUH4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_MKfYcH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:00:39.783+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_MKVncH4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_QMVdQH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:01:06.820+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_QMLsQH4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_Rm-PQH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:01:16.324+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_Rm0eQH4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_U0cQ0H4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:01:37.860+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_U0NAQH4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_V19YMH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:01:44.736+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_V1xyAH4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_mriOMH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:03:37.728+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_mrWoAH4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_oPcQ8H4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:03:48.206+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_oPR44H4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_ri6z4H4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:04:10.378+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_riumoH4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_uOmXAH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:04:28.383+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_uOb-8H4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_wc1JIH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:04:43.295+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_wcpi8H4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_yqZM4H4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:04:58.139+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_yqNmsH4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_0rYNMH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:05:11.665+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_0rNOEH4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_3VMvIH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:05:29.471+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_3VBI8H4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_5wWi8H4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:05:45.744+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_5wNZAH4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_8WxyoH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:06:03.189+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_8WllYH4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_-gU5EH4qEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:06:17.616+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_-gKhAH4qEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_A489UH4rEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:06:33.622+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_A4zzYH4rEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_CP4UAH4rEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:06:42.735+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_CPt78H4rEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_DutpgH4rEeSJSKCeNoEp0g" LAST-CHANGE="2014-12-07T17:06:52.675+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_Dug1MH4rEeSJSKCeNoEp0g</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                  </CHILDREN>
+                </SPEC-HIERARCHY>
+                <SPEC-HIERARCHY IDENTIFIER="_ba77wIUREeScH7zcd23EKQ" LAST-CHANGE="2014-12-16T11:51:02.876+01:00">
+                  <OBJECT>
+                    <SPEC-OBJECT-REF>_baq2AYUREeScH7zcd23EKQ</SPEC-OBJECT-REF>
+                  </OBJECT>
+                  <CHILDREN>
+                    <SPEC-HIERARCHY IDENTIFIER="_dazhwIUREeScH7zcd23EKQ" LAST-CHANGE="2014-12-16T11:51:14.450+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_daicAIUREeScH7zcd23EKQ</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_kTScgIUREeScH7zcd23EKQ" LAST-CHANGE="2014-12-16T11:52:02.486+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_kTHdYIUREeScH7zcd23EKQ</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                  </CHILDREN>
+                </SPEC-HIERARCHY>
+                <SPEC-HIERARCHY IDENTIFIER="_1XYMsIRuEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:27:09.035+01:00">
+                  <OBJECT>
+                    <SPEC-OBJECT-REF>_1XObsIRuEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                  </OBJECT>
+                  <CHILDREN>
+                    <SPEC-HIERARCHY IDENTIFIER="_7XulkIRuEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:27:47.337+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_7Xf8EIRuEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                      </OBJECT>
+                      <CHILDREN>
+                        <SPEC-HIERARCHY IDENTIFIER="_9QCyEIRuEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:28:00.017+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_9P0voIRuEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_BUhUIIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:28:29.267+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_BUYKMIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_D_9msIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:28:47.243+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_D_z1sIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_GUgcMIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:29:02.820+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_GUXSQIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_I0tvIIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:29:19.617+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_I0jXEIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                      </CHILDREN>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_NPlX8IRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:29:49.271+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_NPWucIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                      </OBJECT>
+                      <CHILDREN>
+                        <SPEC-HIERARCHY IDENTIFIER="_P6RckIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:30:01.717+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_P6ISoIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_Tz_gIIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:30:33.363+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_Tz2WMIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_YhRHkIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:31:04.954+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_YhH9oIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_apszsIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:31:19.255+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_apgmcIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_ftjvIIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:31:53.218+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_ftZ-IIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                      </CHILDREN>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_huKU8IRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:32:06.694+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_ht7EYIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                      </OBJECT>
+                      <CHILDREN>
+                        <SPEC-HIERARCHY IDENTIFIER="_jZGz0IRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:32:15.567+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_jY7NoIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                      </CHILDREN>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_l-loUIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:32:35.267+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_l-apMIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                      </OBJECT>
+                      <CHILDREN>
+                        <SPEC-HIERARCHY IDENTIFIER="_qYTakIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:33:01.426+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_qYF_MIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_upmQoIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:33:33.467+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_updGsIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_xhd1oIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:33:52.747+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_xhUrsIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_z9cv4IRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:34:09.099+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_z9RJsIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_2QXNsIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:34:24.508+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_2QODwIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                      </CHILDREN>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_4IqMEIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:34:37.122+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_4IhCIIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                      </OBJECT>
+                      <CHILDREN>
+                        <SPEC-HIERARCHY IDENTIFIER="_59F-IIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:34:47.704+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_5837sIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_8qta8IRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:35:07.537+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_8qk4EIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="__MhQYIRvEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:35:24.501+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>__MW4UIRvEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_CRv78IRwEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:35:45.185+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_CRnZEIRwEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                      </CHILDREN>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_Eq2hUIRwEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:36:01.236+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_EqsJQIRwEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                      </OBJECT>
+                      <CHILDREN>
+                        <SPEC-HIERARCHY IDENTIFIER="_G35nsIRwEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:36:12.940+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_G3v2sIRwEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_KbFakIRwEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:36:39.851+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_Ka83sIRwEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_Mr4_kIRwEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:36:55.029+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_MrsyUIRwEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                        <SPEC-HIERARCHY IDENTIFIER="_PGdkkIRwEeSo3fPbjIH42w" LAST-CHANGE="2014-12-15T16:37:11.242+01:00">
+                          <OBJECT>
+                            <SPEC-OBJECT-REF>_PGUaoIRwEeSo3fPbjIH42w</SPEC-OBJECT-REF>
+                          </OBJECT>
+                        </SPEC-HIERARCHY>
+                      </CHILDREN>
+                    </SPEC-HIERARCHY>
+                  </CHILDREN>
+                </SPEC-HIERARCHY>
+                <SPEC-HIERARCHY IDENTIFIER="_GvfzAIUHEeSBv4sQQMMdsA" LAST-CHANGE="2014-12-16T10:37:09.141+01:00">
+                  <OBJECT>
+                    <SPEC-OBJECT-REF>_GvRwkIUHEeSBv4sQQMMdsA</SPEC-OBJECT-REF>
+                  </OBJECT>
+                  <CHILDREN>
+                    <SPEC-HIERARCHY IDENTIFIER="_IjdrAIUHEeSBv4sQQMMdsA" LAST-CHANGE="2014-12-16T10:37:19.371+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_IjTS8IUHEeSBv4sQQMMdsA</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                    <SPEC-HIERARCHY IDENTIFIER="_KVGnwIUHEeSBv4sQQMMdsA" LAST-CHANGE="2014-12-16T10:37:33.228+01:00">
+                      <OBJECT>
+                        <SPEC-OBJECT-REF>_KU82wIUHEeSBv4sQQMMdsA</SPEC-OBJECT-REF>
+                      </OBJECT>
+                    </SPEC-HIERARCHY>
+                  </CHILDREN>
+                </SPEC-HIERARCHY>
+              </CHILDREN>
+            </SPEC-HIERARCHY>
+          </CHILDREN>
+        </SPECIFICATION>
+      </SPECIFICATIONS>
+    </REQ-IF-CONTENT>
+  </CORE-CONTENT>
+  <TOOL-EXTENSIONS>
+    <REQ-IF-TOOL-EXTENSION>
+      <configuration:ProrToolExtension>
+        <configuration:specViewConfigurations>
+          <configuration:ProrSpecViewConfiguration specification="_Ii3vKnuFEeS1tthkGDp8zA">
+            <configuration:columns>
+              <configuration:UnifiedColumn label="Main" width="393"/>
+              <configuration:Column label="Status"/>
+            </configuration:columns>
+            <configuration:leftHeaderColumn>
+              <configuration:Column label="Lead Header Column" width="59"/>
+            </configuration:leftHeaderColumn>
+          </configuration:ProrSpecViewConfiguration>
+          <configuration:ProrSpecViewConfiguration>
+            <configuration:columns>
+              <configuration:UnifiedColumn label="Main" width="458"/>
+            </configuration:columns>
+            <configuration:leftHeaderColumn>
+              <configuration:Column label="Lead Header Column" width="30"/>
+            </configuration:leftHeaderColumn>
+          </configuration:ProrSpecViewConfiguration>
+        </configuration:specViewConfigurations>
+        <configuration:generalConfiguration>
+          <configuration:ProrGeneralConfiguration>
+            <configuration:labelConfiguration>
+              <configuration:LabelConfiguration>
+                <defaultLabel>ID</defaultLabel>
+                <defaultLabel>ReqIF.ChapterName</defaultLabel>
+                <defaultLabel>ReqIF.Text</defaultLabel>
+                <defaultLabel>Description</defaultLabel>
+              </configuration:LabelConfiguration>
+            </configuration:labelConfiguration>
+          </configuration:ProrGeneralConfiguration>
+        </configuration:generalConfiguration>
+        <configuration:presentationConfigurations>
+          <configuration:ProrPresentationConfigurations>
+            <configuration:presentationConfigurations>
+              <headline:HeadlineConfiguration datatype="_NO484HuGEeS48tWDFoyOsw"/>
+            </configuration:presentationConfigurations>
+          </configuration:ProrPresentationConfigurations>
+        </configuration:presentationConfigurations>
+      </configuration:ProrToolExtension>
+    </REQ-IF-TOOL-EXTENSION>
+  </TOOL-EXTENSIONS>
+</REQ-IF>
diff --git a/specifications/reqif/Search/arrows.png b/specifications/reqif/Search/arrows.png
new file mode 100644
index 0000000..1293928
--- /dev/null
+++ b/specifications/reqif/Search/arrows.png
Binary files differ
diff --git a/specifications/reqif/Search/search-mockup.png b/specifications/reqif/Search/search-mockup.png
new file mode 100644
index 0000000..4322ece
--- /dev/null
+++ b/specifications/reqif/Search/search-mockup.png
Binary files differ
diff --git a/specifications/reqif/Search/search-result.png b/specifications/reqif/Search/search-result.png
new file mode 100644
index 0000000..eb790f2
--- /dev/null
+++ b/specifications/reqif/Search/search-result.png
Binary files differ
